From 3ce407800d4187645b1d99ec533df69d6fc0a1f2 Mon Sep 17 00:00:00 2001 From: David Zafman Date: Fri, 11 Apr 2014 15:37:23 -0700 Subject: [PATCH] test: Add --pool-snaps option to ceph_test_rados Fixes: #7940 Signed-off-by: David Zafman --- src/test/osd/RadosModel.h | 110 ++++++++++++++++++++++++++++---------- src/test/osd/TestRados.cc | 4 ++ 2 files changed, 85 insertions(+), 29 deletions(-) diff --git a/src/test/osd/RadosModel.h b/src/test/osd/RadosModel.h index 54eae6bfce5d8..e81699dab1241 100644 --- a/src/test/osd/RadosModel.h +++ b/src/test/osd/RadosModel.h @@ -138,6 +138,7 @@ public: void begin(); void finish(CallbackInfo *info); + virtual bool must_quiesce_other_ops() { return false; } }; class TestOpGenerator { @@ -175,13 +176,16 @@ public: const uint64_t max_stride_size; AttrGenerator attr_gen; const bool no_omap; - + bool pool_snaps; + int snapname_num; + RadosTestContext(const string &pool_name, int max_in_flight, uint64_t max_size, uint64_t min_stride_size, uint64_t max_stride_size, bool no_omap, + bool pool_snaps, const char *id = 0) : state_lock("Context Lock"), pool_obj_cont(), @@ -195,7 +199,9 @@ public: max_size(max_size), min_stride_size(min_stride_size), max_stride_size(max_stride_size), attr_gen(2000), - no_omap(no_omap) + no_omap(no_omap), + pool_snaps(pool_snaps), + snapname_num(0) { } @@ -242,7 +248,13 @@ public: state_lock.Lock(); TestOp *next = gen->next(*this); + TestOp *waiting = NULL; + while (next || !inflight.empty()) { + if (next && next->must_quiesce_other_ops() && !inflight.empty()) { + waiting = next; + next = NULL; // Force to wait for inflight to drain + } if (next) { inflight.push_back(next); } @@ -270,7 +282,12 @@ public: break; } } - next = gen->next(*this); + if (waiting) { + next = waiting; + waiting = NULL; + } else { + next = gen->next(*this); + } } state_lock.Unlock(); } @@ -1160,24 +1177,47 @@ public: void _begin() { uint64_t snap; - assert(!context->io_ctx.selfmanaged_snap_create(&snap)); + string snapname; + + if (context->pool_snaps) { + stringstream ss; + + ss << context->prefix << "snap" << ++context->snapname_num; + snapname = ss.str(); + + int ret = context->io_ctx.snap_create(snapname.c_str()); + if (ret) { + cerr << "snap_create returned " << ret << std::endl; + assert(0); + } + assert(!context->io_ctx.snap_lookup(snapname.c_str(), &snap)); + + } else { + assert(!context->io_ctx.selfmanaged_snap_create(&snap)); + } context->state_lock.Lock(); context->add_snap(snap); - vector snapset(context->snaps.size()); - int j = 0; - for (map::reverse_iterator i = context->snaps.rbegin(); - i != context->snaps.rend(); - ++i, ++j) { - snapset[j] = i->second; - } + if (context->pool_snaps) { + context->state_lock.Unlock(); + } else { + vector snapset(context->snaps.size()); - context->state_lock.Unlock(); - int r = context->io_ctx.selfmanaged_snap_set_write_ctx(context->seq, snapset); - if (r) { - cerr << "r is " << r << " snapset is " << snapset << " seq is " << context->seq << std::endl; - assert(0); + int j = 0; + for (map::reverse_iterator i = context->snaps.rbegin(); + i != context->snaps.rend(); + ++i, ++j) { + snapset[j] = i->second; + } + + context->state_lock.Unlock(); + + int r = context->io_ctx.selfmanaged_snap_set_write_ctx(context->seq, snapset); + if (r) { + cerr << "r is " << r << " snapset is " << snapset << " seq is " << context->seq << std::endl; + assert(0); + } } } @@ -1185,6 +1225,7 @@ public: { return "SnapCreateOp"; } + bool must_quiesce_other_ops() { return context->pool_snaps; } }; class SnapRemoveOp : public TestOp { @@ -1204,20 +1245,27 @@ public: context->remove_snap(to_remove); context->state_lock.Unlock(); - assert(!context->io_ctx.selfmanaged_snap_remove(snap)); + if (context->pool_snaps) { + string snapname; - vector snapset(context->snaps.size()); - int j = 0; - for (map::reverse_iterator i = context->snaps.rbegin(); - i != context->snaps.rend(); - ++i, ++j) { - snapset[j] = i->second; - } + assert(!context->io_ctx.snap_get_name(snap, &snapname)); + assert(!context->io_ctx.snap_remove(snapname.c_str())); + } else { + assert(!context->io_ctx.selfmanaged_snap_remove(snap)); - int r = context->io_ctx.selfmanaged_snap_set_write_ctx(context->seq, snapset); - if (r) { - cerr << "r is " << r << " snapset is " << snapset << " seq is " << context->seq << std::endl; - assert(0); + vector snapset(context->snaps.size()); + int j = 0; + for (map::reverse_iterator i = context->snaps.rbegin(); + i != context->snaps.rend(); + ++i, ++j) { + snapset[j] = i->second; + } + + int r = context->io_ctx.selfmanaged_snap_set_write_ctx(context->seq, snapset); + if (r) { + cerr << "r is " << r << " snapset is " << snapset << " seq is " << context->seq << std::endl; + assert(0); + } } } @@ -1341,7 +1389,11 @@ public: context->state_lock.Unlock(); - op.selfmanaged_snap_rollback(snap); + if (context->pool_snaps) { + op.snap_rollback(snap); + } else { + op.selfmanaged_snap_rollback(snap); + } pair *cb_arg = new pair(this, diff --git a/src/test/osd/TestRados.cc b/src/test/osd/TestRados.cc index 7b73a8f538b68..b61ceb3ddfdbd 100644 --- a/src/test/osd/TestRados.cc +++ b/src/test/osd/TestRados.cc @@ -233,6 +233,7 @@ int main(int argc, char **argv) int64_t size = 4000000; // 4 MB int64_t min_stride_size = -1, max_stride_size = -1; int max_seconds = 0; + bool pool_snaps = false; struct { TestOpType op; @@ -283,6 +284,8 @@ int main(int argc, char **argv) max_stride_size = atoi(argv[++i]); else if (strcmp(argv[i], "--no-omap") == 0) no_omap = true; + else if (strcmp(argv[i], "--pool-snaps") == 0) + pool_snaps = true; else if (strcmp(argv[i], "--ec-pool") == 0) { if (!op_weights.empty()) { cerr << "--ec-pool must be specified prior to any ops" << std::endl; @@ -377,6 +380,7 @@ int main(int argc, char **argv) min_stride_size, max_stride_size, no_omap, + pool_snaps, id); TestOpStat stats; -- 2.39.5