From: Yehuda Sadeh Date: Thu, 5 Jun 2014 19:21:53 +0000 (-0700) Subject: objecter: fix locking X-Git-Tag: v0.86~213^2~89 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=795cba94f41505898950230fdcdaf427add31326;p=ceph.git objecter: fix locking ms_handle_reset() takes the session lock, needed to be able to call _kick_requetss() with it held. Signed-off-by: Yehuda Sadeh --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index fef6faf73f8..ba097287e5a 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -1297,17 +1297,20 @@ void Objecter::kick_requests(OSDSession *session) { ldout(cct, 10) << "kick_requests for osd." << session->osd << dendl; + map lresend; RWLock::WLocker wl(rwlock); - _kick_requests(session); + session->lock.get_write(); + _kick_requests(session, lresend); + session->lock.unlock(); + + _linger_ops_resend(lresend); } -void Objecter::_kick_requests(OSDSession *session) +void Objecter::_kick_requests(OSDSession *session, map& lresend) { assert(rwlock.is_locked()); - session->lock.get_write(); - // resend ops map resend; // resend in tid order for (map::iterator p = session->ops.begin(); p != session->ops.end();) { @@ -1328,7 +1331,6 @@ void Objecter::_kick_requests(OSDSession *session) } // resend lingers - map lresend; // resend in order for (map::iterator j = session->linger_ops.begin(); j != session->linger_ops.end(); ++j) { LingerOp *op = j->second; op->get(); @@ -1346,7 +1348,11 @@ void Objecter::_kick_requests(OSDSession *session) _send_command(cresend.begin()->second); cresend.erase(cresend.begin()); } - session->lock.unlock(); +} + +void Objecter::_linger_ops_resend(map& lresend) +{ + assert(rwlock.is_locked()); while (!lresend.empty()) { LingerOp *op = lresend.begin()->second; @@ -3095,10 +3101,12 @@ void Objecter::ms_handle_reset(Connection *con) map::iterator p = osd_sessions.find(osd); if (p != osd_sessions.end()) { OSDSession *session = p->second; + map lresend; session->lock.get_write(); _reopen_session(session); - _kick_requests(session); + _kick_requests(session, lresend); session->lock.unlock(); + _linger_ops_resend(lresend); rwlock.unlock(); maybe_request_map(); } else { diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 2440dcec481..ee129af134d 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -1539,7 +1539,8 @@ public: void _command_cancel_map_check(CommandOp *op); void kick_requests(OSDSession *session); - void _kick_requests(OSDSession *session); + void _kick_requests(OSDSession *session, map& lresend); + void _linger_ops_resend(map& lresend); int _get_session(int osd, OSDSession **session, RWLock::Context& lc); void put_session(OSDSession *s);