diff options
author | Pranith Kumar K <pranithk@gluster.com> | 2010-09-14 02:23:32 +0000 |
---|---|---|
committer | Vijay Bellur <vijay@dev.gluster.com> | 2010-09-14 01:14:01 -0700 |
commit | 429a94c78ad3e6a956c847836a061c860d19e499 (patch) | |
tree | 01a5d606ca9b2184fd8940b86c09b5b81d827ee2 /xlators/mgmt/glusterd/src/glusterd-sm.c | |
parent | 8a2d1cf7a1425b9de2622635a1149f460bf1f36b (diff) |
mgmt/glusterd: make probe one way
Signed-off-by: Pranith Kumar K <pranithk@gluster.com>
Signed-off-by: Vijay Bellur <vijay@dev.gluster.com>
BUG: 1594 (make probe oneway)
URL: http://bugs.gluster.com/cgi-bin/bugzilla3/show_bug.cgi?id=1594
Diffstat (limited to 'xlators/mgmt/glusterd/src/glusterd-sm.c')
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-sm.c | 63 |
1 files changed, 62 insertions, 1 deletions
diff --git a/xlators/mgmt/glusterd/src/glusterd-sm.c b/xlators/mgmt/glusterd/src/glusterd-sm.c index 9656dba1ee8..a38d2fd8c41 100644 --- a/xlators/mgmt/glusterd/src/glusterd-sm.c +++ b/xlators/mgmt/glusterd/src/glusterd-sm.c @@ -67,6 +67,8 @@ glusterd_destroy_friend_req_ctx (glusterd_friend_req_ctx_t *ctx) dict_unref (ctx->vols); if (ctx->hostname) GF_FREE (ctx->hostname); + if (ctx->remote_hostname) + GF_FREE (ctx->remote_hostname); GF_FREE (ctx); } @@ -94,6 +96,22 @@ glusterd_ac_error (glusterd_friend_sm_event_t *event, void *ctx) } static int +glusterd_ac_reverse_probe_begin (glusterd_friend_sm_event_t *event, void *ctx) +{ + int ret = 0; + glusterd_friend_update_ctx_t *ev_ctx = NULL; + + GF_ASSERT (event); + GF_ASSERT (ctx); + + ev_ctx = ctx; + ret = glusterd_probe_begin (NULL, ev_ctx->remote_hostname, 0); + + gf_log ("", GF_LOG_DEBUG, "returning with %d", ret); + return ret; +} + +static int glusterd_ac_friend_add (glusterd_friend_sm_event_t *event, void *ctx) { int ret = 0; @@ -322,6 +340,31 @@ glusterd_ac_none (void *ctx) return ret; }*/ +int +glusterd_remote_hostname_get (rpcsvc_request_t *req, char *remote_host, int len) +{ + GF_ASSERT (req); + GF_ASSERT (remote_host); + GF_ASSERT (req->trans); + + char *name = NULL; + char *delimiter = NULL; + + name = req->trans->peerinfo.identifier; + strncpy (remote_host, name, len); + delimiter = strchr (remote_host, ':'); + + GF_ASSERT (delimiter); + if (!delimiter) { + memset (remote_host, 0, len); + return -1; + } + + *delimiter = '\0'; + + return 0; +} + static int glusterd_ac_handle_friend_add_req (glusterd_friend_sm_event_t *event, void *ctx) { @@ -334,6 +377,7 @@ glusterd_ac_handle_friend_add_req (glusterd_friend_sm_event_t *event, void *ctx) glusterd_friend_sm_event_type_t event_type = GD_FRIEND_EVENT_NONE; int status = 0; int32_t op_ret = -1; + char remote_hostname[UNIX_PATH_MAX + 1] = {0,}; GF_ASSERT (ctx); ev_ctx = ctx; @@ -374,6 +418,14 @@ glusterd_ac_handle_friend_add_req (glusterd_friend_sm_event_t *event, void *ctx) uuid_copy (new_ev_ctx->uuid, ev_ctx->uuid); new_ev_ctx->hostname = gf_strdup (ev_ctx->hostname); + ret = glusterd_remote_hostname_get (ev_ctx->req, remote_hostname, + sizeof (remote_hostname)); + if (ret) { + ret = -1; + goto out; + } + + new_ev_ctx->remote_hostname = gf_strdup (remote_hostname); new_event->ctx = new_ev_ctx; glusterd_friend_sm_inject_event (new_event); @@ -441,7 +493,7 @@ glusterd_sm_t glusterd_state_req_rcvd [] = { {GD_FRIEND_STATE_REQ_RCVD, glusterd_ac_friend_probe}, //EVENT_PROBE, {GD_FRIEND_STATE_REQ_SENT_RCVD, glusterd_ac_friend_add}, //EVENT_INIT_FRIEND_REQ, {GD_FRIEND_STATE_REQ_RCVD, glusterd_ac_none}, //EVENT_RCVD_ACC - {GD_FRIEND_STATE_REQ_RCVD, glusterd_ac_none}, //EVENT_RCVD_LOCAL_ACC + {GD_FRIEND_STATE_REQ_RCVD, glusterd_ac_reverse_probe_begin}, //EVENT_RCVD_LOCAL_ACC {GD_FRIEND_STATE_REQ_RCVD, glusterd_ac_none}, //EVENT_RCVD_RJT {GD_FRIEND_STATE_REJECTED, glusterd_ac_none}, //EVENT_RCVD_LOCAL_RJT {GD_FRIEND_STATE_REQ_RCVD, glusterd_ac_none}, //EVENT_RCV_FRIEND_REQ @@ -603,6 +655,7 @@ glusterd_friend_sm () glusterd_peerinfo_t *peerinfo = NULL; glusterd_friend_sm_event_type_t event_type = 0; int port = 6969; //TODO, use standard + gf_boolean_t is_await_conn = _gf_false; while (!list_empty (&gd_friend_sm_queue)) { list_for_each_entry_safe (event, tmp, &gd_friend_sm_queue, list) { @@ -638,6 +691,10 @@ glusterd_friend_sm () GF_ASSERT (handler); ret = handler (event, event->ctx); + if (ret == GLUSTERD_CONNECTION_AWAITED) { + is_await_conn = _gf_true; + ret = 0; + } if (ret) { gf_log ("glusterd", GF_LOG_ERROR, "handler returned: " @@ -667,7 +724,11 @@ glusterd_friend_sm () glusterd_destroy_friend_event_context (event); GF_FREE (event); + if (is_await_conn) + break; } + if (is_await_conn) + break; } |