]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osdc/Objecter: refactor pool dne check to make op->session optional
authorSage Weil <sage@redhat.com>
Mon, 20 Feb 2017 18:55:10 +0000 (13:55 -0500)
committerSage Weil <sage@redhat.com>
Thu, 23 Feb 2017 15:29:42 +0000 (10:29 -0500)
Signed-off-by: Sage Weil <sage@redhat.com>
src/osdc/Objecter.cc
src/osdc/Objecter.h

index 87dd5aa6fab11317cf91e05b75efda414e214dca..aac9ce6e1cc1b913c6b6c33ff4a63e9f1d67f6ba 100644 (file)
@@ -1085,7 +1085,7 @@ void Objecter::_scan_requests(OSDSession *s,
       _op_cancel_map_check(op);
       break;
     case RECALC_OP_TARGET_POOL_DNE:
-      _check_op_pool_dne(op, sl);
+      _check_op_pool_dne(op, &sl);
       break;
     }
   }
@@ -1373,7 +1373,7 @@ void Objecter::C_Op_Map_Latest::finish(int r)
     op->map_dne_bound = latest;
 
   OSDSession::unique_lock sl(op->session->lock, defer_lock);
-  objecter->_check_op_pool_dne(op, sl);
+  objecter->_check_op_pool_dne(op, &sl);
 
   op->put();
 }
@@ -1436,7 +1436,7 @@ int Objecter::pool_snap_list(int64_t poolid, vector<uint64_t> *snaps)
 }
 
 // sl may be unlocked.
-void Objecter::_check_op_pool_dne(Op *op, unique_locksl)
+void Objecter::_check_op_pool_dne(Op *op, unique_lock *sl)
 {
   // rwlock is locked unique
 
@@ -1464,16 +1464,19 @@ void Objecter::_check_op_pool_dne(Op *op, unique_lock& sl)
       }
 
       OSDSession *s = op->session;
-      assert(s != NULL);
-      assert(sl.mutex() == &s->lock);
-
-      bool session_locked = sl.owns_lock();
-      if (!session_locked) {
-       sl.lock();
-      }
-      _finish_op(op, 0);
-      if (!session_locked) {
-       sl.unlock();
+      if (s) {
+       assert(s != NULL);
+       assert(sl->mutex() == &s->lock);
+       bool session_locked = sl->owns_lock();
+       if (!session_locked) {
+         sl->lock();
+       }
+       _finish_op(op, 0);
+       if (!session_locked) {
+         sl->unlock();
+       }
+      } else {
+       _finish_op(op, 0);      // no session
       }
     }
   } else {
@@ -2989,7 +2992,7 @@ void Objecter::_finish_op(Op *op, int r)
 {
   ldout(cct, 15) << "finish_op " << op->tid << dendl;
 
-  // op->session->lock is locked unique
+  // op->session->lock is locked unique or op->session is null
 
   if (!op->ctx_budgeted && op->budgeted)
     put_op_budget(op);
@@ -2997,7 +3000,9 @@ void Objecter::_finish_op(Op *op, int r)
   if (op->ontimeout && r != -ETIMEDOUT)
     timer.cancel_event(op->ontimeout);
 
-  _session_op_remove(op->session, op);
+  if (op->session) {
+    _session_op_remove(op->session, op);
+  }
 
   logger->dec(l_osdc_op_active);
 
index bea8d136abe11f2f2608d87bebdf1011f0f55d29..68d15db818b3fc29886aeece654063fc5a169831 100644 (file)
@@ -1847,7 +1847,7 @@ public:
   }
 
 private:
-  void _check_op_pool_dne(Op *op, unique_locksl);
+  void _check_op_pool_dne(Op *op, unique_lock *sl);
   void _send_op_map_check(Op *op);
   void _op_cancel_map_check(Op *op);
   void _check_linger_pool_dne(LingerOp *op, bool *need_unregister);