class ObjectDesc {
public:
ObjectDesc(ContentsGenerator *cont_gen) :
- exists(false), tmap(false), layers(), cont_gen(cont_gen) {};
+ exists(false), tmap(false), version(0), layers(), cont_gen(cont_gen) {};
ObjectDesc(const ContDesc &init, ContentsGenerator *cont_gen) :
- exists(false), tmap(false), layers(), cont_gen(cont_gen) {
+ exists(false), tmap(false), version(0), layers(), cont_gen(cont_gen) {
layers.push_front(init);
};
bool exists;
bool tmap;
bufferlist tmap_contents;
+ uint64_t version;
private:
list<ContDesc> layers;
ContentsGenerator *cont_gen;
pool_obj_cont[current_snap].insert(pair<string,ObjectDesc>(oid, new_obj));
}
+ void update_object_version(const string &oid, uint64_t version)
+ {
+ for (map<int, map<string,ObjectDesc> >::reverse_iterator i =
+ pool_obj_cont.rbegin();
+ i != pool_obj_cont.rend();
+ ++i) {
+ map<string,ObjectDesc>::iterator j = i->second.find(oid);
+ if (j != i->second.end()) {
+ j->second.version = version;
+ cout << __func__ << " oid " << oid << " is version " << version << std::endl;
+ break;
+ }
+ }
+ }
+
void remove_object(const string &oid)
{
assert(!get_watch_context(oid));
assert(0);
}
done = true;
+ context->update_object_version(oid, comp->get_version());
context->oid_in_use.erase(oid);
context->oid_not_in_use.insert(oid);
context->kick();
assert(0);
}
done = true;
+ context->update_object_version(oid, comp->get_version());
context->oid_in_use.erase(oid);
context->oid_not_in_use.insert(oid);
context->kick();
assert(!done);
waiting_on--;
if (waiting_on == 0) {
+ uint64_t version = 0;
for (set<librados::AioCompletion *>::iterator i = waiting.begin();
i != waiting.end();
) {
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);
context->oid_in_use.erase(oid);
context->oid_not_in_use.insert(oid);
context->kick();
context->oid_in_use.erase(oid);
context->oid_not_in_use.insert(oid);
assert(completion->is_complete());
+ uint64_t version = completion->get_version64();
if (int err = completion->get_return_value()) {
if (!(err == -ENOENT && old_value.deleted())) {
cerr << "Error: oid " << oid << " read returned error code "
<< " and old is " << old_value.attrs.size() << std::endl;
assert(xattrs.size() == old_value.attrs.size());
}
+ if (version != old_value.version) {
+ cerr << "oid: " << oid << " version is " << version
+ << " and expected " << old_value.version << std::endl;
+ assert(version == old_value.version);
+ }
for (map<string, bufferlist>::iterator omap_iter = omap.begin();
omap_iter != omap.end();
++omap_iter) {