From: Jason Dillaman Date: Tue, 25 Sep 2018 18:18:00 +0000 (-0400) Subject: osdc/Objecter: possible race condition with connection reset X-Git-Tag: v14.0.1~130^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=74ca33cb49d2c258324447b1ca366ed4e604202a;p=ceph.git osdc/Objecter: possible race condition with connection reset If the connection quickly fails before the private session reference can be associated with the connection, the connection will remain closed and any OSD ops against the session will remain stuck. Fixes: http://tracker.ceph.com/issues/36183 Signed-off-by: Jason Dillaman --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 1a85ed1b0cb7..ed3a6597c01d 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -1834,6 +1834,7 @@ void Objecter::get_session(Objecter::OSDSession *s) void Objecter::_reopen_session(OSDSession *s) { + // rwlock is locked unique // s->lock is locked auto addrs = osdmap->get_addrs(s->osd); @@ -4386,12 +4387,13 @@ bool Objecter::ms_handle_reset(Connection *con) if (!initialized) return false; if (con->get_peer_type() == CEPH_ENTITY_TYPE_OSD) { + unique_lock wl(rwlock); + auto priv = con->get_priv(); auto session = static_cast(priv.get()); if (session) { ldout(cct, 1) << "ms_handle_reset " << con << " session " << session << " osd." << session->osd << dendl; - unique_lock wl(rwlock); if (!initialized) { wl.unlock(); return false;