diff options
-rw-r--r-- | xlators/protocol/client/src/client-protocol.c | 26 | ||||
-rw-r--r-- | xlators/protocol/client/src/client-protocol.h | 1 |
2 files changed, 23 insertions, 4 deletions
diff --git a/xlators/protocol/client/src/client-protocol.c b/xlators/protocol/client/src/client-protocol.c index b7f15a8df5f..af5a0bb15f2 100644 --- a/xlators/protocol/client/src/client-protocol.c +++ b/xlators/protocol/client/src/client-protocol.c @@ -5395,6 +5395,7 @@ int client_setvolume_cbk (call_frame_t *frame, gf_hdr_common_t *hdr, size_t hdrlen, struct iobuf *iobuf) { + client_conf_t *conf = NULL; gf_mop_setvolume_rsp_t *rsp = NULL; client_connection_t *conn = NULL; glusterfs_ctx_t *ctx = NULL; @@ -5412,10 +5413,10 @@ client_setvolume_cbk (call_frame_t *frame, gf_hdr_common_t *hdr, size_t hdrlen, transport_t *peer_trans = NULL; uint64_t peer_trans_int = 0; - trans = frame->local; frame->local = NULL; this = frame->this; conn = trans->xl_private; + conf = this->private; rsp = gf_param (hdr); @@ -5509,7 +5510,9 @@ client_setvolume_cbk (call_frame_t *frame, gf_hdr_common_t *hdr, size_t hdrlen, } } + conf->connecting = 0; out: + if (-1 == op_ret) { /* Let the connection/re-connection happen in * background, for now, don't hang here, @@ -5521,6 +5524,7 @@ out: GF_EVENT_CHILD_CONNECTING, trans->xl); parent = parent->next; } + conf->connecting= 1; } STACK_DESTROY (frame->root); @@ -6105,7 +6109,6 @@ notify (xlator_t *this, int32_t event, void *data, ...) client_connection_t *conn = NULL; client_conf_t *conf = NULL; xlator_list_t *parent = NULL; - conf = this->private; trans = data; @@ -6129,6 +6132,21 @@ notify (xlator_t *this, int32_t event, void *data, ...) ret = -1; protocol_client_cleanup (trans); + if (conf->connecting == 0) { + /* Let the connection/re-connection happen in + * background, for now, don't hang here, + * tell the parents that i am all ok.. + */ + parent = trans->xl->parents; + while (parent) { + parent->xlator->notify (parent->xlator, + GF_EVENT_CHILD_CONNECTING, + trans->xl); + parent = parent->next; + } + conf->connecting = 1; + } + was_not_down = 0; for (i = 0; i < CHANNEL_MAX; i++) { conn = conf->transport[i]->xl_private; @@ -6150,10 +6168,10 @@ notify (xlator_t *this, int32_t event, void *data, ...) if (conn->connected == 1) child_down = 0; } - + if (child_down && was_not_down) { gf_log (this->name, GF_LOG_INFO, "disconnected"); - + protocol_client_mark_fd_bad (this); parent = this->parents; diff --git a/xlators/protocol/client/src/client-protocol.h b/xlators/protocol/client/src/client-protocol.h index aef58ae30b0..7249853a65a 100644 --- a/xlators/protocol/client/src/client-protocol.h +++ b/xlators/protocol/client/src/client-protocol.h @@ -82,6 +82,7 @@ struct _client_conf { struct timeval last_sent; struct timeval last_received; pthread_mutex_t mutex; + int connecting; }; typedef struct _client_conf client_conf_t; |