]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
objecter: fix locking
authorYehuda Sadeh <yehuda@inktank.com>
Thu, 5 Jun 2014 19:21:53 +0000 (12:21 -0700)
committerJohn Spray <john.spray@redhat.com>
Mon, 25 Aug 2014 00:34:00 +0000 (01:34 +0100)
ms_handle_reset() takes the session lock, needed to be able to call
_kick_requetss() with it held.

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/osdc/Objecter.cc
src/osdc/Objecter.h

index fef6faf73f87073d9ca2c2a2398993502eb1d9ae..ba097287e5a7d203e8eec3afe3811b58b7a4b473 100644 (file)
@@ -1297,17 +1297,20 @@ void Objecter::kick_requests(OSDSession *session)
 {
   ldout(cct, 10) << "kick_requests for osd." << session->osd << dendl;
 
+  map<uint64_t, LingerOp *> 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<uint64_t, LingerOp *>& lresend)
 {
   assert(rwlock.is_locked());
 
-  session->lock.get_write();
-
   // resend ops
   map<ceph_tid_t,Op*> resend;  // resend in tid order
   for (map<ceph_tid_t, Op*>::iterator p = session->ops.begin(); p != session->ops.end();) {
@@ -1328,7 +1331,6 @@ void Objecter::_kick_requests(OSDSession *session)
   }
 
   // resend lingers
-  map<uint64_t, LingerOp*> lresend;  // resend in order
   for (map<ceph_tid_t, LingerOp*>::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<uint64_t, LingerOp *>& 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<int,OSDSession*>::iterator p = osd_sessions.find(osd);
       if (p != osd_sessions.end()) {
        OSDSession *session = p->second;
+        map<uint64_t, LingerOp *> 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 {
index 2440dcec48105fc55671ecc0823e7a17a90160e8..ee129af134dacd157ef24a22a515a902c3de05af 100644 (file)
@@ -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<uint64_t, LingerOp *>& lresend);
+  void _linger_ops_resend(map<uint64_t, LingerOp *>& lresend);
 
   int _get_session(int osd, OSDSession **session, RWLock::Context& lc);
   void put_session(OSDSession *s);