diff options
Diffstat (limited to 'rpc/rpc-lib/src')
| -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)  | 
