consider the sequence step of follow:
thread A: objecter handle new osdmap which says osd.X down
thread B: objecter reset session of osd.X,then reopen session
thread A: close seesion of osd.X because he is down
in such circumstance, we will hit failure on assert(is_up(osd))
the backtrace is:
1. ceph::__ceph_assert_fail(char const*, char const*, int, char const*) ()
2. OSDMap::get_inst(int) const [clone .part.224] ()
3. Objecter::_reopen_session(Objecter::OSDSession*) ()
4. Objecter::ms_handle_reset(Connection*) ()
Fixes: https://tracker.ceph.com/issues/24601
Signed-off-by: Zengran Zhang <zhangzengran@sangfor.com.cn>
if (session) {
ldout(cct, 1) << "ms_handle_reset " << con << " session " << session
<< " osd." << session->osd << dendl;
- if (!initialized) {
+ // the session maybe had been closed if new osdmap just handled
+ // says the osd down
+ if (!(initialized && osdmap->is_up(session->osd))) {
+ ldout(cct, 1) << "ms_handle_reset aborted,initialized=" << initialized << dendl;
wl.unlock();
return false;
}