]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osdc/Objecter: For func op_cancel_writes it can directly call op_cancel.
authorJianpeng Ma <jianpeng.ma@intel.com>
Thu, 20 Aug 2015 07:38:58 +0000 (15:38 +0800)
committerLoic Dachary <ldachary@redhat.com>
Fri, 2 Oct 2015 13:37:56 +0000 (15:37 +0200)
Becasue we get write-lock of rwlock, so it is safe to call op_cancel
rather than _op_canchel(homeless_session for this case don't met).

Signed-off-by: Jianpeng Ma <jianpeng.ma@intel.com>
(cherry picked from commit e4ce619fe17a7a9dfc18e6af0b84928aa2d88c00)

Conflicts:
      src/osdc/Objecter.cc: the last if (found) was incorrectly
      implemented as if (to_cancel.size()) after hammer. The
      conflict is because the patch tries to revert an incorrect
      if (to_cancel.size()) which is not in hammer.

src/osdc/Objecter.cc

index 856425af9553a679c5c1fd266cf724aaee5d054d..5d2d62eaa2ed84a08e95d4bbdaf361f9b6eceb5e 100644 (file)
@@ -2279,6 +2279,7 @@ epoch_t Objecter::op_cancel_writes(int r)
   rwlock.get_write();
 
   std::vector<ceph_tid_t> to_cancel;
+  bool found = false;
 
   for (map<int, OSDSession *>::iterator siter = osd_sessions.begin(); siter != osd_sessions.end(); ++siter) {
     OSDSession *s = siter->second;
@@ -2289,19 +2290,26 @@ epoch_t Objecter::op_cancel_writes(int r)
       }
     }
     s->lock.unlock();
-  }
 
-  for (std::vector<ceph_tid_t>::iterator titer = to_cancel.begin(); titer != to_cancel.end(); ++titer) {
-    int cancel_result = _op_cancel(*titer, r);
-    // We hold rwlock across search and cancellation, so cancels should always succeed
-    assert(cancel_result == 0);
+    for (std::vector<ceph_tid_t>::iterator titer = to_cancel.begin(); titer != to_cancel.end(); ++titer) {
+      int cancel_result = op_cancel(s, *titer, r);
+      // We hold rwlock across search and cancellation, so cancels should always succeed
+      assert(cancel_result == 0);
+    }
+    if (!found && to_cancel.size())
+      found = true;
+    to_cancel.clear();
   }
 
   const epoch_t epoch = osdmap->get_epoch();
 
   rwlock.unlock();
 
-  return epoch;
+  if (found) {
+    return epoch;
+  } else {
+    return -1;
+  }
 }
 
 bool Objecter::is_pg_changed(