void begin();
void finish(CallbackInfo *info);
+ virtual bool must_quiesce_other_ops() { return false; }
};
class TestOpGenerator {
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(),
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)
{
}
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);
}
break;
}
}
- next = gen->next(*this);
+ if (waiting) {
+ next = waiting;
+ waiting = NULL;
+ } else {
+ next = gen->next(*this);
+ }
}
state_lock.Unlock();
}
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<uint64_t> snapset(context->snaps.size());
- int j = 0;
- for (map<int,uint64_t>::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<uint64_t> 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<int,uint64_t>::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);
+ }
}
}
{
return "SnapCreateOp";
}
+ bool must_quiesce_other_ops() { return context->pool_snaps; }
};
class SnapRemoveOp : public TestOp {
context->remove_snap(to_remove);
context->state_lock.Unlock();
- assert(!context->io_ctx.selfmanaged_snap_remove(snap));
+ if (context->pool_snaps) {
+ string snapname;
- vector<uint64_t> snapset(context->snaps.size());
- int j = 0;
- for (map<int,uint64_t>::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<uint64_t> snapset(context->snaps.size());
+ int j = 0;
+ for (map<int,uint64_t>::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);
+ }
}
}
context->state_lock.Unlock();
- op.selfmanaged_snap_rollback(snap);
+ if (context->pool_snaps) {
+ op.snap_rollback(snap);
+ } else {
+ op.selfmanaged_snap_rollback(snap);
+ }
pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
new pair<TestOp*, TestOp::CallbackInfo*>(this,