X-Git-Url: https://git.proxmox.com/?p=ceph.git;a=blobdiff_plain;f=ceph%2Fsrc%2Fosd%2Fosd_types.h;h=ec268b118c6fcc1261a372648d511817ec89211a;hp=2d7da93d7a811b286690c9ebb7461ddd5d732067;hb=28e407b858acd3bddc89f68583571f771bb42e46;hpb=dfcb7b53b2e4fcd2a5af0240d4975adc711ab96e diff --git a/ceph/src/osd/osd_types.h b/ceph/src/osd/osd_types.h index 2d7da93d7..ec268b118 100644 --- a/ceph/src/osd/osd_types.h +++ b/ceph/src/osd/osd_types.h @@ -1656,6 +1656,7 @@ struct object_stat_sum_t { int64_t num_objects_pinned; int64_t num_objects_missing; int64_t num_legacy_snapsets; ///< upper bound on pre-luminous-style SnapSets + int64_t num_large_omap_objects = 0; object_stat_sum_t() : num_bytes(0), @@ -1702,6 +1703,7 @@ struct object_stat_sum_t { FLOOR(num_rd_kb); FLOOR(num_wr); FLOOR(num_wr_kb); + FLOOR(num_large_omap_objects); FLOOR(num_shallow_scrub_errors); FLOOR(num_deep_scrub_errors); num_scrub_errors = num_shallow_scrub_errors + num_deep_scrub_errors; @@ -1762,6 +1764,7 @@ struct object_stat_sum_t { out[i].num_scrub_errors = out[i].num_shallow_scrub_errors + out[i].num_deep_scrub_errors; } + SPLIT(num_large_omap_objects); SPLIT(num_objects_recovered); SPLIT(num_bytes_recovered); SPLIT(num_keys_recovered); @@ -1816,6 +1819,7 @@ struct object_stat_sum_t { sizeof(num_wr) + sizeof(num_wr_kb) + sizeof(num_scrub_errors) + + sizeof(num_large_omap_objects) + sizeof(num_objects_recovered) + sizeof(num_bytes_recovered) + sizeof(num_keys_recovered) + @@ -4778,8 +4782,8 @@ struct object_info_t { omap_digest = -1; } void new_object() { - set_data_digest(-1); - set_omap_digest(-1); + clear_data_digest(); + clear_omap_digest(); } void encode(bufferlist& bl, uint64_t features) const; @@ -4940,12 +4944,16 @@ struct ScrubMap { bool stat_error:1; bool ec_hash_mismatch:1; bool ec_size_mismatch:1; + bool large_omap_object_found:1; + uint64_t large_omap_object_key_count = 0; + uint64_t large_omap_object_value_size = 0; object() : // Init invalid size so it won't match if we get a stat EIO error size(-1), omap_digest(0), digest(0), - negative(false), digest_present(false), omap_digest_present(false), - read_error(false), stat_error(false), ec_hash_mismatch(false), ec_size_mismatch(false) {} + negative(false), digest_present(false), omap_digest_present(false), + read_error(false), stat_error(false), ec_hash_mismatch(false), + ec_size_mismatch(false), large_omap_object_found(false) {} void encode(bufferlist& bl) const; void decode(bufferlist::iterator& bl); @@ -4957,8 +4965,12 @@ struct ScrubMap { map objects; eversion_t valid_through; eversion_t incr_since; + bool has_large_omap_object_errors:1; void merge_incr(const ScrubMap &l); + void clear_from(const hobject_t& start) { + objects.erase(objects.lower_bound(start), objects.end()); + } void insert(const ScrubMap &r) { objects.insert(r.objects.begin(), r.objects.end()); } @@ -4977,6 +4989,60 @@ struct ScrubMap { WRITE_CLASS_ENCODER(ScrubMap::object) WRITE_CLASS_ENCODER(ScrubMap) +struct ScrubMapBuilder { + bool deep = false; + vector ls; + size_t pos = 0; + int64_t data_pos = 0; + string omap_pos; + int ret = 0; + bufferhash data_hash, omap_hash; ///< accumulatinng hash value + uint64_t omap_keys = 0; + uint64_t omap_bytes = 0; + + bool empty() { + return ls.empty(); + } + bool done() { + return pos >= ls.size(); + } + void reset() { + *this = ScrubMapBuilder(); + } + + bool data_done() { + return data_pos < 0; + } + + void next_object() { + ++pos; + data_pos = 0; + omap_pos.clear(); + omap_keys = 0; + omap_bytes = 0; + } + + friend ostream& operator<<(ostream& out, const ScrubMapBuilder& pos) { + out << "(" << pos.pos << "/" << pos.ls.size(); + if (pos.pos < pos.ls.size()) { + out << " " << pos.ls[pos.pos]; + } + if (pos.data_pos < 0) { + out << " byte " << pos.data_pos; + } + if (!pos.omap_pos.empty()) { + out << " key " << pos.omap_pos; + } + if (pos.deep) { + out << " deep"; + } + if (pos.ret) { + out << " ret " << pos.ret; + } + return out << ")"; + } +}; + struct OSDOp { ceph_osd_op op; sobject_t soid;