summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-10-07 19:03:23 -0700
committerSamuel Just <sam.just@inktank.com>2013-10-09 13:35:42 -0700
commitdb6623fa3ec0c3d693af9d6770f29351e1ef352c (patch)
treec85aa2e93e65c41243e1684ba405ac52c16d44dd
parent2b216c3ae2f66ce7e3d62e1c7b13c96c9f7bd687 (diff)
downloadceph-db6623fa3ec0c3d693af9d6770f29351e1ef352c.tar.gz
RadosModel: send racing read on write
Signed-off-by: Samuel Just <sam.just@inktank.com>
-rw-r--r--src/test/osd/RadosModel.h26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/test/osd/RadosModel.h b/src/test/osd/RadosModel.h
index aba6a531c6f..ac2f336f110 100644
--- a/src/test/osd/RadosModel.h
+++ b/src/test/osd/RadosModel.h
@@ -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();