From: Sage Weil Date: Tue, 11 Apr 2017 21:27:18 +0000 (-0400) Subject: osd/osd_types: print and encode empty PastIntervals X-Git-Tag: v12.0.3~129^2~16 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2dd9d2a1d4c5e3f14469cedbd4c8229c1fa40fd8;p=ceph.git osd/osd_types: print and encode empty PastIntervals These happen when they are optionally sent across the wire. Signed-off-by: Sage Weil --- diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 30009576834..d3d48965cc8 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -3219,8 +3219,11 @@ PastIntervals &PastIntervals::operator=(const PastIntervals &rhs) ostream& operator<<(ostream& out, const PastIntervals &i) { - assert(i.past_intervals); - return i.past_intervals->print(out); + if (i.past_intervals) { + return i.past_intervals->print(out); + } else { + return out << "(empty)"; + } } ostream& operator<<(ostream& out, const PastIntervals::PriorSet &i) @@ -3237,14 +3240,20 @@ ostream& operator<<(ostream& out, const PastIntervals::PriorSet &i) void PastIntervals::decode(bufferlist::iterator &bl) { DECODE_START(1, bl); - __u8 classic = 0; - ::decode(classic, bl); - if (classic) { + __u8 type = 0; + ::decode(type, bl); + switch (type) { + case 0: + break; + case 1: past_intervals.reset(new pi_simple_rep); - } else { + past_intervals->decode(bl); + break; + case 2: past_intervals.reset(new pi_compact_rep); + past_intervals->decode(bl); + break; } - past_intervals->decode(bl); DECODE_FINISH(bl); } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index c95e24cbd39..c860f8cfe8c 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -2572,17 +2572,24 @@ public: } void encode(bufferlist &bl) const { - assert(past_intervals); ENCODE_START(1, 1, bl); - __u8 classic = is_classic(); - ::encode(classic, bl); - past_intervals->encode(bl); + if (past_intervals) { + __u8 type = is_classic() ? 1 : 2; + ::encode(type, bl); + past_intervals->encode(bl); + } else { + ::encode((__u8)0, bl); + } ENCODE_FINISH(bl); } void encode_classic(bufferlist &bl) const { - assert(past_intervals); - assert(past_intervals->is_classic()); - past_intervals->encode(bl); + if (past_intervals) { + assert(past_intervals->is_classic()); + past_intervals->encode(bl); + } else { + // it's a map<> + ::encode((uint32_t)0, bl); + } } void decode(bufferlist::iterator &bl);