From 3f7b2cf52f5aeb3a26e5bf5b4b61a233c5e7f8b6 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Sun, 2 Nov 2014 17:10:26 -0800 Subject: [PATCH] osd/osd_types: add {data,omap}_digest to object_info_t Also add flags to indicate whether the fields are valid. Signed-off-by: Sage Weil --- src/osd/osd_types.cc | 25 ++++++++++++++++++++--- src/osd/osd_types.h | 48 ++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 66 insertions(+), 7 deletions(-) diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 5dbc0947faf8c..a821a147b4a4f 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -3850,6 +3850,8 @@ void object_info_t::copy_user_bits(const object_info_t& other) truncate_size = other.truncate_size; flags = other.flags; user_version = other.user_version; + data_digest = other.data_digest; + omap_digest = other.omap_digest; } ps_t object_info_t::legacy_object_locator_to_ps(const object_t &oid, @@ -3875,7 +3877,7 @@ void object_info_t::encode(bufferlist& bl) const ++i) { old_watchers.insert(make_pair(i->first.second, i->second)); } - ENCODE_START(14, 8, bl); + ENCODE_START(15, 8, bl); ::encode(soid, bl); ::encode(myoloc, bl); //Retained for compatibility ::encode((__u32)0, bl); // was category, no longer used @@ -3901,13 +3903,15 @@ void object_info_t::encode(bufferlist& bl) const __u32 _flags = flags; ::encode(_flags, bl); ::encode(local_mtime, bl); + ::encode(data_digest, bl); + ::encode(omap_digest, bl); ENCODE_FINISH(bl); } void object_info_t::decode(bufferlist::iterator& bl) { object_locator_t myoloc; - DECODE_START_LEGACY_COMPAT_LEN(13, 8, 8, bl); + DECODE_START_LEGACY_COMPAT_LEN(14, 8, 8, bl); map old_watchers; ::decode(soid, bl); ::decode(myoloc, bl); @@ -3970,6 +3974,14 @@ void object_info_t::decode(bufferlist::iterator& bl) } else { local_mtime = utime_t(); } + if (struct_v >= 15) { + ::decode(data_digest, bl); + ::decode(omap_digest, bl); + } else { + data_digest = omap_digest = -1; + clear_flag(FLAG_DATA_DIGEST); + clear_flag(FLAG_OMAP_DIGEST); + } DECODE_FINISH(bl); } @@ -3994,6 +4006,8 @@ void object_info_t::dump(Formatter *f) const f->close_section(); f->dump_unsigned("truncate_seq", truncate_seq); f->dump_unsigned("truncate_size", truncate_size); + f->dump_unsigned("data_digest", data_digest); + f->dump_unsigned("omap_digest", omap_digest); f->open_object_section("watchers"); for (map,watch_info_t>::const_iterator p = watchers.begin(); p != watchers.end(); ++p) { @@ -4025,7 +4039,12 @@ ostream& operator<<(ostream& out, const object_info_t& oi) if (oi.flags) out << " " << oi.get_flag_string(); out << " s " << oi.size; - out << " uv" << oi.user_version; + out << " uv " << oi.user_version; + if (oi.is_data_digest()) + out << " dd " << std::hex << oi.data_digest << std::dec; + if (oi.is_omap_digest()) + out << " od " << std::hex << oi.omap_digest << std::dec; + out << ")"; return out; } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index be91f9b677f02..804b5c97a9ef5 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -2748,6 +2748,8 @@ struct object_info_t { FLAG_WHITEOUT = 1<<1, // object logically does not exist FLAG_DIRTY = 1<<2, // object has been modified since last flushed or undirtied FLAG_OMAP = 1 << 3, // has (or may have) some/any omap data + FLAG_DATA_DIGEST = 1 << 4, // has data crc + FLAG_OMAP_DIGEST = 1 << 5, // has omap crc // ... FLAG_USES_TMAP = 1<<8, // deprecated; no longer used. } flag_t; @@ -2766,6 +2768,10 @@ struct object_info_t { s += "|uses_tmap"; if (flags & FLAG_OMAP) s += "|omap"; + if (flags & FLAG_DATA_DIGEST) + s += "|data_digest"; + if (flags & FLAG_OMAP_DIGEST) + s += "|omap_digest"; if (s.length()) return s.substr(1); return s; @@ -2781,6 +2787,10 @@ struct object_info_t { map, watch_info_t> watchers; + // opportunistic checksums; may or may not be present + __u32 data_digest; ///< data crc32c + __u32 omap_digest; ///< omap crc32c + void copy_user_bits(const object_info_t& other); static ps_t legacy_object_locator_to_ps(const object_t &oid, @@ -2807,6 +2817,33 @@ struct object_info_t { bool is_omap() const { return test_flag(FLAG_OMAP); } + bool is_data_digest() const { + return test_flag(FLAG_DATA_DIGEST); + } + bool is_omap_digest() const { + return test_flag(FLAG_OMAP_DIGEST); + } + + void set_data_digest(__u32 d) { + set_flag(FLAG_DATA_DIGEST); + data_digest = d; + } + void set_omap_digest(__u32 d) { + set_flag(FLAG_OMAP_DIGEST); + omap_digest = d; + } + void clear_data_digest() { + clear_flag(FLAG_DATA_DIGEST); + data_digest = -1; + } + void clear_omap_digest() { + clear_flag(FLAG_OMAP_DIGEST); + omap_digest = -1; + } + void new_object() { + set_data_digest(-1); + set_omap_digest(-1); + } void encode(bufferlist& bl) const; void decode(bufferlist::iterator& bl); @@ -2819,13 +2856,16 @@ struct object_info_t { explicit object_info_t() : user_version(0), size(0), flags((flag_t)0), - truncate_seq(0), truncate_size(0) + truncate_seq(0), truncate_size(0), + data_digest(-1), omap_digest(-1) {} object_info_t(const hobject_t& s) : soid(s), user_version(0), size(0), flags((flag_t)0), - truncate_seq(0), truncate_size(0) {} + truncate_seq(0), truncate_size(0), + data_digest(-1), omap_digest(-1) + {} object_info_t(bufferlist& bl) { decode(bl); @@ -3281,11 +3321,11 @@ struct ScrubMap { uint64_t size; bool negative; map attrs; - __u32 digest; + __u32 digest; ///< data crc32c bool digest_present; uint32_t nlinks; set snapcolls; - __u32 omap_digest; + __u32 omap_digest; ///< omap crc32c bool omap_digest_present; bool read_error; -- 2.39.5