summaryrefslogtreecommitdiff
path: root/src/os
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2012-06-20 12:55:38 -0700
committerSamuel Just <sam.just@inktank.com>2012-06-21 17:10:29 -0700
commit2fe9816305fc1406ab7fb043bbb32affffc2d190 (patch)
treea830b2ffb9787f2e4fedb992e490c219fded2ec4 /src/os
parent448f5b02b10f76cc2cd93558a92d7690d60fb74b (diff)
downloadceph-2fe9816305fc1406ab7fb043bbb32affffc2d190.tar.gz
OSD,PG,ObjectStore: handle messages with old hobject_t encoding
Messages that embed an hobject_t need to have the pool field fixed on messages from old peers. Signed-off-by: Samuel Just <sam.just@inktank.com>
Diffstat (limited to 'src/os')
-rw-r--r--src/os/ObjectStore.h24
1 files changed, 20 insertions, 4 deletions
diff --git a/src/os/ObjectStore.h b/src/os/ObjectStore.h
index 56f5401a5af..53f365773db 100644
--- a/src/os/ObjectStore.h
+++ b/src/os/ObjectStore.h
@@ -158,8 +158,13 @@ public:
uint32_t largest_data_len, largest_data_off, largest_data_off_in_tbl;
bufferlist tbl;
bool sobject_encoding;
+ int64_t pool_override;
+ bool use_pool_override;
public:
+ void set_pool_override(int64_t pool) {
+ pool_override = pool;
+ }
void swap(Transaction& other) {
std::swap(ops, other.ops);
@@ -225,10 +230,14 @@ public:
class iterator {
bufferlist::iterator p;
bool sobject_encoding;
+ int64_t pool_override;
+ bool use_pool_override;
iterator(Transaction *t)
: p(t->tbl.begin()),
- sobject_encoding(t->sobject_encoding) {}
+ sobject_encoding(t->sobject_encoding),
+ pool_override(t->pool_override),
+ use_pool_override(t->use_pool_override) {}
friend class Transaction;
@@ -253,6 +262,10 @@ public:
hoid.oid = soid.oid;
} else {
::decode(hoid, p);
+ if (use_pool_override && pool_override != -1 &&
+ hoid.pool == -1) {
+ hoid.pool = pool_override;
+ }
}
return hoid;
}
@@ -531,7 +544,7 @@ public:
// etc.
Transaction() :
ops(0), pad_unused_bytes(0), largest_data_len(0), largest_data_off(0), largest_data_off_in_tbl(0),
- sobject_encoding(false) {}
+ sobject_encoding(false), pool_override(-1), use_pool_override(false) {}
Transaction(bufferlist::iterator &dp) :
ops(0), pad_unused_bytes(0), largest_data_len(0), largest_data_off(0), largest_data_off_in_tbl(0),
sobject_encoding(false) {
@@ -545,7 +558,7 @@ public:
}
void encode(bufferlist& bl) const {
- ENCODE_START(5, 5, bl);
+ ENCODE_START(6, 5, bl);
::encode(ops, bl);
::encode(pad_unused_bytes, bl);
::encode(largest_data_len, bl);
@@ -555,7 +568,7 @@ public:
ENCODE_FINISH(bl);
}
void decode(bufferlist::iterator &bl) {
- DECODE_START_LEGACY_COMPAT_LEN(5, 5, 5, bl);
+ DECODE_START_LEGACY_COMPAT_LEN(6, 5, 5, bl);
DECODE_OLDEST(2);
if (struct_v < 4)
sobject_encoding = true;
@@ -570,6 +583,9 @@ public:
}
::decode(tbl, bl);
DECODE_FINISH(bl);
+ if (struct_v < 6) {
+ use_pool_override = true;
+ }
}
void dump(ceph::Formatter *f);