case STATE_WAIT:
{
- ldout(async_msgr->cct, 20) << __func__ << " enter wait state" << dendl;
- break;
+ ldout(async_msgr->cct, 1) << __func__ << " enter wait state, failing" << dendl;
+ goto fail;
}
default:
}
write_lock.Unlock();
- if (!(state >= STATE_CONNECTING && state < STATE_CONNECTING_READY)) {
+ if (!(state >= STATE_CONNECTING && state < STATE_CONNECTING_READY) &&
+ state != STATE_WAIT) { // STATE_WAIT is coming from STATE_CONNECTING_*
// policy maybe empty when state is in accept
if (policy.server) {
ldout(async_msgr->cct, 0) << __func__ << " server, going to standby" << dendl;
state = STATE_CONNECTING;
}
backoff = utime_t();
+ center->dispatch_event_external(read_handler);
} else {
- if (backoff == utime_t()) {
+ if (state == STATE_WAIT) {
+ backoff.set_from_double(async_msgr->cct->_conf->ms_max_backoff);
+ } else if (backoff == utime_t()) {
backoff.set_from_double(async_msgr->cct->_conf->ms_initial_backoff);
} else {
backoff += backoff;
state = STATE_CONNECTING;
ldout(async_msgr->cct, 10) << __func__ << " waiting " << backoff << dendl;
+ // woke up again;
+ register_time_events.insert(center->create_time_event(
+ backoff.to_nsec()/1000, wakeup_handler));
}
-
- // woke up again;
- register_time_events.insert(center->create_time_event(
- backoff.to_nsec()/1000, wakeup_handler));
}
void AsyncConnection::was_session_reset()