]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
ReplicatedPG: explicitely block on not active for certain ops
authorSamuel Just <sam.just@inktank.com>
Thu, 17 May 2012 18:03:01 +0000 (11:03 -0700)
committerSamuel Just <sam.just@inktank.com>
Thu, 5 Jul 2012 17:15:00 +0000 (10:15 -0700)
Ops and some subops need to wait for active to ensure correct ordering
with respect to peering operations.

Signed-off-by: Samuel Just <sam.just@inktank.com>
src/osd/PG.cc
src/osd/ReplicatedPG.cc

index bb393cb6c0663eab4a6ff3e422380c727b82dafb..210e77fa18c36ac9df28c841884309c477ccf026 100644 (file)
@@ -1485,18 +1485,14 @@ void PG::do_request(OpRequestRef op)
   } else if (!flushed) {
     waiting_for_active.push_back(op);
     return;
-  } else if (!is_active()) {
-    waiting_for_active.push_back(op);
-    return;
-  } else if (is_replay()) {
-    waiting_for_active.push_back(op);
-    return;
   }
 
-  assert(!waiting_for_active.size());
-
   switch (op->request->get_type()) {
   case CEPH_MSG_OSD_OP:
+    if (is_replay() || !is_active()) {
+      waiting_for_active.push_back(op);
+      return;
+    }
     do_op(op); // do it now
     break;
 
index 31e9f864de4cd95a815311db316aa29294b1d765..e51af4edae9c527465d31aa274aaf40a4d7e4d60 100644 (file)
@@ -1065,27 +1065,48 @@ void ReplicatedPG::do_sub_op(OpRequestRef op)
       sub_op_pull(op);
       return;
     case CEPH_OSD_OP_PUSH:
-      sub_op_push(op);
+      if (!is_active())
+       waiting_for_active.push_back(op);
+      else
+       sub_op_push(op);
       return;
     case CEPH_OSD_OP_DELETE:
-      sub_op_remove(op);
+      if (!is_active())
+       waiting_for_active.push_back(op);
+      else
+       sub_op_remove(op);
       return;
     case CEPH_OSD_OP_SCRUB_RESERVE:
-      sub_op_scrub_reserve(op);
+      if (!is_active())
+       waiting_for_active.push_back(op);
+      else
+       sub_op_scrub_reserve(op);
       return;
     case CEPH_OSD_OP_SCRUB_UNRESERVE:
-      sub_op_scrub_unreserve(op);
+      if (!is_active())
+       waiting_for_active.push_back(op);
+      else
+       sub_op_scrub_unreserve(op);
       return;
     case CEPH_OSD_OP_SCRUB_STOP:
-      sub_op_scrub_stop(op);
+      if (!is_active())
+       waiting_for_active.push_back(op);
+      else
+       sub_op_scrub_stop(op);
       return;
     case CEPH_OSD_OP_SCRUB_MAP:
-      sub_op_scrub_map(op);
+      if (!is_active())
+       waiting_for_active.push_back(op);
+      else
+       sub_op_scrub_map(op);
       return;
     }
   }
 
-  sub_op_modify(op);
+  if (!is_active())
+    waiting_for_active.push_back(op);
+  else
+    sub_op_modify(op);
 }
 
 void ReplicatedPG::do_sub_op_reply(OpRequestRef op)