diff options
author | Raghavendra G <raghavendra@gluster.com> | 2012-05-01 10:50:50 +0530 |
---|---|---|
committer | Anand Avati <avati@redhat.com> | 2012-05-05 23:49:02 -0700 |
commit | 0caffe52b8db6670dfa2b1c825477ede7ba304c6 (patch) | |
tree | 1d595d40a0dde1ad313a14ead15470526495c9f8 | |
parent | 9bd1b291e3e107250b38d05702df7cd751382bdc (diff) |
protocol/client: hold lock when cancelling ping_timer in
client_ping_cbk.
Change-Id: I2b4e723ef119c62902f8a692a8a1f424da0d08b4
BUG: 816951
Signed-off-by: Raghavendra G <raghavendra@gluster.com>
Reviewed-on: http://review.gluster.com/3254
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Jeff Darcy <jdarcy@redhat.com>
Reviewed-by: Anand Avati <avati@redhat.com>
-rw-r--r-- | xlators/protocol/client/src/client-handshake.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/xlators/protocol/client/src/client-handshake.c b/xlators/protocol/client/src/client-handshake.c index a3cb325b02a..c249516a930 100644 --- a/xlators/protocol/client/src/client-handshake.c +++ b/xlators/protocol/client/src/client-handshake.c @@ -254,35 +254,40 @@ client_ping_cbk (struct rpc_req *req, struct iovec *iov, int count, clnt_conf_t *conf = NULL; if (!myframe) { - gf_log (THIS->name, GF_LOG_WARNING, "frame with the request is NULL"); + gf_log (THIS->name, GF_LOG_WARNING, + "frame with the request is NULL"); goto out; } frame = myframe; this = frame->this; if (!this || !this->private) { - gf_log (THIS->name, GF_LOG_WARNING, "xlator private is not set"); + gf_log (THIS->name, GF_LOG_WARNING, + "xlator private is not set"); goto out; } conf = this->private; conn = &conf->rpc->conn; - if (req->rpc_status == -1) { - if (conn->ping_timer != NULL) { - gf_log (this->name, GF_LOG_WARNING, "socket or ib" - " related error"); - gf_timer_call_cancel (this->ctx, conn->ping_timer); - conn->ping_timer = NULL; - } else { - /* timer expired and transport bailed out */ - gf_log (this->name, GF_LOG_WARNING, "timer must have " - "expired"); - } - goto out; - } - pthread_mutex_lock (&conn->lock); { + if (req->rpc_status == -1) { + if (conn->ping_timer != NULL) { + gf_log (this->name, GF_LOG_WARNING, + "socket or ib related error"); + gf_timer_call_cancel (this->ctx, + conn->ping_timer); + conn->ping_timer = NULL; + } else { + /* timer expired and transport bailed out */ + gf_log (this->name, GF_LOG_WARNING, + "timer must have expired"); + } + + goto unlock; + } + + timeout.tv_sec = conf->opt.ping_timeout; timeout.tv_usec = 0; @@ -297,6 +302,7 @@ client_ping_cbk (struct rpc_req *req, struct iovec *iov, int count, gf_log (this->name, GF_LOG_WARNING, "failed to set the ping timer"); } +unlock: pthread_mutex_unlock (&conn->lock); out: if (frame) |