summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/messages/MOSDSubOp.h14
-rw-r--r--src/messages/MOSDSubOpReply.h5
-rw-r--r--src/osd/PG.cc28
-rw-r--r--src/osd/PG.h15
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);