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 e6efb412561..28c6c8b4818 100644 --- a/rpc/rpc-lib/src/rpc-clnt.c +++ b/rpc/rpc-lib/src/rpc-clnt.c @@ -787,6 +787,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); @@ -805,6 +806,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); @@ -812,6 +814,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 410dd4478ca..e2bf485e4e2 100644 --- a/xlators/mgmt/glusterd/src/glusterd-handler.c +++ b/xlators/mgmt/glusterd/src/glusterd-handler.c @@ -5182,6 +5182,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,  | 
