diff options
author | Samuel Just <sam.just@inktank.com> | 2012-06-20 12:55:38 -0700 |
---|---|---|
committer | Samuel Just <sam.just@inktank.com> | 2012-06-21 17:10:29 -0700 |
commit | 2fe9816305fc1406ab7fb043bbb32affffc2d190 (patch) | |
tree | a830b2ffb9787f2e4fedb992e490c219fded2ec4 /src/os | |
parent | 448f5b02b10f76cc2cd93558a92d7690d60fb74b (diff) | |
download | ceph-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.h | 24 |
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); |