diff options
Diffstat (limited to 'rpc')
-rw-r--r-- | rpc/rpc-lib/src/rpc-clnt-ping.c | 51 | ||||
-rw-r--r-- | rpc/rpc-lib/src/rpc-clnt.c | 24 |
2 files changed, 35 insertions, 40 deletions
diff --git a/rpc/rpc-lib/src/rpc-clnt-ping.c b/rpc/rpc-lib/src/rpc-clnt-ping.c index b3bd5e11deb..845ce235a2b 100644 --- a/rpc/rpc-lib/src/rpc-clnt-ping.c +++ b/rpc/rpc-lib/src/rpc-clnt-ping.c @@ -64,8 +64,8 @@ rpc_clnt_ping_timer_expired (void *rpc_ptr) conn->ping_timer = NULL; rpc_clnt_unref (rpc); } - gettimeofday (¤t, NULL); + gettimeofday (¤t, NULL); if (((current.tv_sec - conn->last_received.tv_sec) < conn->ping_timeout) || ((current.tv_sec - conn->last_sent.tv_sec) < @@ -119,6 +119,7 @@ rpc_clnt_ping_cbk (struct rpc_req *req, struct iovec *iov, int count, xlator_t *this = NULL; rpc_clnt_connection_t *conn = NULL; call_frame_t *frame = NULL; + struct timespec timeout = {0, }; if (!myframe) { gf_log (THIS->name, GF_LOG_WARNING, @@ -132,9 +133,9 @@ rpc_clnt_ping_cbk (struct rpc_req *req, struct iovec *iov, int count, frame->local = NULL; /* Prevent STACK_DESTROY from segfaulting */ conn = &rpc->conn; - if (req->rpc_status == -1) { - pthread_mutex_lock (&conn->lock); - { + 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"); @@ -142,20 +143,43 @@ rpc_clnt_ping_cbk (struct rpc_req *req, struct iovec *iov, int count, conn->ping_timer); conn->ping_timer = NULL; rpc_clnt_unref (rpc); + } else { /* timer expired and transport bailed out */ gf_log (this->name, GF_LOG_WARNING, "timer must have expired"); + } conn->ping_started = 0; + goto unlock; } - pthread_mutex_unlock (&conn->lock); + + /*This allows other RPCs to be able to start the ping timer + * if they come by before the following start ping routine + * is executed by the timer thread.*/ + conn->ping_started = 0; + gf_timer_call_cancel (this->ctx, + conn->ping_timer); + + timeout.tv_sec = conn->ping_timeout; + timeout.tv_nsec = 0; + rpc_clnt_ref (rpc); + conn->ping_timer = gf_timer_call_after (this->ctx, timeout, + rpc_clnt_start_ping, + (void *)rpc); + + if (conn->ping_timer == NULL) { + gf_log (this->name, GF_LOG_WARNING, + "failed to set the ping timer"); + rpc_clnt_unref (rpc); + } + } +unlock: + pthread_mutex_unlock (&conn->lock); out: if (frame) STACK_DESTROY (frame->root); - if (rpc) - rpc_clnt_unref (rpc); return 0; } @@ -169,7 +193,7 @@ rpc_clnt_ping (struct rpc_clnt *rpc) if (!frame) goto fail; - frame->local = rpc_clnt_ref (rpc); + frame->local = rpc; ret = rpc_clnt_submit (rpc, &clnt_ping_prog, GF_DUMP_PING, rpc_clnt_ping_cbk, NULL, 0, @@ -219,10 +243,12 @@ rpc_clnt_start_ping (void *rpc_ptr) rpc_clnt_unref (rpc); } - if (conn->saved_frames) + if (conn->saved_frames) { + GF_ASSERT (conn->saved_frames->count >= 0); /* treat the case where conn->saved_frames is NULL as no pending frames */ frame_count = conn->saved_frames->count; + } if ((frame_count == 0) || !conn->connected) { gf_log (THIS->name, GF_LOG_DEBUG, @@ -234,13 +260,6 @@ rpc_clnt_start_ping (void *rpc_ptr) return; } - if (frame_count < 0) { - gf_log (THIS->name, GF_LOG_WARNING, - "saved_frames->count is %"PRId64, - conn->saved_frames->count); - conn->saved_frames->count = 0; - } - timeout.tv_sec = conn->ping_timeout; timeout.tv_nsec = 0; diff --git a/rpc/rpc-lib/src/rpc-clnt.c b/rpc/rpc-lib/src/rpc-clnt.c index 46ee0eebcd0..475afb49739 100644 --- a/rpc/rpc-lib/src/rpc-clnt.c +++ b/rpc/rpc-lib/src/rpc-clnt.c @@ -110,30 +110,6 @@ out: } -void -saved_frames_delete (struct saved_frame *saved_frame, - rpc_clnt_connection_t *conn) -{ - GF_VALIDATE_OR_GOTO ("rpc-clnt", saved_frame, out); - GF_VALIDATE_OR_GOTO ("rpc-clnt", conn, out); - - pthread_mutex_lock (&conn->lock); - { - list_del_init (&saved_frame->list); - conn->saved_frames->count--; - } - pthread_mutex_unlock (&conn->lock); - - if (saved_frame->rpcreq != NULL) { - rpc_clnt_reply_deinit (saved_frame->rpcreq, - conn->rpc_clnt->reqpool); - } - - mem_put (saved_frame); -out: - return; -} - static void call_bail (void *data) |