From 2dd9d2a1d4c5e3f14469cedbd4c8229c1fa40fd8 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 11 Apr 2017 17:27:18 -0400 Subject: [PATCH] osd/osd_types: print and encode empty PastIntervals These happen when they are optionally sent across the wire. Signed-off-by: Sage Weil --- src/osd/osd_types.cc | 23 ++++++++++++++++------- src/osd/osd_types.h | 21 ++++++++++++++------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 300095768342..d3d48965cc80 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 c95e24cbd391..c860f8cfe8cc 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); -- 2.47.3