diff options
author | Samuel Just <sam.just@inktank.com> | 2013-10-07 19:03:23 -0700 |
---|---|---|
committer | Samuel Just <sam.just@inktank.com> | 2013-10-15 15:19:09 -0700 |
commit | 3469dd896f73d5b064ff42b7144e9fb751d911e0 (patch) | |
tree | 3f2bab8f72643a07a30ffdbab02269defe9baeda | |
parent | 0246d47f562c58858c7d22a1867241bc8e33113a (diff) | |
download | ceph-3469dd896f73d5b064ff42b7144e9fb751d911e0.tar.gz |
RadosModel: send racing read on write
Signed-off-by: Samuel Just <sam.just@inktank.com>
-rw-r--r-- | src/test/osd/RadosModel.h | 26 |
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(); |