summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorIlya Dryomov <idryomov@gmail.com>2016-01-21 16:33:19 +0100
committerIlya Dryomov <idryomov@gmail.com>2016-03-25 18:51:39 +0100
commit168b9090c739c4b5556023a3f08789b349ca7339 (patch)
treea39d7d7d5d11eff31834fb492c719f5520f6cdc4 /net
parent58d81b1294f02262a141687cd62529c1ec8e6484 (diff)
downloadlinux-exynos-168b9090c739c4b5556023a3f08789b349ca7339.tar.gz
linux-exynos-168b9090c739c4b5556023a3f08789b349ca7339.tar.bz2
linux-exynos-168b9090c739c4b5556023a3f08789b349ca7339.zip
libceph: monc hunt rate is 3s with backoff up to 30s
Unless we are in the process of setting up a client (i.e. connecting to the monitor cluster for the first time), apply a backoff: every time we want to reopen a session, increase our timeout by a multiple (currently 2); when we complete the connection, reduce that multipler by 50%. Mirrors ceph.git commit 794c86fd289bd62a35ed14368fa096c46736e9a2. Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'net')
-rw-r--r--net/ceph/mon_client.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/net/ceph/mon_client.c b/net/ceph/mon_client.c
index 23a270c49baf..fd1cf408fd89 100644
--- a/net/ceph/mon_client.c
+++ b/net/ceph/mon_client.c
@@ -171,6 +171,12 @@ static void __open_session(struct ceph_mon_client *monc)
pick_new_mon(monc);
+ if (monc->had_a_connection) {
+ monc->hunt_mult *= CEPH_MONC_HUNT_BACKOFF;
+ if (monc->hunt_mult > CEPH_MONC_HUNT_MAX_MULT)
+ monc->hunt_mult = CEPH_MONC_HUNT_MAX_MULT;
+ }
+
monc->sub_renew_after = jiffies; /* i.e., expired */
monc->sub_renew_sent = 0;
@@ -192,11 +198,6 @@ static void __open_session(struct ceph_mon_client *monc)
__send_prepared_auth_request(monc, ret);
}
-static bool __sub_expired(struct ceph_mon_client *monc)
-{
- return time_after_eq(jiffies, monc->sub_renew_after);
-}
-
/*
* Reschedule delayed work timer.
*/
@@ -204,11 +205,11 @@ static void __schedule_delayed(struct ceph_mon_client *monc)
{
unsigned long delay;
- if (monc->cur_mon < 0 || __sub_expired(monc)) {
- delay = 10 * HZ;
- } else {
+ if (monc->hunting)
+ delay = CEPH_MONC_HUNT_INTERVAL * monc->hunt_mult;
+ else
delay = CEPH_MONC_PING_INTERVAL;
- }
+
dout("__schedule_delayed after %lu\n", delay);
schedule_delayed_work(&monc->delayed_work,
round_jiffies_relative(delay));
@@ -902,6 +903,8 @@ int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl)
monc->hunting = true;
monc->sub_renew_after = jiffies;
monc->sub_renew_sent = 0;
+ monc->had_a_connection = false;
+ monc->hunt_mult = 1;
INIT_DELAYED_WORK(&monc->delayed_work, delayed_work);
monc->generic_request_tree = RB_ROOT;
@@ -959,6 +962,10 @@ static void finish_hunting(struct ceph_mon_client *monc)
if (monc->hunting) {
dout("%s found mon%d\n", __func__, monc->cur_mon);
monc->hunting = false;
+ monc->had_a_connection = true;
+ monc->hunt_mult /= 2; /* reduce by 50% */
+ if (monc->hunt_mult < 1)
+ monc->hunt_mult = 1;
}
}