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-15 15:19:09 -0700
commit3469dd896f73d5b064ff42b7144e9fb751d911e0 (patch)
tree3f2bab8f72643a07a30ffdbab02269defe9baeda
parent0246d47f562c58858c7d22a1867241bc8e33113a (diff)
downloadceph-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.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();