summaryrefslogtreecommitdiff
path: root/net/ceph/messenger.c
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2020-10-29 14:49:10 +0100
committerIlya Dryomov <idryomov@gmail.com>2020-12-14 23:21:48 +0100
commit418af5b3bfc4f1ef4854e83c5be8a0bdce51e95c (patch)
treed2ebd1c8726c80c20b39ef9628f7558754332a0a /net/ceph/messenger.c
parentb77f8f0e4f271c29cf5cc071ea1b6bc3a675b340 (diff)
libceph: lower exponential backoff delay
The current setting allows the backoff to climb up to 5 minutes. This is too high -- it becomes hard to tell whether the client is stuck on something or just in backoff. In userspace, ms_max_backoff is defaulted to 15 seconds. Let's do the same. Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'net/ceph/messenger.c')
-rw-r--r--net/ceph/messenger.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/net/ceph/messenger.c b/net/ceph/messenger.c
index 214ae2d17a90..f3eb66bab988 100644
--- a/net/ceph/messenger.c
+++ b/net/ceph/messenger.c
@@ -2812,6 +2812,9 @@ static int queue_con_delay(struct ceph_connection *con, unsigned long delay)
return -ENOENT;
}
+ if (delay >= HZ)
+ delay = round_jiffies_relative(delay);
+
dout("%s %p %lu\n", __func__, con, delay);
if (!queue_delayed_work(ceph_msgr_wq, &con->work, delay)) {
dout("%s %p - already queued\n", __func__, con);
@@ -2871,7 +2874,7 @@ static bool con_backoff(struct ceph_connection *con)
if (!con_flag_test_and_clear(con, CON_FLAG_BACKOFF))
return false;
- ret = queue_con_delay(con, round_jiffies_relative(con->delay));
+ ret = queue_con_delay(con, con->delay);
if (ret) {
dout("%s: con %p FAILED to back off %lu\n", __func__,
con, con->delay);
@@ -3018,10 +3021,13 @@ static void con_fault(struct ceph_connection *con)
} else {
/* retry after a delay. */
con->state = CON_STATE_PREOPEN;
- if (con->delay == 0)
+ if (!con->delay) {
con->delay = BASE_DELAY_INTERVAL;
- else if (con->delay < MAX_DELAY_INTERVAL)
+ } else if (con->delay < MAX_DELAY_INTERVAL) {
con->delay *= 2;
+ if (con->delay > MAX_DELAY_INTERVAL)
+ con->delay = MAX_DELAY_INTERVAL;
+ }
con_flag_set(con, CON_FLAG_BACKOFF);
queue_con(con);
}