From: Zengran Zhang Date: Fri, 7 Dec 2018 08:37:32 +0000 (+0800) Subject: objecter: avoid race when reset down osd's session X-Git-Tag: v14.1.0~537^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a67141528cd3560e7df28c82d2cf0fae8dac388e;p=ceph.git objecter: avoid race when reset down osd's session 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 --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 9f5610770cf7..fb0eea8759e2 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -4384,7 +4384,10 @@ bool Objecter::ms_handle_reset(Connection *con) 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; }