summaryrefslogtreecommitdiff
path: root/src/messages
diff options
context:
space:
mode:
authorSamuel Just <samuel.just@dreamhost.com>2011-08-31 14:10:02 -0700
committerSamuel Just <samuel.just@dreamhost.com>2011-08-31 14:48:07 -0700
commit00e0b77e8b4efdfaf181e010be25cec777005e73 (patch)
tree61f480c6acc893be6373630971858623e9b42c91 /src/messages
parent39fa9d8deb139111a1feabacc5d4e5b224b413c9 (diff)
downloadceph-00e0b77e8b4efdfaf181e010be25cec777005e73.tar.gz
OSD: Fix encoding versions affected by hobject switch
PG log did not previously store the object locator. To get the hash for the hobject, scan the collection for the object during read_log if we encouter an old style log entry. Signed-off-by: Samuel Just <samuel.just@dreamhost.com>
Diffstat (limited to 'src/messages')
-rw-r--r--src/messages/MOSDSubOp.h14
-rw-r--r--src/messages/MOSDSubOpReply.h5
2 files changed, 16 insertions, 3 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);