diff options
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-handler.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 462 |
1 files changed, 393 insertions, 69 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 00067a566d4..f769693adb5 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -44,6 +44,7 @@ #include "gd-xdr.h" #include "cli-xdr.h" #include "rpc-clnt.h" +#include "gluster1.h" #include <sys/resource.h> #include <inttypes.h> @@ -61,7 +62,7 @@ static int -glusterd_friend_find_by_hostname (const char *hoststr, +glusterd_friend_find_by_hostname (const char *hoststr, glusterd_peerinfo_t **peerinfo) { int ret = -1; @@ -79,7 +80,7 @@ glusterd_friend_find_by_hostname (const char *hoststr, list_for_each_entry (entry, &priv->peers, uuid_list) { if (entry->hostname && (!strncmp (entry->hostname, hoststr, sizeof (entry->hostname)))) { - + gf_log ("glusterd", GF_LOG_NORMAL, "Friend %s found.. state: %d", hoststr, entry->state.state); @@ -92,7 +93,7 @@ glusterd_friend_find_by_hostname (const char *hoststr, } static int -glusterd_friend_find_by_uuid (uuid_t uuid, +glusterd_friend_find_by_uuid (uuid_t uuid, glusterd_peerinfo_t **peerinfo) { int ret = -1; @@ -108,7 +109,7 @@ glusterd_friend_find_by_uuid (uuid_t uuid, list_for_each_entry (entry, &priv->peers, uuid_list) { if (!uuid_compare (entry->uuid, uuid)) { - + gf_log ("glusterd", GF_LOG_NORMAL, "Friend found.. state: %d", entry->state.state); @@ -132,12 +133,12 @@ glusterd_handle_friend_req (rpcsvc_request_t *req, uuid_t uuid, char *hostname) ret = glusterd_friend_find (uuid, hostname, &peerinfo); if (ret) { - gf_log ("glusterd", GF_LOG_NORMAL, + gf_log ("glusterd", GF_LOG_NORMAL, "Unable to find peer"); } - ret = glusterd_friend_sm_new_event + ret = glusterd_friend_sm_new_event (GD_FRIEND_EVENT_RCVD_FRIEND_REQ, &event); if (ret) { @@ -169,7 +170,7 @@ glusterd_handle_friend_req (rpcsvc_request_t *req, uuid_t uuid, char *hostname) "ret = %d", event->event, ret); goto out; } - + ret = 0; out: @@ -184,11 +185,101 @@ out: } +static int +glusterd_handle_unfriend_req (rpcsvc_request_t *req, uuid_t uuid, char *hostname) +{ + int ret = -1; + glusterd_peerinfo_t *peerinfo = NULL; + glusterd_friend_sm_event_t *event = NULL; + glusterd_friend_req_ctx_t *ctx = NULL; + + ret = glusterd_friend_find (uuid, hostname, &peerinfo); + + if (ret) { + gf_log ("glusterd", GF_LOG_NORMAL, + "Unable to find peer"); + } + + ret = glusterd_friend_sm_new_event + (GD_FRIEND_EVENT_REMOVE_FRIEND, &event); + if (ret) { + gf_log ("", GF_LOG_ERROR, "event generation failed: %d", ret); + return ret; + } + + event->peerinfo = peerinfo; + + ctx = GF_CALLOC (1, sizeof (*ctx), gf_gld_mt_friend_req_ctx_t); + + if (!ctx) { + gf_log ("", GF_LOG_ERROR, "Unable to allocate memory"); + ret = -1; + goto out; + } + + uuid_copy (ctx->uuid, uuid); + if (hostname) + ctx->hostname = gf_strdup (hostname); + ctx->req = req; + + event->ctx = ctx; + + ret = glusterd_friend_sm_inject_event (event); + + if (ret) { + gf_log ("glusterd", GF_LOG_ERROR, "Unable to inject event %d, " + "ret = %d", event->event, ret); + goto out; + } + + ret = 0; + +out: + if (0 != ret) { + if (ctx && ctx->hostname) + GF_FREE (ctx->hostname); + if (ctx) + GF_FREE (ctx); + } + + return ret; +} + +static int +glusterd_add_peer_detail_to_dict (glusterd_peerinfo_t *peerinfo, + dict_t *friends, int count) +{ + + int ret = -1; + char key[256] = {0, }; + + GF_ASSERT (peerinfo); + GF_ASSERT (friends); + + snprintf (key, 256, "friend%d.uuid", count); + uuid_unparse (peerinfo->uuid, peerinfo->uuid_str); + ret = dict_set_str (friends, key, peerinfo->uuid_str); + if (ret) + goto out; + + snprintf (key, 256, "friend%d.hostname", count); + ret = dict_set_str (friends, key, peerinfo->hostname); + if (ret) + goto out; + + snprintf (key, 256, "friend%d.state", count); + ret = dict_set_int32 (friends, key, (int32_t)peerinfo->state.state); + if (ret) + goto out; + +out: + return ret; +} int -glusterd_friend_find (uuid_t uuid, char *hostname, +glusterd_friend_find (uuid_t uuid, char *hostname, glusterd_peerinfo_t **peerinfo) { int ret = -1; @@ -197,7 +288,7 @@ glusterd_friend_find (uuid_t uuid, char *hostname, ret = glusterd_friend_find_by_uuid (uuid, peerinfo); if (ret) { - gf_log ("glusterd", GF_LOG_NORMAL, + gf_log ("glusterd", GF_LOG_NORMAL, "Unable to find peer by uuid"); } else { goto out; @@ -238,7 +329,7 @@ glusterd_handle_cluster_lock (rpcsvc_request_t *req) } uuid_unparse (lock_req.uuid, str); - gf_log ("glusterd", GF_LOG_NORMAL, + gf_log ("glusterd", GF_LOG_NORMAL, "Received LOCK from uuid: %s", str); ret = glusterd_op_sm_new_event (GD_OP_EVENT_LOCK, &event); @@ -247,7 +338,7 @@ glusterd_handle_cluster_lock (rpcsvc_request_t *req) //respond back here return ret; } - + ctx = GF_CALLOC (1, sizeof (*ctx), gf_gld_mt_op_stage_ctx_t); if (!ctx) { @@ -274,11 +365,11 @@ glusterd_handle_stage_op (rpcsvc_request_t *req) char str[50]; gd1_mgmt_stage_op_req *stage_req = NULL; glusterd_op_sm_event_t *event = NULL; - glusterd_op_stage_ctx_t *ctx = NULL; + glusterd_op_stage_ctx_t *ctx = NULL; GF_ASSERT (req); - stage_req = GF_CALLOC (1, sizeof (*stage_req), + stage_req = GF_CALLOC (1, sizeof (*stage_req), gf_gld_mt_mop_stage_req_t); GF_ASSERT (stage_req); @@ -290,7 +381,7 @@ glusterd_handle_stage_op (rpcsvc_request_t *req) } uuid_unparse (stage_req->uuid, str); - gf_log ("glusterd", GF_LOG_NORMAL, + gf_log ("glusterd", GF_LOG_NORMAL, "Received stage op from uuid: %s", str); ret = glusterd_op_sm_new_event (GD_OP_EVENT_STAGE_OP, &event); @@ -299,7 +390,7 @@ glusterd_handle_stage_op (rpcsvc_request_t *req) //respond back here return ret; } - + ctx = GF_CALLOC (1, sizeof (*ctx), gf_gld_mt_op_stage_ctx_t); if (!ctx) { @@ -314,7 +405,7 @@ glusterd_handle_stage_op (rpcsvc_request_t *req) ret = glusterd_op_sm_inject_event (event); -out: +out: return ret; } @@ -325,7 +416,7 @@ glusterd_handle_commit_op (rpcsvc_request_t *req) char str[50]; glusterd_op_sm_event_t *event = NULL; gd1_mgmt_commit_op_req commit_req = {{0},}; - glusterd_op_commit_ctx_t *ctx = NULL; + glusterd_op_commit_ctx_t *ctx = NULL; GF_ASSERT (req); @@ -337,7 +428,7 @@ glusterd_handle_commit_op (rpcsvc_request_t *req) uuid_unparse (commit_req.uuid, str); - gf_log ("glusterd", GF_LOG_NORMAL, + gf_log ("glusterd", GF_LOG_NORMAL, "Received commit op from uuid: %s", str); ret = glusterd_op_sm_new_event (GD_OP_EVENT_COMMIT_OP, &event); @@ -346,7 +437,7 @@ glusterd_handle_commit_op (rpcsvc_request_t *req) //respond back here return ret; } - + ctx = GF_CALLOC (1, sizeof (*ctx), gf_gld_mt_op_commit_ctx_t); if (!ctx) { @@ -389,6 +480,67 @@ out: } int +glusterd_handle_cli_deprobe (rpcsvc_request_t *req) +{ + int32_t ret = -1; + gf1_cli_probe_req cli_req = {0,}; + + GF_ASSERT (req); + + if (!gf_xdr_to_cli_probe_req (req->msg[0], &cli_req)) { + //failed to decode msg; + req->rpc_err = GARBAGE_ARGS; + goto out; + } + + gf_log ("glusterd", GF_LOG_NORMAL, "Received CLI deprobe req"); + + + ret = glusterd_deprobe_begin (req, cli_req.hostname); + +out: + return ret; +} + +int +glusterd_handle_cli_list_friends (rpcsvc_request_t *req) +{ + int32_t ret = -1; + gf1_cli_peer_list_req cli_req = {0,}; + dict_t *dict = NULL; + + GF_ASSERT (req); + + if (!gf_xdr_to_cli_peer_list_req (req->msg[0], &cli_req)) { + //failed to decode msg; + req->rpc_err = GARBAGE_ARGS; + goto out; + } + + gf_log ("glusterd", GF_LOG_NORMAL, "Received cli list req"); + + if (cli_req.dict.dict_len) { + /* Unserialize the dictionary */ + dict = dict_new (); + + ret = dict_unserialize (cli_req.dict.dict_val, + cli_req.dict.dict_len, + &dict); + if (ret < 0) { + gf_log ("glusterd", GF_LOG_ERROR, + "failed to " + "unserialize req-buffer to dictionary"); + goto out; + } + } + + ret = glusterd_list_friends (req, dict, cli_req.flags); + +out: + return ret; +} + +int glusterd_handle_create_volume (rpcsvc_request_t *req) { int32_t ret = -1; @@ -409,7 +561,7 @@ glusterd_handle_create_volume (rpcsvc_request_t *req) /* Unserialize the dictionary */ dict = dict_new (); - ret = dict_unserialize (cli_req.bricks.bricks_val, + ret = dict_unserialize (cli_req.bricks.bricks_val, cli_req.bricks.bricks_len, &dict); if (ret < 0) { @@ -437,10 +589,10 @@ glusterd_op_lock_send_resp (rpcsvc_request_t *req, int32_t status) glusterd_get_uuid (&rsp.uuid); rsp.op_ret = status; - ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, + ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, gd_xdr_serialize_mgmt_cluster_lock_rsp); - gf_log ("glusterd", GF_LOG_NORMAL, + gf_log ("glusterd", GF_LOG_NORMAL, "Responded, ret: %d", ret); return 0; @@ -457,10 +609,10 @@ glusterd_op_unlock_send_resp (rpcsvc_request_t *req, int32_t status) rsp.op_ret = status; glusterd_get_uuid (&rsp.uuid); - ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, + ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, gd_xdr_serialize_mgmt_cluster_unlock_rsp); - gf_log ("glusterd", GF_LOG_NORMAL, + gf_log ("glusterd", GF_LOG_NORMAL, "Responded to unlock, ret: %d", ret); return ret; @@ -485,7 +637,7 @@ glusterd_handle_cluster_unlock (rpcsvc_request_t *req) uuid_unparse (unlock_req.uuid, str); - gf_log ("glusterd", GF_LOG_NORMAL, + gf_log ("glusterd", GF_LOG_NORMAL, "Received UNLOCK from uuid: %s", str); ret = glusterd_op_sm_new_event (GD_OP_EVENT_UNLOCK, &event); @@ -494,7 +646,7 @@ glusterd_handle_cluster_unlock (rpcsvc_request_t *req) //respond back here return ret; } - + ctx = GF_CALLOC (1, sizeof (*ctx), gf_gld_mt_op_lock_ctx_t); if (!ctx) { @@ -512,7 +664,7 @@ out: } int -glusterd_op_stage_send_resp (rpcsvc_request_t *req, +glusterd_op_stage_send_resp (rpcsvc_request_t *req, int32_t op, int32_t status) { @@ -524,17 +676,17 @@ glusterd_op_stage_send_resp (rpcsvc_request_t *req, glusterd_get_uuid (&rsp.uuid); rsp.op = op; - ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, + ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, gd_xdr_serialize_mgmt_stage_op_rsp); - gf_log ("glusterd", GF_LOG_NORMAL, + gf_log ("glusterd", GF_LOG_NORMAL, "Responded to stage, ret: %d", ret); return ret; } int -glusterd_op_commit_send_resp (rpcsvc_request_t *req, +glusterd_op_commit_send_resp (rpcsvc_request_t *req, int32_t op, int32_t status) { gd1_mgmt_commit_op_rsp rsp = {{0}, }; @@ -545,10 +697,10 @@ glusterd_op_commit_send_resp (rpcsvc_request_t *req, glusterd_get_uuid (&rsp.uuid); rsp.op = op; - ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, + ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, gd_xdr_serialize_mgmt_commit_op_rsp); - gf_log ("glusterd", GF_LOG_NORMAL, + gf_log ("glusterd", GF_LOG_NORMAL, "Responded to commit, ret: %d", ret); return ret; @@ -569,10 +721,10 @@ glusterd_handle_incoming_friend_req (rpcsvc_request_t *req) } uuid_unparse (friend_req.uuid, str); - gf_log ("glusterd", GF_LOG_NORMAL, + gf_log ("glusterd", GF_LOG_NORMAL, "Received probe from uuid: %s", str); - ret = glusterd_handle_friend_req (req, friend_req.uuid, + ret = glusterd_handle_friend_req (req, friend_req.uuid, friend_req.hostname); out: @@ -581,6 +733,32 @@ out: } int +glusterd_handle_incoming_unfriend_req (rpcsvc_request_t *req) +{ + int32_t ret = -1; + gd1_mgmt_friend_req friend_req = {{0},}; + char str[50]; + + GF_ASSERT (req); + if (!gd_xdr_to_mgmt_friend_req (req->msg[0], &friend_req)) { + //failed to decode msg; + req->rpc_err = GARBAGE_ARGS; + goto out; + } + uuid_unparse (friend_req.uuid, str); + + gf_log ("glusterd", GF_LOG_NORMAL, + "Received unfriend from uuid: %s", str); + + ret = glusterd_handle_unfriend_req (req, friend_req.uuid, + friend_req.hostname); + +out: + + return ret; +} + +int glusterd_handle_probe_query (rpcsvc_request_t *req) { int32_t ret = -1; @@ -604,7 +782,7 @@ glusterd_handle_probe_query (rpcsvc_request_t *req) uuid_unparse (probe_req.uuid, str); - gf_log ("glusterd", GF_LOG_NORMAL, + gf_log ("glusterd", GF_LOG_NORMAL, "Received probe from uuid: %s", str); @@ -615,10 +793,10 @@ glusterd_handle_probe_query (rpcsvc_request_t *req) uuid_copy (rsp.uuid, conf->uuid); rsp.hostname = gf_strdup (probe_req.hostname); - ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, + ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, gd_xdr_serialize_mgmt_probe_rsp); - gf_log ("glusterd", GF_LOG_NORMAL, + gf_log ("glusterd", GF_LOG_NORMAL, "Responded to %s, ret: %d", probe_req.hostname, ret); out: @@ -644,8 +822,8 @@ glusterd_handle_friend_req_resp (call_frame_t *frame, op_ret = rsp_hdr->rsp.op_ret; - gf_log ("glusterd", GF_LOG_NORMAL, - "Received %s from uuid: %s, host: %s", + gf_log ("glusterd", GF_LOG_NORMAL, + "Received %s from uuid: %s, host: %s", (op_ret)?"RJT":"ACC", str, rsp->hostname); ret = glusterd_friend_find (rsp->uuid, rsp->hostname, &peerinfo); @@ -654,7 +832,7 @@ glusterd_handle_friend_req_resp (call_frame_t *frame, GF_ASSERT (0); } - if (op_ret) + if (op_ret) event_type = GD_FRIEND_EVENT_RCVD_ACC; else event_type = GD_FRIEND_EVENT_RCVD_RJT; @@ -676,7 +854,7 @@ glusterd_handle_friend_req_resp (call_frame_t *frame, }*/ /*int -glusterd_handle_probe_resp (call_frame_t *frame, gf_hdr_common_t *rsp_hdr, +glusterd_handle_probe_resp (call_frame_t *frame, gf_hdr_common_t *rsp_hdr, size_t hdrlen) { gf_mop_probe_rsp_t *rsp = NULL; @@ -691,8 +869,8 @@ glusterd_handle_probe_resp (call_frame_t *frame, gf_hdr_common_t *rsp_hdr, rsp = gf_param (rsp_hdr); uuid_unparse (rsp->uuid, str); - gf_log ("glusterd", GF_LOG_NORMAL, - "Received probe resp from uuid: %s, host: %s", + gf_log ("glusterd", GF_LOG_NORMAL, + "Received probe resp from uuid: %s, host: %s", str, rsp->hostname); ret = glusterd_friend_find (rsp->uuid, rsp->hostname, &peerinfo); @@ -714,7 +892,7 @@ glusterd_handle_probe_resp (call_frame_t *frame, gf_hdr_common_t *rsp_hdr, GF_ASSERT (peerinfo->hostname); uuid_copy (peerinfo->uuid, rsp->uuid); - ret = glusterd_friend_sm_new_event + ret = glusterd_friend_sm_new_event (GD_FRIEND_EVENT_INIT_FRIEND_REQ, &event); if (ret) { @@ -870,11 +1048,11 @@ glusterd_xfer_cluster_lock_req (xlator_t *this, int32_t *lock_count) list_for_each_entry (peerinfo, &priv->peers, uuid_list) { GF_ASSERT (peerinfo); - if (peerinfo->state.state != GD_FRIEND_STATE_BEFRIENDED) + if (peerinfo->state.state != GD_FRIEND_STATE_BEFRIENDED) continue; - - ret = glusterd_submit_request (peerinfo, &req, dummy_frame, + + ret = glusterd_submit_request (peerinfo, &req, dummy_frame, prog, GD_MGMT_PROBE_QUERY, NULL, gd_xdr_from_mgmt_probe_req, this); @@ -926,13 +1104,13 @@ glusterd_xfer_cluster_unlock_req (xlator_t *this, int32_t *pending_count) list_for_each_entry (peerinfo, &priv->peers, uuid_list) { GF_ASSERT (peerinfo); - if (peerinfo->state.state != GD_FRIEND_STATE_BEFRIENDED) + if (peerinfo->state.state != GD_FRIEND_STATE_BEFRIENDED) continue; - + ret = glusterd_xfer (dummy_frame, this, peerinfo->trans, - GF_OP_TYPE_MOP_REQUEST, + GF_OP_TYPE_MOP_REQUEST, GF_MOP_CLUSTER_UNLOCK, hdr, hdrlen, NULL, 0, NULL); if (!ret) @@ -953,7 +1131,7 @@ unwind: int glusterd_friend_add (const char *hoststr, - glusterd_peer_state_t state, + glusterd_friend_sm_state_t state, uuid_t *uuid, struct rpc_clnt *rpc, glusterd_peerinfo_t **friend) @@ -987,7 +1165,7 @@ glusterd_friend_add (const char *hoststr, if (uuid) { uuid_copy (peerinfo->uuid, *uuid); - } + } if (hoststr) { @@ -1006,8 +1184,8 @@ glusterd_friend_add (const char *hoststr, gf_log ("glusterd", GF_LOG_NORMAL, "remote-port: %d", port_num); - //ret = dict_set_int32 (options, "remote-port", GLUSTERD_DEFAULT_PORT); - ret = dict_set_int32 (options, "remote-port", port_num); + //ret = dict_set_int32 (options, "remote-port", GLUSTERD_DEFAULT_PORT); + ret = dict_set_int32 (options, "remote-port", port_num); if (ret) goto out; @@ -1018,12 +1196,12 @@ glusterd_friend_add (const char *hoststr, rpc = rpc_clnt_init (&rpc_cfg, options, THIS->ctx, THIS->name); if (!rpc) { - gf_log ("glusterd", GF_LOG_ERROR, + gf_log ("glusterd", GF_LOG_ERROR, "rpc init failed for peer: %s!", hoststr); ret = -1; goto out; } - + ret = rpc_clnt_register_notify (rpc, glusterd_rpc_notify, peerinfo); @@ -1050,11 +1228,11 @@ glusterd_friend_probe (const char *hoststr) if (ret) { //We should not reach this state ideally GF_ASSERT (0); - goto out; + goto out; } - + ret = glusterd_xfer_probe_msg (peerinfo, THIS); - + out: return ret; }*/ @@ -1075,13 +1253,14 @@ glusterd_probe_begin (rpcsvc_request_t *req, const char *hoststr) if (ret) { gf_log ("glusterd", GF_LOG_NORMAL, "Unable to find peerinfo" " for host: %s", hoststr); - ret = glusterd_friend_add ((char *)hoststr, GD_PEER_STATE_NONE, + ret = glusterd_friend_add ((char *)hoststr, + GD_FRIEND_STATE_DEFAULT, NULL, NULL, &peerinfo); } - ret = glusterd_friend_sm_new_event + ret = glusterd_friend_sm_new_event (GD_FRIEND_EVENT_PROBE, &event); - + if (ret) { gf_log ("glusterd", GF_LOG_ERROR, "Unable to get new event"); return ret; @@ -1110,6 +1289,62 @@ glusterd_probe_begin (rpcsvc_request_t *req, const char *hoststr) return ret; } +int +glusterd_deprobe_begin (rpcsvc_request_t *req, const char *hoststr) +{ + int ret = -1; + glusterd_peerinfo_t *peerinfo = NULL; + glusterd_friend_sm_event_t *event = NULL; + glusterd_probe_ctx_t *ctx = NULL; + + GF_ASSERT (hoststr); + GF_ASSERT (req); + + ret = glusterd_friend_find (NULL, (char *)hoststr, &peerinfo); + + if (ret) { + gf_log ("glusterd", GF_LOG_NORMAL, "Unable to find peerinfo" + " for host: %s", hoststr); + goto out; + } + + if (!peerinfo->rpc) { + //handle this case + goto out; + } + + ret = glusterd_friend_sm_new_event + (GD_FRIEND_EVENT_INIT_REMOVE_FRIEND, &event); + + if (ret) { + gf_log ("glusterd", GF_LOG_ERROR, "Unable to get new event"); + return ret; + } + + ctx = GF_CALLOC (1, sizeof(*ctx), gf_gld_mt_probe_ctx_t); + + if (!ctx) { + return ret; + } + + ctx->hostname = gf_strdup (hoststr); + ctx->req = req; + + event->peerinfo = peerinfo; + event->ctx = ctx; + + ret = glusterd_friend_sm_inject_event (event); + + if (ret) { + gf_log ("glusterd", GF_LOG_ERROR, "Unable to inject event %d, " + "ret = %d", event->event, ret); + return ret; + } + +out: + return ret; +} + /*int glusterd_interpret (xlator_t *this, transport_t *trans, char *hdr_p, size_t hdrlen, struct iobuf *iobuf) @@ -1174,6 +1409,33 @@ glusterd_interpret (xlator_t *this, transport_t *trans, */ int +glusterd_xfer_friend_remove_resp (rpcsvc_request_t *req, char *hostname) +{ + gd1_mgmt_friend_rsp rsp = {{0}, }; + int32_t ret = -1; + xlator_t *this = NULL; + glusterd_conf_t *conf = NULL; + + GF_ASSERT (hostname); + + rsp.op_ret = 0; + this = THIS; + GF_ASSERT (this); + + conf = this->private; + + uuid_copy (rsp.uuid, conf->uuid); + rsp.hostname = hostname; + + ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, + gd_xdr_serialize_mgmt_friend_rsp); + + gf_log ("glusterd", GF_LOG_NORMAL, + "Responded to %s, ret: %d", hostname, ret); + return ret; +} + +int glusterd_xfer_friend_add_resp (rpcsvc_request_t *req, char *hostname) { gd1_mgmt_friend_rsp rsp = {{0}, }; @@ -1193,10 +1455,10 @@ glusterd_xfer_friend_add_resp (rpcsvc_request_t *req, char *hostname) rsp.hostname = gf_strdup (hostname); - ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, + ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, gd_xdr_serialize_mgmt_friend_rsp); - gf_log ("glusterd", GF_LOG_NORMAL, + gf_log ("glusterd", GF_LOG_NORMAL, "Responded to %s, ret: %d", hostname, ret); return ret; } @@ -1214,7 +1476,7 @@ glusterd_xfer_cli_probe_resp (rpcsvc_request_t *req, int32_t op_ret, rsp.op_errno = op_errno; rsp.hostname = hostname; - ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, + ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, gf_xdr_serialize_cli_probe_rsp); gf_log ("glusterd", GF_LOG_NORMAL, "Responded to CLI, ret: %d",ret); @@ -1305,7 +1567,7 @@ glusterd_create_volume (rpcsvc_request_t *req, dict_t *dict) snprintf (cmd_str, 8192, "glusterfs-volgen -n %s -c /etc/glusterd -r 1 %s", volname, bricks); - system (cmd_str); + ret = system (cmd_str); break; } case GF_CLUSTER_TYPE_STRIPE: @@ -1316,7 +1578,7 @@ glusterd_create_volume (rpcsvc_request_t *req, dict_t *dict) snprintf (cmd_str, 8192, "glusterfs-volgen -n %s -c /etc/glusterd -r 0 %s", volname, bricks); - system (cmd_str); + ret = system (cmd_str); break; } case GF_CLUSTER_TYPE_NONE: @@ -1324,7 +1586,7 @@ glusterd_create_volume (rpcsvc_request_t *req, dict_t *dict) snprintf (cmd_str, 8192, "glusterfs-volgen -n %s -c /etc/glusterd %s", volname, bricks); - system (cmd_str); + ret = system (cmd_str); break; } } @@ -1336,6 +1598,68 @@ out: } +int32_t +glusterd_list_friends (rpcsvc_request_t *req, dict_t *dict, int32_t flags) +{ + int32_t ret = -1; + glusterd_conf_t *priv = NULL; + glusterd_peerinfo_t *entry = NULL; + int32_t count = 0; + dict_t *friends = NULL; + gf1_cli_peer_list_rsp rsp = {0,}; + + priv = THIS->private; + GF_ASSERT (priv); + + if (!list_empty (&priv->peers)) { + friends = dict_new (); + if (!friends) { + gf_log ("", GF_LOG_WARNING, "Out of Memory"); + goto out; + } + } else { + ret = 0; + goto out; + } + + if (flags == GF_CLI_LIST_ALL) { + list_for_each_entry (entry, &priv->peers, uuid_list) { + count++; + ret = glusterd_add_peer_detail_to_dict (entry, + friends, count); + if (ret) + goto out; + + } + + ret = dict_set_int32 (friends, "count", count); + + if (ret) + goto out; + } + + ret = dict_allocate_and_serialize (friends, &rsp.friends.friends_val, + (size_t *)&rsp.friends.friends_len); + + if (ret) + goto out; + + ret = 0; +out: + + if (ret) { + if (friends) + dict_destroy (friends); + } + + rsp.op_ret = ret; + + ret = glusterd_submit_reply (req, &rsp, NULL, 0, NULL, + gf_xdr_serialize_cli_peer_list_rsp); + + return ret; +} + int glusterd_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event, void *data) @@ -1364,7 +1688,7 @@ glusterd_rpc_notify (struct rpc_clnt *rpc, void *mydata, rpc_clnt_event_t event, } else { //conf->rpc->connected = 1; ret = default_notify (this, GF_EVENT_CHILD_UP, NULL); - } + } break; } |