From 1081584d4c2d26e56fea623ecfadd305c6e3d3bc Mon Sep 17 00:00:00 2001 From: Atin Mukherjee Date: Sun, 20 Mar 2016 18:31:00 +0530 Subject: glusterd/rpc : Discard duplicate Disconnect events If a peer rpc disconnect event has been already processed, skip the furthers as processing them are overheads and sometimes may lead to a crash like due to a double free Change-Id: Iec589ce85daf28fd5b267cb6fc82a4238e0e8adc BUG: 1318546 Signed-off-by: Atin Mukherjee Reviewed-on: http://review.gluster.org/13790 Smoke: Gluster Build System NetBSD-regression: NetBSD Build System CentOS-regression: Gluster Build System Reviewed-by: Jeff Darcy --- rpc/rpc-lib/src/rpc-clnt.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'rpc/rpc-lib/src/rpc-clnt.c') 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); -- cgit