}
os->queue_transactions(ch, tls);
+ os->verify_objects(ch);
// reapply
os->queue_transactions(ch, tls);
+ os->verify_objects(ch);
tls.clear();
// Overwrite on object
}
os->queue_transactions(ch, tls);
+ os->verify_objects(ch);
tls.clear();
for (unsigned i{0}; i < 50; ++i) {
}
os->queue_transactions(ch, tls);
+ os->verify_objects(ch);
return 0;
}
};
<< std::dec << std::endl;
}
+void ObjectStoreImitator::verify_objects(CollectionHandle &ch) {
+ Collection *c = static_cast<Collection *>(ch.get());
+ c->verify_objects();
+}
+
// ------- Transactions -------
int ObjectStoreImitator::queue_transactions(CollectionHandle &ch,
}
}
- for (auto &p : extents) {
- o->extents.push_back(p);
- }
+ o->append(extents);
if (prealloc_left > 0) {
PExtentVector old_extents;
#include "os/ObjectStore.h"
#include "os/bluestore/Allocator.h"
#include "os/bluestore/bluestore_types.h"
+#include <algorithm>
#include <boost/smart_ptr/intrusive_ptr.hpp>
/**
extents = remains;
old_extents = to_be_punched;
}
+
+ void append(PExtentVector &ext) {
+ for (auto &e : ext) {
+ extents.push_back(e);
+ }
+
+ std::sort(extents.begin(), extents.end(),
+ [](bluestore_pextent_t &a, bluestore_pextent_t &b) {
+ return a.offset < b.offset;
+ });
+ }
+
+ void verify_extents() {
+ uint64_t total{0};
+ for (auto &e : extents) {
+ ceph_assert(total <= e.offset);
+ ceph_assert(e.length > 0);
+ total += e.length;
+ }
+
+ ceph_assert(total = size);
+ }
};
typedef boost::intrusive_ptr<Object> ObjectRef;
o->oid = new_oid;
}
+ void verify_objects() {
+ for (auto &[_, obj] : objects) {
+ obj->verify_extents();
+ }
+ }
+
Collection(ObjectStoreImitator *sim_, coll_t cid_)
: CollectionImpl(sim_->cct, cid_), exists(true), commit_queue(nullptr) {
}
void init_alloc(const std::string &alloc_type, int64_t size);
void print_status();
+ void verify_objects(CollectionHandle &ch);
// Overrides