diff options
-rw-r--r-- | src/messages/MOSDSubOp.h | 14 | ||||
-rw-r--r-- | src/messages/MOSDSubOpReply.h | 5 | ||||
-rw-r--r-- | src/osd/PG.cc | 28 | ||||
-rw-r--r-- | src/osd/PG.h | 15 |
4 files changed, 56 insertions, 6 deletions
diff --git a/src/messages/MOSDSubOp.h b/src/messages/MOSDSubOp.h index 597278c0c09..b5612574f62 100644 --- a/src/messages/MOSDSubOp.h +++ b/src/messages/MOSDSubOp.h @@ -69,10 +69,14 @@ public: virtual void decode_payload(CephContext *cct) { bufferlist::iterator p = payload.begin(); + sobject_t soid; ::decode(map_epoch, p); ::decode(reqid, p); ::decode(pgid, p); - ::decode(poid, p); + if (header.version < 4) + ::decode(soid, p); + else + ::decode(poid, p); __u32 num_ops; ::decode(num_ops, p); @@ -104,12 +108,16 @@ public: ::decode(first, p); ::decode(complete, p); } - if (header.version >= 3) + if (header.version == 3) { ::decode(oloc, p); + poid.oid = soid.oid; + poid.snap = soid.snap; + poid.hash = object_info_t::legacy_object_locator_to_ps(poid.oid, oloc); + } } virtual void encode_payload(CephContext *cct) { - header.version = 3; + header.version = 4; ::encode(map_epoch, payload); ::encode(reqid, payload); diff --git a/src/messages/MOSDSubOpReply.h b/src/messages/MOSDSubOpReply.h index 2603cdd1392..d7f115c013d 100644 --- a/src/messages/MOSDSubOpReply.h +++ b/src/messages/MOSDSubOpReply.h @@ -52,6 +52,9 @@ public: virtual void decode_payload(CephContext *cct) { bufferlist::iterator p = payload.begin(); + __u8 version; + ::decode(version, payload); + assert(version == 1); ::decode(map_epoch, p); ::decode(reqid, p); ::decode(pgid, p); @@ -70,6 +73,8 @@ public: ::decode(attrset, p); } virtual void encode_payload(CephContext *cct) { + __u8 version = 1; + ::encode(version, payload); ::encode(map_epoch, payload); ::encode(reqid, payload); ::encode(pgid, payload); diff --git a/src/osd/PG.cc b/src/osd/PG.cc index eac8623674c..c0f383b6e0f 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2175,6 +2175,11 @@ void PG::read_log(ObjectStore *store) log.backlog = info.log_backlog; log.tail = info.log_tail; + + // In case of sobject_t based encoding, may need to list objects in the store + // to find hashes + bool listed_collection = false; + vector<hobject_t> ls; if (ondisklog.head > 0) { // read @@ -2233,6 +2238,29 @@ void PG::read_log(ObjectStore *store) osd->clog.error() << info.pgid << " read_log got dup " << e.version << " after " << last << "\n"; } + + if (e.invalid_hash) { + // We need to find the object in the store to get the hash + if (!listed_collection) { + store->collection_list(coll, ls); + } + bool found = false; + for (vector<hobject_t>::iterator i = ls.begin(); + i != ls.end(); + ++i) { + if (i->oid == e.soid.oid && i->snap == e.soid.snap) { + e.soid.hash = i->hash; + found = true; + break; + } + } + if (!found) { + // Didn't find the correct hash + std::ostringstream oss; + oss << "Could not find hash for hoid " << e.soid << std::endl; + throw read_log_error(oss.str().c_str()); + } + } uint64_t endpos = ondisklog.tail + p.get_off(); if (endpos / 4096 != pos / 4096) diff --git a/src/osd/PG.h b/src/osd/PG.h index 39531f243d0..61e8778fd14 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -370,6 +370,7 @@ public: osd_reqid_t reqid; // caller+tid to uniquely identify request utime_t mtime; // this is the _user_ mtime, mind you bufferlist snaps; // only for clone entries + bool invalid_hash; // only when decoding sobject_t based entries Entry() : op(0) {} Entry(int _op, const hobject_t& _soid, @@ -377,7 +378,7 @@ public: const osd_reqid_t& rid, const utime_t& mt) : op(_op), soid(_soid), version(v), prior_version(pv), - reqid(rid), mtime(mt) {} + reqid(rid), mtime(mt), invalid_hash(false) {} bool is_delete() const { return op == DELETE; } bool is_clone() const { return op == CLONE; } @@ -392,7 +393,7 @@ public: } void encode(bufferlist &bl) const { - __u8 struct_v = 1; + __u8 struct_v = 2; ::encode(struct_v, bl); ::encode(op, bl); ::encode(soid, bl); @@ -407,7 +408,15 @@ public: __u8 struct_v; ::decode(struct_v, bl); ::decode(op, bl); - ::decode(soid, bl); + if (struct_v < 2) { + sobject_t old_soid; + ::decode(old_soid, bl); + soid.oid = old_soid.oid; + soid.snap = old_soid.snap; + invalid_hash = true; + } else { + ::decode(soid, bl); + } ::decode(version, bl); ::decode(prior_version, bl); ::decode(reqid, bl); |