]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
objecter: avoid race when reset down osd's session 25853/head
authorZengran Zhang <zhangzengran@sangfor.com.cn>
Fri, 7 Dec 2018 08:37:32 +0000 (16:37 +0800)
committerAshish Singh <assingh@redhat.com>
Wed, 9 Jan 2019 04:23:17 +0000 (09:53 +0530)
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>
(cherry picked from commit a67141528cd3560e7df28c82d2cf0fae8dac388e)

src/osdc/Objecter.cc

index df8bc236a3dc8ade44168de01e8ed8e6dda54f46..89447ddc95427ca6c694d51e8807e9c655313739 100644 (file)
@@ -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;
       }