}
dups.push_back(pg_log_dup_t(e));
index(dups.back());
+ uint32_t idx = 0;
for (const auto& extra : e.extra_reqids) {
+ int return_code = e.return_code;
+ if (return_code >= 0) {
+ auto it = e.extra_reqid_return_codes.find(idx);
+ if (it != e.extra_reqid_return_codes.end()) {
+ return_code = it->second;
+ }
+ }
+ ++idx;
+
// note: extras have the same version as outer op
dups.push_back(pg_log_dup_t(e.version, extra.second,
- extra.first, e.return_code));
+ extra.first, return_code));
index(dups.back());
}
}
}
p = extra_caller_ops.find(r);
if (p != extra_caller_ops.end()) {
+ uint32_t idx = 0;
for (auto i = p->second->extra_reqids.begin();
i != p->second->extra_reqids.end();
- ++i) {
+ ++idx, ++i) {
if (i->first == r) {
*version = p->second->version;
*user_version = i->second;
*return_code = p->second->return_code;
+ if (*return_code >= 0) {
+ auto it = p->second->extra_reqid_return_codes.find(idx);
+ if (it != p->second->extra_reqid_return_codes.end()) {
+ *return_code = it->second;
+ }
+ }
return true;
}
}
void pg_log_entry_t::encode(bufferlist &bl) const
{
- ENCODE_START(11, 4, bl);
+ ENCODE_START(12, 4, bl);
encode(op, bl);
encode(soid, bl);
encode(version, bl);
encode(extra_reqids, bl);
if (op == ERROR)
encode(return_code, bl);
+ if (!extra_reqids.empty())
+ encode(extra_reqid_return_codes, bl);
ENCODE_FINISH(bl);
}
void pg_log_entry_t::decode(bufferlist::const_iterator &bl)
{
- DECODE_START_LEGACY_COMPAT_LEN(11, 4, 4, bl);
+ DECODE_START_LEGACY_COMPAT_LEN(12, 4, 4, bl);
decode(op, bl);
if (struct_v < 2) {
sobject_t old_soid;
decode(extra_reqids, bl);
if (struct_v >= 11 && op == ERROR)
decode(return_code, bl);
+ if (struct_v >= 12 && !extra_reqids.empty())
+ decode(extra_reqid_return_codes, bl);
DECODE_FINISH(bl);
}
f->dump_stream("prior_version") << prior_version;
f->dump_stream("reqid") << reqid;
f->open_array_section("extra_reqids");
+ uint32_t idx = 0;
for (auto p = extra_reqids.begin();
p != extra_reqids.end();
- ++p) {
+ ++idx, ++p) {
f->open_object_section("extra_reqid");
f->dump_stream("reqid") << p->first;
f->dump_stream("user_version") << p->second;
+ auto it = extra_reqid_return_codes.find(idx);
+ if (it != extra_reqid_return_codes.end()) {
+ f->dump_int("return_code", it->second);
+ }
f->close_section();
}
f->close_section();
hobject_t soid;
osd_reqid_t reqid; // caller+tid to uniquely identify request
mempool::osd_pglog::vector<pair<osd_reqid_t, version_t> > extra_reqids;
+
+ ///< map extra_reqids by index to error return code (if any)
+ mempool::osd_pglog::map<uint32_t, int> extra_reqid_return_codes;
+
eversion_t version, prior_version, reverting_to;
version_t user_version; // the user version for this entry
utime_t mtime; // this is the _user_ mtime, mind you