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: v12.2.12~96^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b8ea66104b4ceda501f96faef4f91829e6aae47d;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 (cherry picked from commit a67141528cd3560e7df28c82d2cf0fae8dac388e) --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index df8bc236a3d..89447ddc954 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -4424,7 +4424,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; }