#ifndef RADOSMODEL_H
#define RADOSMODEL_H
-using namespace std;
-
class RadosTestContext;
class TestOpStat;
}
void handle_error(uint64_t cookie, int err) override {
std::lock_guard l{lock};
- cout << "watch handle_error " << err << std::endl;
+ std::cout << "watch handle_error " << err << std::endl;
}
void start() {
std::lock_guard l{lock};
{
return;
}
- virtual string getType() = 0;
+ virtual std::string getType() = 0;
virtual bool finished()
{
return true;
ceph::mutex state_lock = ceph::make_mutex("Context Lock");
ceph::condition_variable wait_cond;
// snap => {oid => desc}
- map<int, map<string,ObjectDesc> > pool_obj_cont;
- set<string> oid_in_use;
- set<string> oid_not_in_use;
- set<string> oid_flushing;
- set<string> oid_not_flushing;
- set<string> oid_redirect_not_in_use;
- set<string> oid_redirect_in_use;
- set<string> oid_set_chunk_tgt_pool;
+ std::map<int, std::map<std::string,ObjectDesc> > pool_obj_cont;
+ std::set<std::string> oid_in_use;
+ std::set<std::string> oid_not_in_use;
+ std::set<std::string> oid_flushing;
+ std::set<std::string> oid_not_flushing;
+ std::set<std::string> oid_redirect_not_in_use;
+ std::set<std::string> oid_redirect_in_use;
+ std::set<std::string> oid_set_chunk_tgt_pool;
SharedPtrRegistry<int, int> snaps_in_use;
int current_snap;
- string pool_name;
+ std::string pool_name;
librados::IoCtx io_ctx;
librados::Rados rados;
int next_oid;
- string prefix;
+ std::string prefix;
int errors;
int max_in_flight;
int seq_num;
- map<int,uint64_t> snaps;
+ std::map<int,uint64_t> snaps;
uint64_t seq;
const char *rados_id;
bool initialized;
- map<string, TestWatchContext*> watches;
+ std::map<std::string, TestWatchContext*> watches;
const uint64_t max_size;
const uint64_t min_stride_size;
const uint64_t max_stride_size;
const bool no_sparse;
bool pool_snaps;
bool write_fadvise_dontneed;
- string low_tier_pool_name;
+ std::string low_tier_pool_name;
librados::IoCtx low_tier_io_ctx;
int snapname_num;
- map<string,string > redirect_objs;
+ std::map<std::string, std::string> redirect_objs;
bool enable_dedup;
- string chunk_algo;
- string chunk_size;
+ std::string chunk_algo;
+ std::string chunk_size;
- RadosTestContext(const string &pool_name,
+ RadosTestContext(const std::string &pool_name,
int max_in_flight,
uint64_t max_size,
uint64_t min_stride_size,
bool no_sparse,
bool pool_snaps,
bool write_fadvise_dontneed,
- const string &low_tier_pool_name,
+ const std::string &low_tier_pool_name,
bool enable_dedup,
- string chunk_algo,
- string chunk_size,
+ std::string chunk_algo,
+ std::string chunk_size,
const char *id = 0) :
pool_obj_cont(),
current_snap(0),
char hostname_cstr[100];
gethostname(hostname_cstr, 100);
- stringstream hostpid;
+ std::stringstream hostpid;
hostpid << hostname_cstr << getpid() << "-";
prefix = hostpid.str();
ceph_assert(!initialized);
void loop(TestOpGenerator *gen)
{
ceph_assert(initialized);
- list<TestOp*> inflight;
+ std::list<TestOp*> inflight;
std::unique_lock state_locker{state_lock};
TestOp *next = gen->next(*this);
}
state_lock.lock();
while (1) {
- for (list<TestOp*>::iterator i = inflight.begin();
+ for (auto i = inflight.begin();
i != inflight.end();) {
if ((*i)->finished()) {
- cout << (*i)->num << ": done (" << (inflight.size()-1) << " left)" << std::endl;
+ std::cout << (*i)->num << ": done (" << (inflight.size()-1) << " left)" << std::endl;
delete *i;
inflight.erase(i++);
} else {
++i;
}
}
-
+
if (inflight.size() >= (unsigned) max_in_flight || (!next && !inflight.empty())) {
- cout << " waiting on " << inflight.size() << std::endl;
+ std::cout << " waiting on " << inflight.size() << std::endl;
wait_cond.wait(state_locker);
} else {
break;
wait_cond.notify_all();
}
- TestWatchContext *get_watch_context(const string &oid) {
+ TestWatchContext *get_watch_context(const std::string &oid) {
return watches.count(oid) ? watches[oid] : 0;
}
- TestWatchContext *watch(const string &oid) {
+ TestWatchContext *watch(const std::string &oid) {
ceph_assert(!watches.count(oid));
return (watches[oid] = new TestWatchContext);
}
- void unwatch(const string &oid) {
+ void unwatch(const std::string &oid) {
ceph_assert(watches.count(oid));
delete watches[oid];
watches.erase(oid);
}
- ObjectDesc get_most_recent(const string &oid) {
+ ObjectDesc get_most_recent(const std::string &oid) {
ObjectDesc new_obj;
- for (map<int, map<string,ObjectDesc> >::reverse_iterator i =
- pool_obj_cont.rbegin();
+ for (auto i = pool_obj_cont.rbegin();
i != pool_obj_cont.rend();
++i) {
- map<string,ObjectDesc>::iterator j = i->second.find(oid);
+ std::map<std::string,ObjectDesc>::iterator j = i->second.find(oid);
if (j != i->second.end()) {
new_obj = j->second;
break;
return new_obj;
}
- void rm_object_attrs(const string &oid, const set<string> &attrs)
+ void rm_object_attrs(const std::string &oid, const std::set<std::string> &attrs)
{
ObjectDesc new_obj = get_most_recent(oid);
- for (set<string>::const_iterator i = attrs.begin();
+ for (std::set<std::string>::const_iterator i = attrs.begin();
i != attrs.end();
++i) {
new_obj.attrs.erase(*i);
pool_obj_cont[current_snap].insert_or_assign(oid, new_obj);
}
- void remove_object_header(const string &oid)
+ void remove_object_header(const std::string &oid)
{
ObjectDesc new_obj = get_most_recent(oid);
new_obj.header = bufferlist();
}
- void update_object_header(const string &oid, const bufferlist &bl)
+ void update_object_header(const std::string &oid, const bufferlist &bl)
{
ObjectDesc new_obj = get_most_recent(oid);
new_obj.header = bl;
pool_obj_cont[current_snap].insert_or_assign(oid, new_obj);
}
- void update_object_attrs(const string &oid, const map<string, ContDesc> &attrs)
+ void update_object_attrs(const std::string &oid, const std::map<std::string, ContDesc> &attrs)
{
ObjectDesc new_obj = get_most_recent(oid);
- for (map<string, ContDesc>::const_iterator i = attrs.begin();
- i != attrs.end();
+ for (auto i = attrs.cbegin();
+ i != attrs.cend();
++i) {
new_obj.attrs[i->first] = i->second;
}
}
void update_object(ContentsGenerator *cont_gen,
- const string &oid, const ContDesc &contents)
+ const std::string &oid, const ContDesc &contents)
{
ObjectDesc new_obj = get_most_recent(oid);
new_obj.exists = true;
pool_obj_cont[current_snap].insert_or_assign(oid, new_obj);
}
- void update_object_full(const string &oid, const ObjectDesc &contents)
+ void update_object_full(const std::string &oid, const ObjectDesc &contents)
{
pool_obj_cont[current_snap].insert_or_assign(oid, contents);
pool_obj_cont[current_snap][oid].dirty = true;
}
- void update_object_undirty(const string &oid)
+ void update_object_undirty(const std::string &oid)
{
ObjectDesc new_obj = get_most_recent(oid);
new_obj.dirty = false;
pool_obj_cont[current_snap].insert_or_assign(oid, new_obj);
}
- void update_object_version(const string &oid, uint64_t version,
+ void update_object_version(const std::string &oid, uint64_t version,
int snap = -1)
{
- for (map<int, map<string,ObjectDesc> >::reverse_iterator i =
- pool_obj_cont.rbegin();
+ for (auto i = pool_obj_cont.rbegin();
i != pool_obj_cont.rend();
++i) {
if (snap != -1 && snap < i->first)
continue;
- map<string,ObjectDesc>::iterator j = i->second.find(oid);
+ std::map<std::string,ObjectDesc>::iterator j = i->second.find(oid);
if (j != i->second.end()) {
if (version)
j->second.version = version;
- cout << __func__ << " oid " << oid
- << " v " << version << " " << j->second.most_recent()
- << " " << (j->second.dirty ? "dirty" : "clean")
- << " " << (j->second.exists ? "exists" : "dne")
- << std::endl;
+ std::cout << __func__ << " oid " << oid
+ << " v " << version << " " << j->second.most_recent()
+ << " " << (j->second.dirty ? "dirty" : "clean")
+ << " " << (j->second.exists ? "exists" : "dne")
+ << std::endl;
break;
}
}
}
- void remove_object(const string &oid)
+ void remove_object(const std::string &oid)
{
ceph_assert(!get_watch_context(oid));
ObjectDesc new_obj;
pool_obj_cont[current_snap].insert_or_assign(oid, new_obj);
}
- bool find_object(const string &oid, ObjectDesc *contents, int snap = -1) const
+ bool find_object(const std::string &oid, ObjectDesc *contents, int snap = -1) const
{
- for (map<int, map<string,ObjectDesc> >::const_reverse_iterator i =
- pool_obj_cont.rbegin();
- i != pool_obj_cont.rend();
+ for (auto i = pool_obj_cont.crbegin();
+ i != pool_obj_cont.crend();
++i) {
if (snap != -1 && snap < i->first) continue;
if (i->second.count(oid) != 0) {
return false;
}
- void update_object_redirect_target(const string &oid, const string &target)
+ void update_object_redirect_target(const std::string &oid, const std::string &target)
{
redirect_objs[oid] = target;
}
- void update_object_chunk_target(const string &oid, uint64_t offset, const ChunkDesc &info)
+ void update_object_chunk_target(const std::string &oid, uint64_t offset, const ChunkDesc &info)
{
- for (map<int, map<string,ObjectDesc> >::const_reverse_iterator i =
- pool_obj_cont.rbegin();
- i != pool_obj_cont.rend();
+ for (auto i = pool_obj_cont.crbegin();
+ i != pool_obj_cont.crend();
++i) {
if (i->second.count(oid) != 0) {
ObjectDesc obj_desc = i->second.find(oid)->second;
return;
}
- bool object_existed_at(const string &oid, int snap = -1) const
+ bool object_existed_at(const std::string &oid, int snap = -1) const
{
ObjectDesc contents;
bool found = find_object(oid, &contents, snap);
void remove_snap(int snap)
{
- map<int, map<string,ObjectDesc> >::iterator next_iter = pool_obj_cont.find(snap);
+ std::map<int, std::map<std::string,ObjectDesc> >::iterator next_iter = pool_obj_cont.find(snap);
ceph_assert(next_iter != pool_obj_cont.end());
- map<int, map<string,ObjectDesc> >::iterator current_iter = next_iter++;
+ std::map<int, std::map<std::string,ObjectDesc> >::iterator current_iter = next_iter++;
ceph_assert(current_iter != pool_obj_cont.end());
- map<string,ObjectDesc> ¤t = current_iter->second;
- map<string,ObjectDesc> &next = next_iter->second;
- for (map<string,ObjectDesc>::iterator i = current.begin();
- i != current.end();
- ++i) {
+ std::map<std::string,ObjectDesc> ¤t = current_iter->second;
+ std::map<std::string,ObjectDesc> &next = next_iter->second;
+ for (auto i = current.begin(); i != current.end(); ++i) {
if (next.count(i->first) == 0) {
- next.insert(pair<string,ObjectDesc>(i->first, i->second));
+ next.insert(std::pair<std::string,ObjectDesc>(i->first, i->second));
}
}
pool_obj_cont.erase(current_iter);
seq = snap;
}
- void roll_back(const string &oid, int snap)
+ void roll_back(const std::string &oid, int snap)
{
ceph_assert(!get_watch_context(oid));
ObjectDesc contents;
pool_obj_cont.rbegin()->second.insert_or_assign(oid, contents);
}
- void update_object_tier_flushed(const string &oid, int snap)
+ void update_object_tier_flushed(const std::string &oid, int snap)
{
- for (map<int, map<string,ObjectDesc> >::reverse_iterator i =
- pool_obj_cont.rbegin();
+ for (auto i = pool_obj_cont.rbegin();
i != pool_obj_cont.rend();
++i) {
if (snap != -1 && snap < i->first)
continue;
- map<string,ObjectDesc>::iterator j = i->second.find(oid);
+ std::map<std::string,ObjectDesc>::iterator j = i->second.find(oid);
if (j != i->second.end()) {
j->second.flushed = true;
break;
}
}
- bool check_oldest_snap_flushed(const string &oid, int snap)
+ bool check_oldest_snap_flushed(const std::string &oid, int snap)
{
- for (map<int, map<string,ObjectDesc> >::reverse_iterator i =
- pool_obj_cont.rbegin();
+ for (auto i = pool_obj_cont.rbegin();
i != pool_obj_cont.rend();
++i) {
if (snap != -1 && snap < i->first)
continue;
- map<string,ObjectDesc>::iterator j = i->second.find(oid);
+ std::map<std::string,ObjectDesc>::iterator j = i->second.find(oid);
if (j != i->second.end() && !j->second.flushed) {
- cout << __func__ << " oid " << oid
- << " v " << j->second.version << " " << j->second.most_recent()
- << " " << (j->second.flushed ? "flushed" : "unflushed")
- << " " << i->first << std::endl;
+ std::cout << __func__ << " oid " << oid
+ << " v " << j->second.version << " " << j->second.most_recent()
+ << " " << (j->second.flushed ? "flushed" : "unflushed")
+ << " " << i->first << std::endl;
return false;
}
}
std::vector<librados::ObjectItem> result;
int r = chunk_pool_ctx.object_list(c, shard_end, 12, {}, &result, &c);
if (r < 0) {
- cerr << "error object_list : " << cpp_strerror(r) << std::endl;
+ std::cerr << "error object_list : " << cpp_strerror(r) << std::endl;
return false;
}
break;
}
if (src_refcount > dst_refcount) {
- cerr << " src_object " << pp
+ std::cerr << " src_object " << pp
<< ": src_refcount " << src_refcount
<< ", dst_object " << oid
<< ": dst_refcount " << dst_refcount
/// entries if @c no_omap is not specified in context
class RemoveAttrsOp : public TestOp {
public:
- string oid;
+ std::string oid;
librados::ObjectWriteOperation op;
librados::AioCompletion *comp;
RemoveAttrsOp(int n, RadosTestContext *context,
- const string &oid,
+ const std::string &oid,
TestOpStat *stat)
: TestOp(n, context, stat), oid(oid), comp(NULL)
{}
void _begin() override
{
ContDesc cont;
- set<string> to_remove;
+ std::set<std::string> to_remove;
{
std::lock_guard l{context->state_lock};
ObjectDesc obj;
if (rand() % 30) {
ContentsGenerator::iterator iter = context->attr_gen.get_iterator(cont);
- for (map<string, ContDesc>::iterator i = obj.attrs.begin();
+ for (auto i = obj.attrs.begin();
i != obj.attrs.end();
++i, ++iter) {
if (!(*iter % 3)) {
if (!context->no_omap) {
op.omap_clear();
}
- for (map<string, ContDesc>::iterator i = obj.attrs.begin();
+ for (auto i = obj.attrs.begin();
i != obj.attrs.end();
++i) {
op.rmxattr(i->first.c_str());
context->rm_object_attrs(oid, to_remove);
}
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
comp = context->rados.aio_create_completion((void*) cb_arg,
&write_callback);
return done;
}
- string getType() override
+ std::string getType() override
{
return "RemoveAttrsOp";
}
/// entries if @c no_omap is not specified in context
class SetAttrsOp : public TestOp {
public:
- string oid;
+ std::string oid;
librados::ObjectWriteOperation op;
librados::AioCompletion *comp;
SetAttrsOp(int n,
RadosTestContext *context,
- const string &oid,
+ const std::string &oid,
TestOpStat *stat)
: TestOp(n, context, stat),
oid(oid), comp(NULL)
context->oid_not_in_use.erase(oid);
}
- map<string, bufferlist> omap_contents;
- map<string, ContDesc> omap;
+ std::map<std::string, bufferlist> omap_contents;
+ std::map<std::string, ContDesc> omap;
bufferlist header;
ContentsGenerator::iterator keygen = context->attr_gen.get_iterator(cont);
op.create(false);
++keygen;
}
for (int i = 0; i < 20; ++i) {
- string key;
+ std::string key;
while (!*keygen) ++keygen;
while (*keygen && key.size() < 40) {
key.push_back((*keygen % 20) + 'a');
context->update_object_attrs(oid, omap);
}
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
comp = context->rados.aio_create_completion((void*) cb_arg, &write_callback);
context->io_ctx.aio_operate(context->prefix+oid, comp, &op);
std::lock_guard l{context->state_lock};
int r;
if ((r = comp->get_return_value())) {
- cerr << "err " << r << std::endl;
+ std::cerr << "err " << r << std::endl;
ceph_abort();
}
done = true;
return done;
}
- string getType() override
+ std::string getType() override
{
return "SetAttrsOp";
}
class WriteOp : public TestOp {
public:
- const string oid;
+ const std::string oid;
ContDesc cont;
- set<librados::AioCompletion *> waiting;
+ std::set<librados::AioCompletion *> waiting;
librados::AioCompletion *rcompletion = nullptr;
// numbers of async ops submitted
uint64_t waiting_on = 0;
WriteOp(int n,
RadosTestContext *context,
- const string &oid,
+ const std::string &oid,
bool do_append,
bool do_excl,
TestOpStat *stat = 0)
void _begin() override
{
assert(!done);
- stringstream acc;
+ std::stringstream acc;
std::lock_guard state_locker{context->state_lock};
acc << context->prefix << "OID: " << oid << " snap " << context->current_snap << std::endl;
- string prefix = acc.str();
+ std::string prefix = acc.str();
cont = ContDesc(context->seq_num, context->current_snap, context->seq_num, prefix);
context->oid_in_use.insert(oid);
context->oid_not_in_use.erase(oid);
- map<uint64_t, uint64_t> ranges;
+ std::map<uint64_t, uint64_t> ranges;
cont_gen->get_ranges_map(cont, ranges);
std::cout << num << ": seq_num " << context->seq_num << " ranges " << ranges << std::endl;
<< " from " << offset
<< " to " << len + offset << " tid " << tid << std::endl;
auto cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(tid++));
librados::AioCompletion *completion =
context->rados.aio_create_completion((void*) cb_arg, &write_callback);
bufferlist contbl;
encode(cont, contbl);
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(
this,
new TestOp::CallbackInfo(tid++));
librados::AioCompletion *completion = context->rados.aio_create_completion(
context->prefix+oid, completion, &write_op);
cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(
this,
new TestOp::CallbackInfo(tid++));
rcompletion = context->rados.aio_create_completion(
std::lock_guard state_locker{context->state_lock};
uint64_t tid = info->id;
- cout << num << ": finishing write tid " << tid << " to " << context->prefix + oid << std::endl;
+ std::cout << num << ": finishing write tid " << tid << " to " << context->prefix + oid << std::endl;
if (tid <= last_acked_tid) {
- cerr << "Error: finished tid " << tid
+ std::cerr << "Error: finished tid " << tid
<< " when last_acked_tid was " << last_acked_tid << std::endl;
ceph_abort();
}
waiting_on--;
if (waiting_on == 0) {
uint64_t version = 0;
- for (set<librados::AioCompletion *>::iterator i = waiting.begin();
- i != waiting.end();
- ) {
+ for (auto i = waiting.begin(); i != waiting.end();) {
ceph_assert((*i)->is_complete());
if (int err = (*i)->get_return_value()) {
- cerr << "Error: oid " << oid << " write returned error code "
- << err << std::endl;
+ std::cerr << "Error: oid " << oid << " write returned error code "
+ << err << std::endl;
}
if ((*i)->get_version64() > version)
version = (*i)->get_version64();
(*i)->release();
waiting.erase(i++);
}
-
+
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;
+ std::cerr << "Error: racing read on " << oid << " returned version "
+ << rcompletion->get_version64() << " rather than version "
+ << version << std::endl;
ceph_abort_msg("racing read got wrong version");
}
return done;
}
- string getType() override
+ std::string getType() override
{
return "WriteOp";
}
class WriteSameOp : public TestOp {
public:
- string oid;
+ std::string oid;
ContDesc cont;
- set<librados::AioCompletion *> waiting;
+ std::set<librados::AioCompletion *> waiting;
librados::AioCompletion *rcompletion;
uint64_t waiting_on;
uint64_t last_acked_tid;
WriteSameOp(int n,
RadosTestContext *context,
- const string &oid,
+ const std::string &oid,
TestOpStat *stat = 0)
: TestOp(n, context, stat),
oid(oid), rcompletion(NULL), waiting_on(0),
{
std::lock_guard state_locker{context->state_lock};
done = 0;
- stringstream acc;
+ std::stringstream acc;
acc << context->prefix << "OID: " << oid << " snap " << context->current_snap << std::endl;
- string prefix = acc.str();
+ std::string prefix = acc.str();
cont = ContDesc(context->seq_num, context->current_snap, context->seq_num, prefix);
context->oid_in_use.insert(oid);
context->oid_not_in_use.erase(oid);
- map<uint64_t, uint64_t> ranges;
+ std::map<uint64_t, uint64_t> ranges;
cont_gen->get_ranges_map(cont, ranges);
std::cout << num << ": seq_num " << context->seq_num << " ranges " << ranges << std::endl;
<< " from " << offset
<< " to " << offset + len << " tid " << tid << std::endl;
auto cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(tid++));
librados::AioCompletion *completion =
context->rados.aio_create_completion((void*) cb_arg,
bufferlist contbl;
encode(cont, contbl);
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(
this,
new TestOp::CallbackInfo(tid++));
librados::AioCompletion *completion = context->rados.aio_create_completion(
context->prefix+oid, completion, &write_op);
cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(
this,
new TestOp::CallbackInfo(tid++));
rcompletion = context->rados.aio_create_completion(
std::lock_guard state_locker{context->state_lock};
uint64_t tid = info->id;
- cout << num << ": finishing writesame tid " << tid << " to " << context->prefix + oid << std::endl;
+ std::cout << num << ": finishing writesame tid " << tid << " to " << context->prefix + oid << std::endl;
if (tid <= last_acked_tid) {
- cerr << "Error: finished tid " << tid
+ std::cerr << "Error: finished tid " << tid
<< " when last_acked_tid was " << last_acked_tid << std::endl;
ceph_abort();
}
waiting_on--;
if (waiting_on == 0) {
uint64_t version = 0;
- for (set<librados::AioCompletion *>::iterator i = waiting.begin();
- i != waiting.end();
- ) {
+ for (auto i = waiting.begin(); i != waiting.end();) {
ceph_assert((*i)->is_complete());
if (int err = (*i)->get_return_value()) {
- cerr << "Error: oid " << oid << " writesame returned error code "
+ std::cerr << "Error: oid " << oid << " writesame returned error code "
<< err << std::endl;
}
if ((*i)->get_version64() > version)
ceph_assert(rcompletion->is_complete());
ceph_assert(rcompletion->get_return_value() == 1);
if (rcompletion->get_version64() != version) {
- cerr << "Error: racing read on " << oid << " returned version "
- << rcompletion->get_version64() << " rather than version "
- << version << std::endl;
+ std::cerr << "Error: racing read on " << oid << " returned version "
+ << rcompletion->get_version64() << " rather than version "
+ << version << std::endl;
ceph_abort_msg("racing read got wrong version");
}
rcompletion->release();
return done;
}
- string getType() override
+ std::string getType() override
{
return "WriteSameOp";
}
class DeleteOp : public TestOp {
public:
- string oid;
+ std::string oid;
DeleteOp(int n,
RadosTestContext *context,
- const string &oid,
+ const std::string &oid,
TestOpStat *stat = 0)
: TestOp(n, context, stat), oid(oid)
{}
r = context->io_ctx.remove(context->prefix+oid);
}
if (r && !(r == -ENOENT && !present)) {
- cerr << "r is " << r << " while deleting " << oid << " and present is " << present << std::endl;
+ std::cerr << "r is " << r << " while deleting " << oid << " and present is " << present << std::endl;
ceph_abort();
}
context->kick();
}
- string getType() override
+ std::string getType() override
{
return "DeleteOp";
}
class ReadOp : public TestOp {
public:
- vector<librados::AioCompletion *> completions;
+ std::vector<librados::AioCompletion *> completions;
librados::ObjectReadOperation op;
- string oid;
+ std::string oid;
ObjectDesc old_value;
int snap;
bool balance_reads;
std::shared_ptr<int> in_use;
- vector<bufferlist> results;
- vector<int> retvals;
- vector<std::map<uint64_t, uint64_t>> extent_results;
- vector<bool> is_sparse_read;
+ std::vector<bufferlist> results;
+ std::vector<int> retvals;
+ std::vector<std::map<uint64_t, uint64_t>> extent_results;
+ std::vector<bool> is_sparse_read;
uint64_t waiting_on;
- vector<bufferlist> checksums;
- vector<int> checksum_retvals;
+ std::vector<bufferlist> checksums;
+ std::vector<int> checksum_retvals;
- map<string, bufferlist> attrs;
+ std::map<std::string, bufferlist> attrs;
int attrretval;
- set<string> omap_requested_keys;
- map<string, bufferlist> omap_returned_values;
- set<string> omap_keys;
- map<string, bufferlist> omap;
+ std::set<std::string> omap_requested_keys;
+ std::map<std::string, bufferlist> omap_returned_values;
+ std::set<std::string> omap_keys;
+ std::map<std::string, bufferlist> omap;
bufferlist header;
- map<string, bufferlist> xattrs;
+ std::map<std::string, bufferlist> xattrs;
ReadOp(int n,
RadosTestContext *context,
- const string &oid,
+ const std::string &oid,
bool balance_reads,
bool localize_reads,
TestOpStat *stat = 0)
context->io_ctx.snap_set_read(context->snaps[snap]);
}
_do_read(op, 0);
- for (map<string, ContDesc>::iterator i = old_value.attrs.begin();
- i != old_value.attrs.end();
- ++i) {
+ for (auto i = old_value.attrs.begin(); i != old_value.attrs.end(); ++i) {
if (rand() % 2) {
- string key = i->first;
+ std::string key = i->first;
if (rand() % 2)
key.push_back((rand() % 26) + 'a');
omap_requested_keys.insert(key);
context->oid_in_use.erase(oid);
context->oid_not_in_use.insert(oid);
int retval = completions[0]->get_return_value();
- for (vector<librados::AioCompletion *>::iterator it = completions.begin();
+ for (auto it = completions.begin();
it != completions.end(); ++it) {
ceph_assert((*it)->is_complete());
uint64_t version = (*it)->get_version64();
int err = (*it)->get_return_value();
if (err != retval) {
- cerr << num << ": Error: oid " << oid << " read returned different error codes: "
+ std::cerr << num << ": Error: oid " << oid << " read returned different error codes: "
<< retval << " and " << err << std::endl;
ceph_abort();
}
if (err) {
if (!(err == -ENOENT && old_value.deleted())) {
- cerr << num << ": Error: oid " << oid << " read returned error code "
+ std::cerr << num << ": Error: oid " << oid << " read returned error code "
<< err << std::endl;
ceph_abort();
}
} else if (version != old_value.version) {
- cerr << num << ": oid " << oid << " version is " << version
- << " and expected " << old_value.version << std::endl;
+ std::cerr << num << ": oid " << oid << " version is " << version
+ << " and expected " << old_value.version << std::endl;
ceph_assert(version == old_value.version);
}
}
if (!retval) {
- map<string, bufferlist>::iterator iter = xattrs.find("_header");
+ std::map<std::string, bufferlist>::iterator iter = xattrs.find("_header");
bufferlist headerbl;
if (iter == xattrs.end()) {
if (old_value.has_contents()) {
- cerr << num << ": Error: did not find header attr, has_contents: "
+ std::cerr << num << ": Error: did not find header attr, has_contents: "
<< old_value.has_contents()
<< std::endl;
ceph_assert(!old_value.has_contents());
auto p = headerbl.cbegin();
decode(to_check, p);
if (to_check != old_value.most_recent()) {
- cerr << num << ": oid " << oid << " found incorrect object contents " << to_check
+ std::cerr << num << ": oid " << oid << " found incorrect object contents " << to_check
<< ", expected " << old_value.most_recent() << std::endl;
context->errors++;
}
for (unsigned i = 0; i < results.size(); i++) {
if (is_sparse_read[i]) {
if (!old_value.check_sparse(extent_results[i], results[i])) {
- cerr << num << ": oid " << oid << " contents " << to_check << " corrupt" << std::endl;
+ std::cerr << num << ": oid " << oid << " contents " << to_check << " corrupt" << std::endl;
context->errors++;
}
} else {
if (!old_value.check(results[i])) {
- cerr << num << ": oid " << oid << " contents " << to_check << " corrupt" << std::endl;
+ std::cerr << num << ": oid " << oid << " contents " << to_check << " corrupt" << std::endl;
context->errors++;
}
}
}
if (checksum_retvals[i] != 0 || checksum != results[i].crc32c(-1)) {
- cerr << num << ": oid " << oid << " checksum " << checksums[i]
+ std::cerr << num << ": oid " << oid << " checksum " << checksums[i]
<< " incorrect, expecting " << results[i].crc32c(-1)
<< std::endl;
context->errors++;
// Attributes
if (!context->no_omap) {
if (!(old_value.header == header)) {
- cerr << num << ": oid " << oid << " header does not match, old size: "
+ std::cerr << num << ": oid " << oid << " header does not match, old size: "
<< old_value.header.length() << " new size " << header.length()
<< std::endl;
ceph_assert(old_value.header == header);
}
if (omap.size() != old_value.attrs.size()) {
- cerr << num << ": oid " << oid << " omap.size() is " << omap.size()
+ std::cerr << num << ": oid " << oid << " omap.size() is " << omap.size()
<< " and old is " << old_value.attrs.size() << std::endl;
ceph_assert(omap.size() == old_value.attrs.size());
}
if (omap_keys.size() != old_value.attrs.size()) {
- cerr << num << ": oid " << oid << " omap.size() is " << omap_keys.size()
+ std::cerr << num << ": oid " << oid << " omap.size() is " << omap_keys.size()
<< " and old is " << old_value.attrs.size() << std::endl;
ceph_assert(omap_keys.size() == old_value.attrs.size());
}
}
if (xattrs.size() != old_value.attrs.size()) {
- cerr << num << ": oid " << oid << " xattrs.size() is " << xattrs.size()
- << " and old is " << old_value.attrs.size() << std::endl;
+ std::cerr << num << ": oid " << oid << " xattrs.size() is " << xattrs.size()
+ << " and old is " << old_value.attrs.size() << std::endl;
ceph_assert(xattrs.size() == old_value.attrs.size());
}
- for (map<string, ContDesc>::iterator iter = old_value.attrs.begin();
+ for (auto iter = old_value.attrs.begin();
iter != old_value.attrs.end();
++iter) {
bufferlist bl = context->attr_gen.gen_bl(
iter->second);
if (!context->no_omap) {
- map<string, bufferlist>::iterator omap_iter = omap.find(iter->first);
+ std::map<std::string, bufferlist>::iterator omap_iter = omap.find(iter->first);
ceph_assert(omap_iter != omap.end());
ceph_assert(bl.length() == omap_iter->second.length());
bufferlist::iterator k = bl.begin();
ceph_assert(*l == *k);
}
}
- map<string, bufferlist>::iterator xattr_iter = xattrs.find(iter->first);
+ auto xattr_iter = xattrs.find(iter->first);
ceph_assert(xattr_iter != xattrs.end());
ceph_assert(bl.length() == xattr_iter->second.length());
bufferlist::iterator k = bl.begin();
}
}
if (!context->no_omap) {
- for (set<string>::iterator i = omap_requested_keys.begin();
+ for (std::set<std::string>::iterator i = omap_requested_keys.begin();
i != omap_requested_keys.end();
++i) {
if (!omap_returned_values.count(*i))
if (!old_value.attrs.count(*i))
ceph_assert(!omap_returned_values.count(*i));
}
- for (map<string, bufferlist>::iterator i = omap_returned_values.begin();
+ for (auto i = omap_returned_values.begin();
i != omap_returned_values.end();
++i) {
ceph_assert(omap_requested_keys.count(i->first));
}
}
}
- for (vector<librados::AioCompletion *>::iterator it = completions.begin();
- it != completions.end(); ++it) {
+ for (auto it = completions.begin(); it != completions.end(); ++it) {
(*it)->release();
}
context->kick();
return done;
}
- string getType() override
+ std::string getType() override
{
return "ReadOp";
}
void _begin() override
{
uint64_t snap;
- string snapname;
+ std::string snapname;
if (context->pool_snaps) {
- stringstream ss;
+ std::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;
+ std::cerr << "snap_create returned " << ret << std::endl;
ceph_abort();
}
ceph_assert(!context->io_ctx.snap_lookup(snapname.c_str(), &snap));
context->add_snap(snap);
if (!context->pool_snaps) {
- vector<uint64_t> snapset(context->snaps.size());
+ std::vector<uint64_t> snapset(context->snaps.size());
int j = 0;
- for (map<int,uint64_t>::reverse_iterator i = context->snaps.rbegin();
+ for (auto 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;
+ std::cerr << "r is " << r << " snapset is " << snapset << " seq is " << context->seq << std::endl;
ceph_abort();
}
}
}
- string getType() override
+ std::string getType() override
{
return "SnapCreateOp";
}
context->remove_snap(to_remove);
if (context->pool_snaps) {
- string snapname;
+ std::string snapname;
ceph_assert(!context->io_ctx.snap_get_name(snap, &snapname));
ceph_assert(!context->io_ctx.snap_remove(snapname.c_str()));
} else {
ceph_assert(!context->io_ctx.selfmanaged_snap_remove(snap));
- vector<uint64_t> snapset(context->snaps.size());
+ std::vector<uint64_t> snapset(context->snaps.size());
int j = 0;
- for (map<int,uint64_t>::reverse_iterator i = context->snaps.rbegin();
+ for (auto 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;
+ std::cerr << "r is " << r << " snapset is " << snapset << " seq is " << context->seq << std::endl;
ceph_abort();
}
}
}
- string getType() override
+ std::string getType() override
{
return "SnapRemoveOp";
}
};
class WatchOp : public TestOp {
- string oid;
+ std::string oid;
public:
WatchOp(int n,
RadosTestContext *context,
- const string &_oid,
+ const std::string &_oid,
TestOpStat *stat = 0)
: TestOp(n, context, stat),
oid(_oid)
}
if (r) {
- cerr << "r is " << r << std::endl;
+ std::cerr << "r is " << r << std::endl;
ceph_abort();
}
}
}
- string getType() override
+ std::string getType() override
{
return "WatchOp";
}
class RollbackOp : public TestOp {
public:
- string oid;
+ std::string oid;
int roll_back_to;
librados::ObjectWriteOperation zero_write_op1;
librados::ObjectWriteOperation zero_write_op2;
librados::ObjectWriteOperation op;
- vector<librados::AioCompletion *> comps;
+ std::vector<librados::AioCompletion *> comps;
std::shared_ptr<int> in_use;
int last_finished;
int outstanding;
RollbackOp(int n,
RadosTestContext *context,
- const string &_oid,
+ const std::string &_oid,
TestOpStat *stat = 0)
: TestOp(n, context, stat),
oid(_oid), roll_back_to(-1),
roll_back_to);
- cout << "rollback oid " << oid << " to " << roll_back_to << std::endl;
+ std::cout << "rollback oid " << oid << " to " << roll_back_to << std::endl;
bool existed_before = context->object_existed_at(oid);
bool existed_after = context->object_existed_at(oid, roll_back_to);
}
if (existed_before) {
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
comps[0] =
context->rados.aio_create_completion((void*) cb_arg,
context->prefix+oid, comps[0], &zero_write_op1);
}
{
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(1));
comps[1] =
context->rados.aio_create_completion((void*) cb_arg,
context->prefix+oid, comps[1], &op);
}
if (existed_after) {
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(2));
comps[2] =
context->rados.aio_create_completion((void*) cb_arg,
{
std::lock_guard l{context->state_lock};
uint64_t tid = info->id;
- cout << num << ": finishing rollback tid " << tid
+ std::cout << num << ": finishing rollback tid " << tid
<< " to " << context->prefix + oid << std::endl;
ceph_assert((int)(info->id) > last_finished);
last_finished = info->id;
int r;
if ((r = comps[last_finished]->get_return_value()) != 0) {
- cerr << "err " << r << std::endl;
+ std::cerr << "err " << r << std::endl;
ceph_abort();
}
if (--outstanding == 0) {
return done;
}
- string getType() override
+ std::string getType() override
{
return "RollBackOp";
}
class CopyFromOp : public TestOp {
public:
- string oid, oid_src;
+ std::string oid, oid_src;
ObjectDesc src_value;
librados::ObjectWriteOperation op;
librados::ObjectReadOperation rd_op;
int r;
CopyFromOp(int n,
RadosTestContext *context,
- const string &oid,
- const string &oid_src,
+ const std::string &oid,
+ const std::string &oid_src,
TestOpStat *stat)
: TestOp(n, context, stat),
oid(oid), oid_src(oid_src),
context->update_object_full(oid, src_value);
}
- string src = context->prefix+oid_src;
+ std::string src = context->prefix+oid_src;
op.copy_from(src.c_str(), context->io_ctx, src_value.version, 0);
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
comp = context->rados.aio_create_completion((void*) cb_arg,
&write_callback);
context->io_ctx.aio_operate(context->prefix+oid, comp, &op);
// queue up a racing read, too.
- pair<TestOp*, TestOp::CallbackInfo*> *read_cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *read_cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(1));
comp_racing_read = context->rados.aio_create_completion((void*) read_cb_arg, &write_callback);
rd_op.stat(NULL, NULL, NULL);
if (info->id == 0) {
// copy_from
ceph_assert(comp->is_complete());
- cout << num << ": finishing copy_from to " << context->prefix + oid << std::endl;
+ std::cout << num << ": finishing copy_from to " << context->prefix + oid << std::endl;
if ((r = comp->get_return_value())) {
if (r == -ENOENT && src_value.deleted()) {
- cout << num << ": got expected ENOENT (src dne)" << std::endl;
+ std::cout << num << ": got expected ENOENT (src dne)" << std::endl;
} else {
- cerr << "Error: oid " << oid << " copy_from " << oid_src << " returned error code "
+ std::cerr << "Error: oid " << oid << " copy_from " << oid_src << " returned error code "
<< r << std::endl;
ceph_abort();
}
} else if (info->id == 1) {
// racing read
ceph_assert(comp_racing_read->is_complete());
- cout << num << ": finishing copy_from racing read to " << context->prefix + oid << std::endl;
+ std::cout << num << ": finishing copy_from racing read to " << context->prefix + oid << std::endl;
if ((r = comp_racing_read->get_return_value())) {
if (!(r == -ENOENT && src_value.deleted())) {
- cerr << "Error: oid " << oid << " copy_from " << oid_src << " returned error code "
+ std::cerr << "Error: oid " << oid << " copy_from " << oid_src << " returned error code "
<< r << std::endl;
}
} else {
return done == 2;
}
- string getType() override
+ std::string getType() override
{
return "CopyFromOp";
}
class ChunkReadOp : public TestOp {
public:
- vector<librados::AioCompletion *> completions;
+ std::vector<librados::AioCompletion *> completions;
librados::ObjectReadOperation op;
- string oid;
+ std::string oid;
ObjectDesc old_value;
ObjectDesc tgt_value;
int snap;
std::shared_ptr<int> in_use;
- vector<bufferlist> results;
- vector<int> retvals;
- vector<bool> is_sparse_read;
+ std::vector<bufferlist> results;
+ std::vector<int> retvals;
+ std::vector<bool> is_sparse_read;
uint64_t waiting_on;
- vector<bufferlist> checksums;
- vector<int> checksum_retvals;
+ std::vector<bufferlist> checksums;
+ std::vector<int> checksum_retvals;
uint32_t offset = 0;
uint32_t length = 0;
- string tgt_oid;
- string tgt_pool_name;
+ std::string tgt_oid;
+ std::string tgt_pool_name;
uint32_t tgt_offset = 0;
ChunkReadOp(int n,
RadosTestContext *context,
- const string &oid,
- const string &tgt_pool_name,
+ const std::string &oid,
+ const std::string &tgt_pool_name,
bool balance_reads,
bool localize_reads,
TestOpStat *stat = 0)
ceph_assert(completions[i]->is_complete());
int err = completions[i]->get_return_value();
if (err != retval) {
- cerr << num << ": Error: oid " << oid << " read returned different error codes: "
+ std::cerr << num << ": Error: oid " << oid << " read returned different error codes: "
<< retval << " and " << err << std::endl;
ceph_abort();
}
if (err) {
if (!(err == -ENOENT && old_value.deleted())) {
- cerr << num << ": Error: oid " << oid << " read returned error code "
+ std::cerr << num << ": Error: oid " << oid << " read returned error code "
<< err << std::endl;
ceph_abort();
}
}
if (checksum_retvals[1] != 0) {
- cerr << num << ": oid " << oid << " checksum retvals " << checksums[0]
+ std::cerr << num << ": oid " << oid << " checksum retvals " << checksums[0]
<< " error " << std::endl;
context->errors++;
}
checksum[0] = results[0].crc32c(-1);
if (checksum[0] != checksum[1]) {
- cerr << num << ": oid " << oid << " checksum src " << checksum[0]
+ std::cerr << num << ": oid " << oid << " checksum src " << checksum[0]
<< " chunksum tgt " << checksum[1] << " incorrect, expecting "
<< results[0].crc32c(-1)
<< std::endl;
if (context->errors) ceph_abort();
}
}
- for (vector<librados::AioCompletion *>::iterator it = completions.begin();
- it != completions.end(); ++it) {
+ for (auto it = completions.begin(); it != completions.end(); ++it) {
(*it)->release();
}
context->kick();
return done;
}
- string getType() override
+ std::string getType() override
{
return "ChunkReadOp";
}
class CopyOp : public TestOp {
public:
- string oid, oid_src, tgt_pool_name;
+ std::string oid, oid_src, tgt_pool_name;
librados::ObjectWriteOperation op;
librados::ObjectReadOperation rd_op;
librados::AioCompletion *comp;
int r;
CopyOp(int n,
RadosTestContext *context,
- const string &oid_src,
- const string &oid,
- const string &tgt_pool_name,
+ const std::string &oid_src,
+ const std::string &oid,
+ const std::string &tgt_pool_name,
TestOpStat *stat = 0)
: TestOp(n, context, stat),
oid(oid), oid_src(oid_src), tgt_pool_name(tgt_pool_name),
context->oid_in_use.insert(oid_src);
context->oid_not_in_use.erase(oid_src);
- string src = context->prefix+oid_src;
+ std::string src = context->prefix+oid_src;
context->find_object(oid_src, &src_value);
op.copy_from(src.c_str(), context->io_ctx, src_value.version, 0);
- cout << "copy op oid " << oid_src << " to " << oid << " tgt_pool_name " << tgt_pool_name << std::endl;
+ std::cout << "copy op oid " << oid_src << " to " << oid << " tgt_pool_name " << tgt_pool_name << std::endl;
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
comp = context->rados.aio_create_completion((void*) cb_arg, &write_callback);
if (tgt_pool_name == context->low_tier_pool_name) {
if (info->id == 0) {
ceph_assert(comp->is_complete());
- cout << num << ": finishing copy op to oid " << oid << std::endl;
+ std::cout << num << ": finishing copy op to oid " << oid << std::endl;
if ((r = comp->get_return_value())) {
- cerr << "Error: oid " << oid << " write returned error code "
- << r << std::endl;
+ std::cerr << "Error: oid " << oid << " write returned error code "
+ << r << std::endl;
ceph_abort();
}
}
return done == 1;
}
- string getType() override
+ std::string getType() override
{
return "CopyOp";
}
class SetChunkOp : public TestOp {
public:
- string oid, oid_tgt;
+ std::string oid, oid_tgt;
ObjectDesc src_value, tgt_value;
librados::ObjectReadOperation op;
librados::AioCompletion *comp;
std::shared_ptr<int> in_use;
SetChunkOp(int n,
RadosTestContext *context,
- const string &oid,
- const string &oid_tgt,
+ const std::string &oid,
+ const std::string &oid_tgt,
TestOpStat *stat = 0)
: TestOp(n, context, stat),
oid(oid), oid_tgt(oid_tgt),
snap(0)
{}
- pair<uint64_t, uint64_t> get_rand_off_len(uint32_t max_len) {
- pair<uint64_t, uint64_t> r (0, 0);
+ std::pair<uint64_t, uint64_t> get_rand_off_len(uint32_t max_len) {
+ std::pair<uint64_t, uint64_t> r (0, 0);
r.first = rand() % max_len;
r.second = rand() % max_len;
r.first = r.first - (r.first % 512);
} else {
max_len = src_value.most_recent_gen()->get_length(src_value.most_recent());
}
- pair<uint64_t, uint64_t> off_len; // first: offset, second: length
+ std::pair<uint64_t, uint64_t> off_len; // first: offset, second: length
if (snap >= 0) {
context->io_ctx.snap_set_read(context->snaps[snap]);
off_len = get_rand_off_len(max_len);
length = off_len.second;
tgt_offset = offset;
- string target_oid;
+ std::string target_oid;
if (!src_value.deleted() && oid_tgt.empty()) {
bufferlist bl;
int r = context->io_ctx.read(context->prefix+oid, bl, length, offset);
ceph_assert(r > 0);
- string fp_oid = ceph::crypto::digest<ceph::crypto::SHA256>(bl).to_str();
+ std::string fp_oid = ceph::crypto::digest<ceph::crypto::SHA256>(bl).to_str();
r = context->low_tier_io_ctx.write(fp_oid, bl, bl.length(), 0);
ceph_assert(r == 0);
target_oid = fp_oid;
target_oid = context->prefix+oid_tgt;
}
- cout << num << ": " << "set_chunk oid " << oid << " offset: " << offset
+ std::cout << num << ": " << "set_chunk oid " << oid << " offset: " << offset
<< " length: " << length << " target oid " << target_oid
<< " offset: " << tgt_offset << " snap " << snap << std::endl;
op.set_chunk(offset, length, context->low_tier_io_ctx,
target_oid, tgt_offset, CEPH_OSD_OP_FLAG_WITH_REFERENCE);
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
comp = context->rados.aio_create_completion((void*) cb_arg,
&write_callback);
if (info->id == 0) {
ceph_assert(comp->is_complete());
- cout << num << ": finishing set_chunk to oid " << oid << std::endl;
+ std::cout << num << ": finishing set_chunk to oid " << oid << std::endl;
if ((r = comp->get_return_value())) {
if (r == -ENOENT && src_value.deleted()) {
- cout << num << ": got expected ENOENT (src dne)" << std::endl;
+ std::cout << num << ": got expected ENOENT (src dne)" << std::endl;
} else if (r == -ENOENT && context->oid_set_chunk_tgt_pool.find(oid_tgt) !=
context->oid_set_chunk_tgt_pool.end()) {
- cout << num << ": get expected ENOENT tgt oid " << oid_tgt << std::endl;
+ std::cout << num << ": get expected ENOENT tgt oid " << oid_tgt << std::endl;
} else if (r == -ERANGE && src_value.deleted()) {
- cout << num << ": got expected ERANGE (src dne)" << std::endl;
+ std::cout << num << ": got expected ERANGE (src dne)" << std::endl;
} else if (r == -EOPNOTSUPP) {
- cout << "Range is overlapped: oid " << oid << " set_chunk " << oid_tgt << " returned error code "
+ std::cout << "Range is overlapped: oid " << oid << " set_chunk " << oid_tgt << " returned error code "
<< r << " offset: " << offset << " length: " << length << std::endl;
context->update_object_version(oid, comp->get_version64());
} else {
- cerr << "Error: oid " << oid << " set_chunk " << oid_tgt << " returned error code "
+ std::cerr << "Error: oid " << oid << " set_chunk " << oid_tgt << " returned error code "
<< r << std::endl;
ceph_abort();
}
return done == 1;
}
- string getType() override
+ std::string getType() override
{
return "SetChunkOp";
}
class SetRedirectOp : public TestOp {
public:
- string oid, oid_tgt, tgt_pool_name;
+ std::string oid, oid_tgt, tgt_pool_name;
ObjectDesc src_value, tgt_value;
librados::ObjectWriteOperation op;
librados::ObjectReadOperation rd_op;
int r;
SetRedirectOp(int n,
RadosTestContext *context,
- const string &oid,
- const string &oid_tgt,
- const string &tgt_pool_name,
+ const std::string &oid,
+ const std::string &oid_tgt,
+ const std::string &tgt_pool_name,
TestOpStat *stat = 0)
: TestOp(n, context, stat),
oid(oid), oid_tgt(oid_tgt), tgt_pool_name(tgt_pool_name),
if(!context->redirect_objs[oid].empty()) {
/* copy_from oid --> oid_tgt */
comp = context->rados.aio_create_completion();
- string src = context->prefix+oid;
+ std::string src = context->prefix+oid;
op.copy_from(src.c_str(), context->io_ctx, src_value.version, 0);
context->low_tier_io_ctx.aio_operate(context->prefix+oid_tgt, comp, &op,
librados::OPERATION_ORDER_READS_WRITES);
comp->wait_for_complete();
if ((r = comp->get_return_value())) {
- cerr << "Error: oid " << oid << " copy_from " << oid_tgt << " returned error code "
- << r << std::endl;
+ std::cerr << "Error: oid " << oid << " copy_from " << oid_tgt << " returned error code "
+ << r << std::endl;
ceph_abort();
}
comp->release();
comp->wait_for_complete();
if ((r = comp->get_return_value())) {
if (!(r == -ENOENT && !present) && r != -EOPNOTSUPP) {
- cerr << "r is " << r << " while deleting " << oid << " and present is " << present << std::endl;
+ std::cerr << "r is " << r << " while deleting " << oid << " and present is " << present << std::endl;
ceph_abort();
}
}
NULL);
comp->wait_for_complete();
if ((r = comp->get_return_value()) && !src_value.deleted()) {
- cerr << "Error: oid " << oid << " stat returned error code "
+ std::cerr << "Error: oid " << oid << " stat returned error code "
<< r << std::endl;
ceph_abort();
}
NULL);
comp->wait_for_complete();
if ((r = comp->get_return_value())) {
- cerr << "Error: oid " << oid_tgt << " stat returned error code "
+ std::cerr << "Error: oid " << oid_tgt << " stat returned error code "
<< r << std::endl;
ceph_abort();
}
op.assert_version(src_value.version);
op.set_redirect(context->prefix+oid_tgt, context->low_tier_io_ctx, tgt_version);
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
comp = context->rados.aio_create_completion((void*) cb_arg, &write_callback);
context->io_ctx.aio_operate(context->prefix+oid, comp, &op,
if (info->id == 0) {
ceph_assert(comp->is_complete());
- cout << num << ": finishing set_redirect to oid " << oid << std::endl;
+ std::cout << num << ": finishing set_redirect to oid " << oid << std::endl;
if ((r = comp->get_return_value())) {
if (r == -ENOENT && src_value.deleted()) {
- cout << num << ": got expected ENOENT (src dne)" << std::endl;
+ std::cout << num << ": got expected ENOENT (src dne)" << std::endl;
} else {
- cerr << "Error: oid " << oid << " set_redirect " << oid_tgt << " returned error code "
+ std::cerr << "Error: oid " << oid << " set_redirect " << oid_tgt << " returned error code "
<< r << std::endl;
ceph_abort();
}
return done == 1;
}
- string getType() override
+ std::string getType() override
{
return "SetRedirectOp";
}
class UnsetRedirectOp : public TestOp {
public:
- string oid;
+ std::string oid;
librados::ObjectWriteOperation op;
librados::AioCompletion *comp = nullptr;
UnsetRedirectOp(int n,
RadosTestContext *context,
- const string &oid,
+ const std::string &oid,
TestOpStat *stat = 0)
: TestOp(n, context, stat), oid(oid)
{}
comp->wait_for_complete();
int r = comp->get_return_value();
if (r && !(r == -ENOENT && !present)) {
- cerr << "r is " << r << " while deleting " << oid << " and present is " << present << std::endl;
+ std::cerr << "r is " << r << " while deleting " << oid << " and present is " << present << std::endl;
ceph_abort();
}
state_locker.lock();
if(!context->redirect_objs[oid].empty()) {
context->oid_redirect_not_in_use.insert(context->redirect_objs[oid]);
context->oid_redirect_in_use.erase(context->redirect_objs[oid]);
- context->update_object_redirect_target(oid, string());
+ context->update_object_redirect_target(oid, {});
}
context->kick();
}
- string getType() override
+ std::string getType() override
{
return "UnsetRedirectOp";
}
public:
librados::AioCompletion *completion;
librados::ObjectWriteOperation op;
- string oid;
+ std::string oid;
std::shared_ptr<int> in_use;
ObjectDesc src_value;
TierPromoteOp(int n,
RadosTestContext *context,
- const string &oid,
+ const std::string &oid,
TestOpStat *stat)
: TestOp(n, context, stat),
completion(NULL),
context->find_object(oid, &src_value);
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
completion = context->rados.aio_create_completion((void *) cb_arg,
&write_callback);
ObjectDesc oid_value;
context->find_object(oid, &oid_value);
int r = completion->get_return_value();
- cout << num << ": got " << cpp_strerror(r) << std::endl;
+ std::cout << num << ": got " << cpp_strerror(r) << std::endl;
if (r == 0) {
// sucess
} else if (r == -ENOENT && src_value.deleted()) {
- cout << num << ": got expected ENOENT (src dne)" << std::endl;
+ std::cout << num << ": got expected ENOENT (src dne)" << std::endl;
} else {
ceph_abort_msg("shouldn't happen");
}
return done;
}
- string getType() override
+ std::string getType() override
{
return "TierPromoteOp";
}
public:
librados::AioCompletion *completion;
librados::ObjectReadOperation op;
- string oid;
+ std::string oid;
std::shared_ptr<int> in_use;
int snap;
ObjectDesc src_value;
TierFlushOp(int n,
RadosTestContext *context,
- const string &oid,
+ const std::string &oid,
TestOpStat *stat)
: TestOp(n, context, stat),
completion(NULL),
snap = -1;
}
- cout << num << ": tier_flush oid " << oid << " snap " << snap << std::endl;
+ std::cout << num << ": tier_flush oid " << oid << " snap " << snap << std::endl;
if (snap >= 0) {
context->io_ctx.snap_set_read(context->snaps[snap]);
context->find_object(oid, &src_value, snap);
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
completion = context->rados.aio_create_completion((void *) cb_arg,
&write_callback);
ceph_assert(completion->is_complete());
int r = completion->get_return_value();
- cout << num << ": got " << cpp_strerror(r) << std::endl;
+ std::cout << num << ": got " << cpp_strerror(r) << std::endl;
if (r == 0) {
// sucess
context->update_object_tier_flushed(oid, snap);
} else if (r == -ENOENT) {
// could fail if object is removed
if (src_value.deleted()) {
- cout << num << ": got expected ENOENT (src dne)" << std::endl;
+ std::cout << num << ": got expected ENOENT (src dne)" << std::endl;
} else {
- cerr << num << ": got unexpected ENOENT" << std::endl;
+ std::cerr << num << ": got unexpected ENOENT" << std::endl;
ceph_abort();
}
} else {
if (r != -ENOENT && src_value.deleted()) {
- cerr << num << ": src dne, but r is not ENOENT" << std::endl;
- }
+ std::cerr << num << ": src dne, but r is not ENOENT" << std::endl;
+ }
ceph_abort_msg("shouldn't happen");
}
context->oid_in_use.erase(oid);
return done;
}
- string getType() override
+ std::string getType() override
{
return "TierFlushOp";
}
public:
librados::AioCompletion *completion;
librados::ObjectReadOperation op;
- string oid;
+ std::string oid;
std::shared_ptr<int> in_use;
int snap;
ObjectDesc src_value;
TierEvictOp(int n,
RadosTestContext *context,
- const string &oid,
+ const std::string &oid,
TestOpStat *stat)
: TestOp(n, context, stat),
completion(NULL),
snap = -1;
}
- cout << num << ": tier_evict oid " << oid << " snap " << snap << std::endl;
+ std::cout << num << ": tier_evict oid " << oid << " snap " << snap << std::endl;
if (snap >= 0) {
context->io_ctx.snap_set_read(context->snaps[snap]);
context->find_object(oid, &src_value, snap);
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
completion = context->rados.aio_create_completion((void *) cb_arg,
&write_callback);
ceph_assert(completion->is_complete());
int r = completion->get_return_value();
- cout << num << ": got " << cpp_strerror(r) << std::endl;
+ std::cout << num << ": got " << cpp_strerror(r) << std::endl;
if (r == 0) {
// ok
} else if (r == -EINVAL) {
} else if (r == -ENOENT) {
// could fail if object is removed
if (src_value.deleted()) {
- cout << num << ": got expected ENOENT (src dne)" << std::endl;
+ std::cout << num << ": got expected ENOENT (src dne)" << std::endl;
} else {
- cerr << num << ": got unexpected ENOENT" << std::endl;
+ std::cerr << num << ": got unexpected ENOENT" << std::endl;
ceph_abort();
}
} else {
if (r != -ENOENT && src_value.deleted()) {
- cerr << num << ": src dne, but r is not ENOENT" << std::endl;
- }
+ std::cerr << num << ": src dne, but r is not ENOENT" << std::endl;
+ }
ceph_abort_msg("shouldn't happen");
}
context->oid_in_use.erase(oid);
return done;
}
- string getType() override
+ std::string getType() override
{
return "TierEvictOp";
}
void _begin() override
{
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
comp1 = context->rados.aio_create_completion((void*) cb_arg,
&write_callback);
std::lock_guard l{context->state_lock};
if (!comp2) {
if (ls.empty()) {
- cerr << num << ": no hitsets" << std::endl;
+ std::cerr << num << ": no hitsets" << std::endl;
done = true;
} else {
- cerr << num << ": hitsets are " << ls << std::endl;
+ std::cerr << num << ": hitsets are " << ls << std::endl;
int r = rand() % ls.size();
- std::list<pair<time_t,time_t> >::iterator p = ls.begin();
+ auto p = ls.begin();
while (r--)
++p;
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
- new TestOp::CallbackInfo(0));
+ auto cb_arg = new std::pair<TestOp*, TestOp::CallbackInfo*>(
+ this, new TestOp::CallbackInfo(0));
comp2 = context->rados.aio_create_completion((void*) cb_arg, &write_callback);
r = context->io_ctx.hit_set_get(hash, comp2, p->second, &bl);
ceph_assert(r == 0);
HitSet hitset;
auto p = bl.cbegin();
decode(hitset, p);
- cout << num << ": got hitset of type " << hitset.get_type_name()
- << " size " << bl.length()
- << std::endl;
+ std::cout << num << ": got hitset of type " << hitset.get_type_name()
+ << " size " << bl.length()
+ << std::endl;
} else {
// FIXME: we could verify that we did in fact race with a trim...
ceph_assert(r == -ENOENT);
return done;
}
- string getType() override {
+ std::string getType() override {
return "HitSetListOp";
}
};
public:
librados::AioCompletion *completion;
librados::ObjectWriteOperation op;
- string oid;
+ std::string oid;
UndirtyOp(int n,
RadosTestContext *context,
- const string &oid,
+ const std::string &oid,
TestOpStat *stat = 0)
: TestOp(n, context, stat),
completion(NULL),
void _begin() override
{
context->state_lock.lock();
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
completion = context->rados.aio_create_completion((void *) cb_arg,
&write_callback);
return done;
}
- string getType() override
+ std::string getType() override
{
return "UndirtyOp";
}
public:
librados::AioCompletion *completion;
librados::ObjectReadOperation op;
- string oid;
+ std::string oid;
bool dirty;
ObjectDesc old_value;
int snap = 0;
IsDirtyOp(int n,
RadosTestContext *context,
- const string &oid,
+ const std::string &oid,
TestOpStat *stat = 0)
: TestOp(n, context, stat),
completion(NULL),
std::cout << num << ": is_dirty oid " << oid << " snap " << snap
<< std::endl;
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
completion = context->rados.aio_create_completion((void *) cb_arg,
&write_callback);
int r = completion->get_return_value();
if (r == 0) {
- cout << num << ": " << (dirty ? "dirty" : "clean") << std::endl;
+ std::cout << num << ": " << (dirty ? "dirty" : "clean") << std::endl;
ceph_assert(!old_value.deleted());
ceph_assert(dirty == old_value.dirty);
} else {
- cout << num << ": got " << r << std::endl;
+ std::cout << num << ": got " << r << std::endl;
ceph_assert(r == -ENOENT);
ceph_assert(old_value.deleted());
}
return done;
}
- string getType() override
+ std::string getType() override
{
return "IsDirtyOp";
}
public:
librados::AioCompletion *completion;
librados::ObjectReadOperation op;
- string oid;
+ std::string oid;
bool blocking;
int snap;
bool can_fail;
CacheFlushOp(int n,
RadosTestContext *context,
- const string &oid,
+ const std::string &oid,
TestOpStat *stat,
bool b)
: TestOp(n, context, stat),
// FIXME: we could fail if we've ever removed a snap due to
// the async snap trimming.
can_fail = true;
- cout << num << ": " << (blocking ? "cache_flush" : "cache_try_flush")
+ std::cout << num << ": " << (blocking ? "cache_flush" : "cache_try_flush")
<< " oid " << oid << " snap " << snap << std::endl;
if (snap >= 0) {
context->io_ctx.snap_set_read(context->snaps[snap]);
}
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
completion = context->rados.aio_create_completion((void *) cb_arg,
&write_callback);
context->oid_flushing.erase(oid);
context->oid_not_flushing.insert(oid);
int r = completion->get_return_value();
- cout << num << ": got " << cpp_strerror(r) << std::endl;
+ std::cout << num << ": got " << cpp_strerror(r) << std::endl;
if (r == 0) {
context->update_object_version(oid, 0, snap);
} else if (r == -EBUSY) {
return done;
}
- string getType() override
+ std::string getType() override
{
return "CacheFlushOp";
}
public:
librados::AioCompletion *completion;
librados::ObjectReadOperation op;
- string oid;
+ std::string oid;
std::shared_ptr<int> in_use;
CacheEvictOp(int n,
RadosTestContext *context,
- const string &oid,
+ const std::string &oid,
TestOpStat *stat)
: TestOp(n, context, stat),
completion(NULL),
} else {
snap = -1;
}
- cout << num << ": cache_evict oid " << oid << " snap " << snap << std::endl;
+ std::cout << num << ": cache_evict oid " << oid << " snap " << snap << std::endl;
if (snap >= 0) {
context->io_ctx.snap_set_read(context->snaps[snap]);
}
- pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
- new pair<TestOp*, TestOp::CallbackInfo*>(this,
+ std::pair<TestOp*, TestOp::CallbackInfo*> *cb_arg =
+ new std::pair<TestOp*, TestOp::CallbackInfo*>(this,
new TestOp::CallbackInfo(0));
completion = context->rados.aio_create_completion((void *) cb_arg,
&write_callback);
ceph_assert(completion->is_complete());
int r = completion->get_return_value();
- cout << num << ": got " << cpp_strerror(r) << std::endl;
+ std::cout << num << ": got " << cpp_strerror(r) << std::endl;
if (r == 0) {
// yay!
} else if (r == -EBUSY) {
return done;
}
- string getType() override
+ std::string getType() override
{
return "CacheEvictOp";
}