]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
RadosModel: send racing read on write
authorSamuel Just <sam.just@inktank.com>
Tue, 8 Oct 2013 02:03:23 +0000 (19:03 -0700)
committerSamuel Just <sam.just@inktank.com>
Tue, 15 Oct 2013 22:19:09 +0000 (15:19 -0700)
Signed-off-by: Samuel Just <sam.just@inktank.com>
src/test/osd/RadosModel.h

index aba6a531c6fc80eeb62d8d5b51698dfd87a7638e..ac2f336f1101e1c72c74cb2d2af95cb328e160f0 100644 (file)
@@ -767,9 +767,13 @@ public:
   string oid;
   ContDesc cont;
   set<librados::AioCompletion *> waiting;
+  librados::AioCompletion *rcompletion;
   uint64_t waiting_on;
   uint64_t last_acked_tid;
 
+  librados::ObjectReadOperation read_op;
+  bufferlist rbuffer;
+
   WriteOp(int n,
          RadosTestContext *context,
          const string &oid,
@@ -824,6 +828,21 @@ public:
       context->io_ctx.aio_write(context->prefix+oid, completion,
                                to_write, i.get_len(), i.get_start());
     }
+
+    pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+      new pair<TestOp*, TestOp::CallbackInfo*>(
+       this,
+       new TestOp::CallbackInfo(tid));
+    rcompletion = context->rados.aio_create_completion(
+      (void*) cb_arg, &write_callback, NULL);
+    waiting_on++;
+    read_op.read(0, 1, &rbuffer, 0);
+    context->io_ctx.aio_operate(
+      context->prefix+oid, rcompletion,
+      &read_op,
+      librados::SNAP_HEAD,
+      librados::OPERATION_ORDER_READS_WRITES,  // order wrt previous write/update
+      0);
   }
 
   void _finish(CallbackInfo *info)
@@ -860,6 +879,13 @@ public:
       }
       
       context->update_object_version(oid, version);
+      if (rcompletion->get_version64() != version) {
+       cerr << "Error: racing read on " << oid << " returned version "
+            << rcompletion->get_version64() << " rather than version "
+            << version << std::endl;
+       assert(0 == "racing read got wrong version");
+      }
+      rcompletion->release();
       context->oid_in_use.erase(oid);
       context->oid_not_in_use.insert(oid);
       context->kick();