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,
++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
__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<entity_name_t, watch_info_t> old_watchers;
::decode(soid, bl);
::decode(myoloc, 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);
}
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<pair<uint64_t, entity_name_t>,watch_info_t>::const_iterator p =
watchers.begin(); p != watchers.end(); ++p) {
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;
}
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;
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;
map<pair<uint64_t, entity_name_t>, 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,
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);
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);
uint64_t size;
bool negative;
map<string,bufferptr> attrs;
- __u32 digest;
+ __u32 digest; ///< data crc32c
bool digest_present;
uint32_t nlinks;
set<snapid_t> snapcolls;
- __u32 omap_digest;
+ __u32 omap_digest; ///< omap crc32c
bool omap_digest_present;
bool read_error;