]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: ORDERSNAP osd_op flag
authorSage Weil <sage@newdream.net>
Tue, 19 Aug 2008 17:57:44 +0000 (10:57 -0700)
committerSage Weil <sage@newdream.net>
Tue, 19 Aug 2008 20:36:18 +0000 (13:36 -0700)
src/include/ceph_fs.h
src/osd/OSD.cc
src/osd/ReplicatedPG.cc
src/osd/ReplicatedPG.h

index 02b5c47c9cef09c988774f523de26e68405a6f7d..b9803bcce019263ea9d8e3932f453a73cc8b8589 100644 (file)
@@ -944,6 +944,7 @@ enum {
        CEPH_OSD_OP_INCLOCK_FAIL = 8, /* fail on inclock collision */
        CEPH_OSD_OP_BALANCE_READS = 16,
        CEPH_OSD_OP_ACKNVRAM = 32,    /* ACK when stable in NVRAM, not RAM */
+       CEPH_OSD_OP_ORDERSNAP = 64,   /* fail (EBADF) if snap ordering is incorrect */
 };
 
 struct ceph_osd_peer_stat {
index 9e09014b58a4187072911ff63be35c021241fb47..b3fad737e5390ae1af1a3f32e20725ecc2c07061 100644 (file)
@@ -42,7 +42,6 @@
 #include "messages/MOSDPing.h"
 #include "messages/MOSDFailure.h"
 #include "messages/MOSDOp.h"
-#include "messages/MOSDOpReply.h"
 #include "messages/MOSDSubOp.h"
 #include "messages/MOSDSubOpReply.h"
 #include "messages/MOSDBoot.h"
index 014268db4b68fe6ca6c109389643b6db573c994e..ce3e869b3b4565c1951773bea295d280e52bf4e2 100644 (file)
@@ -1320,6 +1320,12 @@ public:
   }
 };
 
+void ReplicatedPG::reply_op_error(MOSDOp *op, int err)
+{
+  MOSDOpReply *reply = new MOSDOpReply(op, err, osd->osdmap->get_epoch(), true);
+  osd->messenger->send_message(reply, op->get_orig_source_inst());
+  delete op;
+}
 
 void ReplicatedPG::op_modify(MOSDOp *op)
 {
@@ -1352,9 +1358,7 @@ void ReplicatedPG::op_modify(MOSDOp *op)
     if (cur > op->get_inc_lock()) {
       dout(10) << " inc_lock " << cur << " > " << op->get_inc_lock()
               << " on " << poid << dendl;
-      MOSDOpReply *reply = new MOSDOpReply(op, -EINCLOCKED, osd->osdmap->get_epoch(), true);
-      osd->messenger->send_message(reply, op->get_orig_source_inst());
-      delete op;
+      reply_op_error(op, -EINCLOCKED);
       return;
     }
   }
@@ -1434,6 +1438,15 @@ void ReplicatedPG::op_modify(MOSDOp *op)
           << " snapset " << snapset
            << dendl;  
 
+  // verify snap ordering
+  if ((op->get_flags() & CEPH_OSD_OP_ORDERSNAP) &&
+      snapc.seq < snapset.seq) {
+    dout(10) << " ORDERSNAP flag set and snapc seq " << snapc.seq << " < snapset seq " << snapset.seq
+            << " on " << poid << dendl;
+    reply_op_error(op, -EBADF);
+    return;
+  }
+
   // are any peers missing this?
   for (unsigned i=1; i<acting.size(); i++) {
     int peer = acting[i];
index c46f96d3c23fb2b8eafd9eced04d080d03137aff..797f7cac4c2a06c3a5c050d113817c3d7f75ccf8 100644 (file)
@@ -120,6 +120,8 @@ protected:
   bool do_recovery();
   void do_peer_recovery();
 
+  void reply_op_error(MOSDOp *op, int r);
+
   bool pick_read_snap(pobject_t& poid);
   void op_read(MOSDOp *op);
   void op_modify(MOSDOp *op);