#include <random>
+#include "include/scope_guard.h"
+
#include "messages/MMonGetMap.h"
#include "messages/MMonGetVersion.h"
#include "messages/MMonGetVersionReply.h"
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)
{
}
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();
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()