]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/mon/MonClient.cc
update sources to v12.1.2
[ceph.git] / ceph / src / mon / MonClient.cc
index bc5626dad58e41687cc7b8b4c97bfc8929c09448..850b38d69b605b47ba84b5989a00494134502a57 100644 (file)
@@ -14,6 +14,8 @@
 
 #include <random>
 
+#include "include/scope_guard.h"
+
 #include "messages/MMonGetMap.h"
 #include "messages/MMonGetVersion.h"
 #include "messages/MMonGetVersionReply.h"
@@ -55,7 +57,8 @@ MonClient::MonClient(CephContext *cct_) :
   more_log_pending(false),
   want_monmap(true),
   had_a_connection(false),
-  reopen_interval_multiplier(1.0),
+  reopen_interval_multiplier(
+    cct_->_conf->get_val<double>("mon_client_hunt_interval_min_multiple")),
   last_mon_command_tid(0),
   version_req_id(0)
 {
@@ -729,20 +732,22 @@ void MonClient::_finish_hunting()
   }
 
   had_a_connection = true;
-  reopen_interval_multiplier /= 2.0;
-  if (reopen_interval_multiplier < 1.0)
-    reopen_interval_multiplier = 1.0;
+  _un_backoff();
 }
 
 void MonClient::tick()
 {
   ldout(cct, 10) << __func__ << dendl;
 
+  auto reschedule_tick = make_scope_guard([this] {
+      schedule_tick();
+    });
+
   _check_auth_tickets();
   
   if (_hunting()) {
     ldout(cct, 1) << "continuing hunt" << dendl;
-    _reopen_session();
+    return _reopen_session();
   } else if (active_con) {
     // just renew as needed
     utime_t now = ceph_clock_now();
@@ -765,14 +770,24 @@ void MonClient::tick()
       if (interval > cct->_conf->mon_client_ping_timeout) {
        ldout(cct, 1) << "no keepalive since " << lk << " (" << interval
                      << " seconds), reconnecting" << dendl;
-       _reopen_session();
+       return _reopen_session();
       }
-
       send_log();
     }
+
+    _un_backoff();
   }
+}
 
-  schedule_tick();
+void MonClient::_un_backoff()
+{
+  // un-backoff our reconnect interval
+  reopen_interval_multiplier = std::max(
+    cct->_conf->get_val<double>("mon_client_hunt_interval_min_multiple"),
+    reopen_interval_multiplier /
+    cct->_conf->get_val<double>("mon_client_hunt_interval_backoff"));
+  ldout(cct, 20) << __func__ << " reopen_interval_multipler now "
+                << reopen_interval_multiplier << dendl;
 }
 
 void MonClient::schedule_tick()