diff options
| author | Harshavardhana <harsha@harshavardhana.net> | 2013-10-10 04:19:16 -0700 | 
|---|---|---|
| committer | Anand Avati <avati@redhat.com> | 2013-10-15 00:14:57 -0700 | 
| commit | 6836118b214bb45ff94ae1bc176a6eefb1a17a6a (patch) | |
| tree | b600fc4deaab0c62c37241c6deef6f604d0088f1 /xlators/protocol/client/src | |
| parent | 793f8491789e58791b090a74472959df117e404b (diff) | |
libglusterfs: Add monotonic clocking counter for timer thread
gettimeofday() returns the current wall clock time and timezone.
Using these functions in order to measure the passage of time
(how long an operation took) therefore seems like a no-brainer.
This time suffer's from some limitations:
a. They have a low resolution: “High-performance” timing by
definition, requires clock resolutions into the microseconds
or better.
b. They can jump forwards and backwards in time: Computer
clocks all tick at slightly different rates, which causes
the time to drift. Most systems have NTP enabled which
periodically adjusts the system clock to keep them in sync
with “actual” time. The adjustment can cause the clock to
suddenly jump forward (artificially inflating your timing
numbers) or jump backwards (causing your timing calculations
to go negative or hugely positive). In such cases timer
thread could go into an infinite loop.
From 'man gettimeofday':
----------
..
..
The time returned by gettimeofday() is affected by discontinuous
jumps in the system time (e.g., if the system administrator manually
changes the system time).  If you need a monotonically increasing
clock, see clock_gettime(2).
..
..
----------
Rationale:
For calculating interval timing for Timer thread, all that’s
needed should be clock as a simple counter that increments
at a stable rate.
This is necessary to avoid the jumps which are caused by using
"wall time", this counter must be monotonic that can never
“tick” backwards, ever.
Change-Id: I701d31e71a85a73d21a6c5cd15583e7a5a645eeb
BUG: 1017993
Signed-off-by: Harshavardhana <harsha@harshavardhana.net>
Reviewed-on: http://review.gluster.org/6070
Tested-by: Gluster Build System <jenkins@build.gluster.com>
Reviewed-by: Anand Avati <avati@redhat.com>
Diffstat (limited to 'xlators/protocol/client/src')
| -rw-r--r-- | xlators/protocol/client/src/client-handshake.c | 12 | ||||
| -rw-r--r-- | xlators/protocol/client/src/client.c | 10 | ||||
| -rw-r--r-- | xlators/protocol/client/src/client.h | 2 | 
3 files changed, 12 insertions, 12 deletions
diff --git a/xlators/protocol/client/src/client-handshake.c b/xlators/protocol/client/src/client-handshake.c index adf53f15e..5668fea53 100644 --- a/xlators/protocol/client/src/client-handshake.c +++ b/xlators/protocol/client/src/client-handshake.c @@ -53,7 +53,7 @@ rpc_client_ping_timer_expired (void *data)          rpc_clnt_connection_t   *conn               = NULL;          int                      disconnect         = 0;          int                      transport_activity = 0; -        struct timeval           timeout            = {0, }; +        struct timespec          timeout            = {0, };          struct timeval           current            = {0, };          struct rpc_clnt         *clnt               = NULL;          xlator_t                *this               = NULL; @@ -101,7 +101,7 @@ rpc_client_ping_timer_expired (void *data)                                  "ping timer expired but transport activity "                                  "detected - not bailing transport");                          timeout.tv_sec = conf->opt.ping_timeout; -                        timeout.tv_usec = 0; +                        timeout.tv_nsec = 0;                          conn->ping_timer =                                  gf_timer_call_after (this->ctx, timeout, @@ -140,7 +140,7 @@ client_start_ping (void *data)          clnt_conf_t             *conf        = NULL;          rpc_clnt_connection_t   *conn        = NULL;          int32_t                  ret         = -1; -        struct timeval           timeout     = {0, }; +        struct timespec          timeout     = {0, };          call_frame_t            *frame       = NULL;          int                      frame_count = 0; @@ -196,7 +196,7 @@ client_start_ping (void *data)                  }                  timeout.tv_sec = conf->opt.ping_timeout; -                timeout.tv_usec = 0; +                timeout.tv_nsec = 0;                  conn->ping_timer =                          gf_timer_call_after (this->ctx, timeout, @@ -241,7 +241,7 @@ client_ping_cbk (struct rpc_req *req, struct iovec *iov, int count,  {          xlator_t              *this    = NULL;          rpc_clnt_connection_t *conn    = NULL; -        struct timeval         timeout = {0, }; +        struct timespec        timeout = {0, };          call_frame_t          *frame   = NULL;          clnt_conf_t           *conf    = NULL; @@ -281,7 +281,7 @@ client_ping_cbk (struct rpc_req *req, struct iovec *iov, int count,                  timeout.tv_sec  = conf->opt.ping_timeout; -                timeout.tv_usec = 0; +                timeout.tv_nsec = 0;                  gf_timer_call_cancel (this->ctx,                                        conn->ping_timer); diff --git a/xlators/protocol/client/src/client.c b/xlators/protocol/client/src/client.c index aa2b8eef8..7703c6e8f 100644 --- a/xlators/protocol/client/src/client.c +++ b/xlators/protocol/client/src/client.c @@ -130,7 +130,7 @@ client_register_grace_timer (xlator_t *this, clnt_conf_t *conf)                          conf->grace_timer =                                  gf_timer_call_after (this->ctx, -                                                     conf->grace_tv, +                                                     conf->grace_ts,                                                       client_grace_timeout,                                                       conf->rpc);                  } @@ -2414,14 +2414,14 @@ client_init_grace_timer (xlator_t *this, dict_t *options,          ret = dict_get_int32 (options, "grace-timeout", &grace_timeout);          if (!ret) -                conf->grace_tv.tv_sec = grace_timeout; +                conf->grace_ts.tv_sec = grace_timeout;          else -                conf->grace_tv.tv_sec = 10; +                conf->grace_ts.tv_sec = 10; -        conf->grace_tv.tv_usec  = 0; +        conf->grace_ts.tv_nsec  = 0;          gf_log (this->name, GF_LOG_DEBUG, "Client grace timeout " -                "value = %"PRIu64, conf->grace_tv.tv_sec); +                "value = %"PRIu64, conf->grace_ts.tv_sec);          ret = 0;  out: diff --git a/xlators/protocol/client/src/client.h b/xlators/protocol/client/src/client.h index 37ba264ce..afab2d74f 100644 --- a/xlators/protocol/client/src/client.h +++ b/xlators/protocol/client/src/client.h @@ -104,7 +104,7 @@ typedef struct clnt_conf {          uint16_t               lk_version; /* this variable is used to distinguish                                                client-server transaction while                                                performing lock healing */ -        struct timeval         grace_tv; +        struct timespec        grace_ts;          gf_timer_t            *grace_timer;          gf_boolean_t           grace_timer_needed; /* The state of this flag will                                                        be used to decide whether  | 
