Commit 1752b50c authored by Ilya Dryomov's avatar Ilya Dryomov

libceph: introduce and switch to reopen_session()

hunting is now set in __open_session() and cleared in finish_hunting(),
instead of all around.  The "session lost" message is printed not only
on connection resets, but also on keepalive timeouts.
Signed-off-by: default avatarIlya Dryomov <idryomov@gmail.com>
parent 168b9090
...@@ -171,6 +171,7 @@ static void __open_session(struct ceph_mon_client *monc) ...@@ -171,6 +171,7 @@ static void __open_session(struct ceph_mon_client *monc)
pick_new_mon(monc); pick_new_mon(monc);
monc->hunting = true;
if (monc->had_a_connection) { if (monc->had_a_connection) {
monc->hunt_mult *= CEPH_MONC_HUNT_BACKOFF; monc->hunt_mult *= CEPH_MONC_HUNT_BACKOFF;
if (monc->hunt_mult > CEPH_MONC_HUNT_MAX_MULT) if (monc->hunt_mult > CEPH_MONC_HUNT_MAX_MULT)
...@@ -198,6 +199,16 @@ static void __open_session(struct ceph_mon_client *monc) ...@@ -198,6 +199,16 @@ static void __open_session(struct ceph_mon_client *monc)
__send_prepared_auth_request(monc, ret); __send_prepared_auth_request(monc, ret);
} }
static void reopen_session(struct ceph_mon_client *monc)
{
if (!monc->hunting)
pr_info("mon%d %s session lost, hunting for new mon\n",
monc->cur_mon, ceph_pr_addr(&monc->con.peer_addr.in_addr));
__close_session(monc);
__open_session(monc);
}
/* /*
* Reschedule delayed work timer. * Reschedule delayed work timer.
*/ */
...@@ -788,17 +799,15 @@ static void delayed_work(struct work_struct *work) ...@@ -788,17 +799,15 @@ static void delayed_work(struct work_struct *work)
dout("monc delayed_work\n"); dout("monc delayed_work\n");
mutex_lock(&monc->mutex); mutex_lock(&monc->mutex);
if (monc->hunting) { if (monc->hunting) {
__close_session(monc); dout("%s continuing hunt\n", __func__);
__open_session(monc); /* continue hunting */ reopen_session(monc);
} else { } else {
int is_auth = ceph_auth_is_authenticated(monc->auth); int is_auth = ceph_auth_is_authenticated(monc->auth);
if (ceph_con_keepalive_expired(&monc->con, if (ceph_con_keepalive_expired(&monc->con,
CEPH_MONC_PING_TIMEOUT)) { CEPH_MONC_PING_TIMEOUT)) {
dout("monc keepalive timeout\n"); dout("monc keepalive timeout\n");
is_auth = 0; is_auth = 0;
__close_session(monc); reopen_session(monc);
monc->hunting = true;
__open_session(monc);
} }
if (!monc->hunting) { if (!monc->hunting) {
...@@ -900,9 +909,6 @@ int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl) ...@@ -900,9 +909,6 @@ int ceph_monc_init(struct ceph_mon_client *monc, struct ceph_client *cl)
&monc->client->msgr); &monc->client->msgr);
monc->cur_mon = -1; monc->cur_mon = -1;
monc->hunting = true;
monc->sub_renew_after = jiffies;
monc->sub_renew_sent = 0;
monc->had_a_connection = false; monc->had_a_connection = false;
monc->hunt_mult = 1; monc->hunt_mult = 1;
...@@ -1157,16 +1163,9 @@ static void mon_fault(struct ceph_connection *con) ...@@ -1157,16 +1163,9 @@ static void mon_fault(struct ceph_connection *con)
if (!con->private) if (!con->private)
goto out; goto out;
if (!monc->hunting)
pr_info("mon%d %s session lost, "
"hunting for new mon\n", monc->cur_mon,
ceph_pr_addr(&monc->con.peer_addr.in_addr));
__close_session(monc);
if (!monc->hunting) { if (!monc->hunting) {
/* start hunting */ dout("%s hunting for new mon\n", __func__);
monc->hunting = true; reopen_session(monc);
__open_session(monc);
} else { } else {
/* already hunting, let's wait a bit */ /* already hunting, let's wait a bit */
__schedule_delayed(monc); __schedule_delayed(monc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment