diff options
-rw-r--r-- | rpc/rpc-lib/src/rpc-clnt.c | 20 | ||||
-rw-r--r-- | rpc/rpc-lib/src/rpc-clnt.h | 4 | ||||
-rw-r--r-- | xlators/mgmt/glusterd/src/glusterd-handler.c | 6 |
3 files changed, 30 insertions, 0 deletions
diff --git a/rpc/rpc-lib/src/rpc-clnt.c b/rpc/rpc-lib/src/rpc-clnt.c index 2ae3bbad370..27e394093cf 100644 --- a/rpc/rpc-lib/src/rpc-clnt.c +++ b/rpc/rpc-lib/src/rpc-clnt.c @@ -782,6 +782,7 @@ rpc_clnt_set_connected (rpc_clnt_connection_t *conn) pthread_mutex_lock (&conn->lock); { conn->connected = 1; + conn->disconnected = _gf_false; } pthread_mutex_unlock (&conn->lock); @@ -800,6 +801,7 @@ rpc_clnt_unset_connected (rpc_clnt_connection_t *conn) pthread_mutex_lock (&conn->lock); { conn->connected = 0; + conn->disconnected = _gf_true; } pthread_mutex_unlock (&conn->lock); @@ -807,6 +809,24 @@ out: return; } +gf_boolean_t +is_rpc_clnt_disconnected (rpc_clnt_connection_t *conn) +{ + gf_boolean_t disconnected = _gf_true; + + if (!conn) + return disconnected; + + pthread_mutex_lock (&conn->lock); + { + if (conn->disconnected == _gf_false) + disconnected = _gf_false; + } + pthread_mutex_unlock (&conn->lock); + + return disconnected; +} + static void rpc_clnt_destroy (struct rpc_clnt *rpc); diff --git a/rpc/rpc-lib/src/rpc-clnt.h b/rpc/rpc-lib/src/rpc-clnt.h index 6a4bb40793f..01caeb814c0 100644 --- a/rpc/rpc-lib/src/rpc-clnt.h +++ b/rpc/rpc-lib/src/rpc-clnt.h @@ -140,6 +140,7 @@ struct rpc_clnt_connection { gf_timer_t *ping_timer; struct rpc_clnt *rpc_clnt; char connected; + gf_boolean_t disconnected; struct saved_frames *saved_frames; int32_t frame_timeout; struct timeval last_sent; @@ -234,6 +235,9 @@ int rpc_clnt_connection_cleanup (rpc_clnt_connection_t *conn); void rpc_clnt_set_connected (rpc_clnt_connection_t *conn); void rpc_clnt_unset_connected (rpc_clnt_connection_t *conn); + +gf_boolean_t is_rpc_clnt_disconnected (rpc_clnt_connection_t *conn); + void rpc_clnt_reconnect (void *trans_ptr); void rpc_clnt_reconfig (struct rpc_clnt *rpc, struct rpc_clnt_config *config); diff --git a/xlators/mgmt/glusterd/src/glusterd-handler.c b/xlators/mgmt/glusterd/src/glusterd-handler.c index 9007843be4a..d385c35b34b 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -5184,6 +5184,12 @@ __glusterd_peer_rpc_notify (struct rpc_clnt *rpc, void *mydata, case RPC_CLNT_DISCONNECT: { + /* If DISCONNECT event is already processed, skip the further + * ones + */ + if (is_rpc_clnt_disconnected (&rpc->conn)) + break; + rpc_clnt_unset_connected (&rpc->conn); gf_msg (this->name, GF_LOG_INFO, 0, GD_MSG_PEER_DISCONNECTED, |