return NULL;
}
+ /// get a (bounded) list of recent reqids for the given object
+ void get_object_reqids(const hobject_t& oid, unsigned max,
+ vector<osd_reqid_t> *pls) const {
+ for (list<pg_log_entry_t>::const_reverse_iterator i = log.rbegin();
+ i != log.rend();
+ ++i) {
+ if (i->soid == oid) {
+ if (i->reqid_is_indexed())
+ pls->push_back(i->reqid);
+ pls->insert(pls->end(), i->extra_reqids.begin(), i->extra_reqids.end());
+ if (pls->size() >= max) {
+ if (pls->size() > max) {
+ pls->resize(max);
+ }
+ return;
+ }
+ }
+ }
+ }
+
void index() {
objects.clear();
caller_ops.clear();
if (i->reqid_is_indexed()) {
//assert(caller_ops.count(i->reqid) == 0); // divergent merge_log indexes new before unindexing old
caller_ops[i->reqid] = &(*i);
- for (vector<osd_reqid_t>::const_iterator j = i->extra_reqids.begin();
- j != i->extra_reqids.end();
- ++j) {
- extra_caller_ops.insert(make_pair(*j, &(*i)));
- }
+ }
+ for (vector<osd_reqid_t>::const_iterator j = i->extra_reqids.begin();
+ j != i->extra_reqids.end();
+ ++j) {
+ extra_caller_ops.insert(make_pair(*j, &(*i)));
}
}
if (e.reqid_is_indexed()) {
//assert(caller_ops.count(i->reqid) == 0); // divergent merge_log indexes new before unindexing old
caller_ops[e.reqid] = &e;
- for (vector<osd_reqid_t>::const_iterator j = e.extra_reqids.begin();
- j != e.extra_reqids.end();
- ++j) {
- extra_caller_ops.insert(make_pair(*j, &e));
- }
+ }
+ for (vector<osd_reqid_t>::const_iterator j = e.extra_reqids.begin();
+ j != e.extra_reqids.end();
+ ++j) {
+ extra_caller_ops.insert(make_pair(*j, &e));
}
}
void unindex() {
if (caller_ops.count(e.reqid) && // divergent merge_log indexes new before unindexing old
caller_ops[e.reqid] == &e)
caller_ops.erase(e.reqid);
- for (vector<osd_reqid_t>::const_iterator j = e.extra_reqids.begin();
- j != e.extra_reqids.end();
- ++j) {
- for (ceph::unordered_multimap<osd_reqid_t,pg_log_entry_t*>::iterator k =
- extra_caller_ops.find(*j);
- k != extra_caller_ops.end() && k->first == *j;
- ++j) {
- if (k->second == &e) {
- extra_caller_ops.erase(k);
- break;
- }
+ }
+ for (vector<osd_reqid_t>::const_iterator j = e.extra_reqids.begin();
+ j != e.extra_reqids.end();
+ ++j) {
+ for (ceph::unordered_multimap<osd_reqid_t,pg_log_entry_t*>::iterator k =
+ extra_caller_ops.find(*j);
+ k != extra_caller_ops.end() && k->first == *j;
+ ++k) {
+ if (k->second == &e) {
+ extra_caller_ops.erase(k);
+ break;
}
}
}
objects[e.soid] = &(log.back());
if (e.reqid_is_indexed()) {
caller_ops[e.reqid] = &(log.back());
- for (vector<osd_reqid_t>::const_iterator j = e.extra_reqids.begin();
- j != e.extra_reqids.end();
- ++j) {
- extra_caller_ops.insert(make_pair(*j, &(log.back())));
- }
+ }
+ for (vector<osd_reqid_t>::const_iterator j = e.extra_reqids.begin();
+ j != e.extra_reqids.end();
+ ++j) {
+ extra_caller_ops.insert(make_pair(*j, &(log.back())));
}
}
return;
}
- ENCODE_START(5, 5, bl);
+ ENCODE_START(6, 5, bl);
::encode(size, bl);
::encode(mtime, bl);
::encode(attrs, bl);
::encode(flags, bl);
::encode(data_digest, bl);
::encode(omap_digest, bl);
+ ::encode(reqids, bl);
ENCODE_FINISH(bl);
}
void object_copy_data_t::decode(bufferlist::iterator& bl)
{
- DECODE_START(5, bl);
+ DECODE_START(6, bl);
if (struct_v < 5) {
// old
::decode(size, bl);
::decode(data_digest, bl);
::decode(omap_digest, bl);
}
+ if (struct_v >= 6) {
+ ::decode(reqids, bl);
+ }
}
DECODE_FINISH(bl);
}
o.back()->data.push_back(databp);
o.back()->omap_header.append("this is an omap header");
o.back()->snaps.push_back(123);
+ o.back()->reqids.push_back(osd_reqid_t());
}
void object_copy_data_t::dump(Formatter *f) const
p != snaps.end(); ++p)
f->dump_unsigned("snap", *p);
f->close_section();
+ f->open_array_section("reqids");
+ for (vector<osd_reqid_t>::const_iterator p = reqids.begin();
+ p != reqids.end();
+ ++p)
+ f->dump_stream("reqid") << *p;
+ f->close_section();
}
// -- pg_create_t --