summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--rpc/rpc-lib/src/rpc-clnt.c20
-rw-r--r--rpc/rpc-lib/src/rpc-clnt.h4
-rw-r--r--xlators/mgmt/glusterd/src/glusterd-handler.c6
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,