From: Brad Hubbard Date: Fri, 13 Oct 2017 05:46:47 +0000 (+1000) Subject: osd: Add a flag to ScrubMap to signal check needed X-Git-Tag: v13.0.1~425^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F16332%2Fhead;p=ceph.git osd: Add a flag to ScrubMap to signal check needed If we know none of the scrub maps have errors early in be_large_omap_check() we can return without doing a lot of unnecessary work. Signed-off-by: Brad Hubbard --- diff --git a/src/osd/ECBackend.cc b/src/osd/ECBackend.cc index 780bdb676b33..1c81165c3c56 100644 --- a/src/osd/ECBackend.cc +++ b/src/osd/ECBackend.cc @@ -2381,7 +2381,8 @@ void ECBackend::be_deep_scrub( const hobject_t &poid, uint32_t seed, ScrubMap::object &o, - ThreadPool::TPHandle &handle) { + ThreadPool::TPHandle &handle, + ScrubMap* const map) { bufferhash h(-1); // we always used -1 int r; uint64_t stride = cct->_conf->osd_deep_scrub_stride; diff --git a/src/osd/ECBackend.h b/src/osd/ECBackend.h index 35655e16d9fe..bcae74e06afc 100644 --- a/src/osd/ECBackend.h +++ b/src/osd/ECBackend.h @@ -673,7 +673,8 @@ public: const hobject_t &obj, uint32_t seed, ScrubMap::object &o, - ThreadPool::TPHandle &handle) override; + ThreadPool::TPHandle &handle, + ScrubMap* const map = nullptr) override; uint64_t be_get_ondisk_size(uint64_t logical_size) override { return sinfo.logical_to_next_chunk_offset(logical_size); } diff --git a/src/osd/PGBackend.cc b/src/osd/PGBackend.cc index 9de930365a6f..f03d6a15ccb6 100644 --- a/src/osd/PGBackend.cc +++ b/src/osd/PGBackend.cc @@ -605,7 +605,7 @@ void PGBackend::be_scan_list( // calculate the CRC32 on deep scrubs if (deep) { - be_deep_scrub(*p, seed, o, handle); + be_deep_scrub(*p, seed, o, handle, &map); } dout(25) << __func__ << " " << poid << dendl; @@ -1104,6 +1104,18 @@ void PGBackend::be_large_omap_check(const map &maps, int& large_omap_objects, ostream &warnstream) const { + bool needs_check = false; + for (const auto& map : maps) { + if (map.second->has_large_omap_object_errors) { + needs_check = true; + break; + } + } + + if (!needs_check) { + return; + } + // Iterate through objects and check large omap object flag for (const auto& k : master_set) { for (const auto& map : maps) { diff --git a/src/osd/PGBackend.h b/src/osd/PGBackend.h index 85a42ad284d4..8a25d0284a2d 100644 --- a/src/osd/PGBackend.h +++ b/src/osd/PGBackend.h @@ -590,7 +590,8 @@ typedef ceph::shared_ptr OSDMapRef; const hobject_t &poid, uint32_t seed, ScrubMap::object &o, - ThreadPool::TPHandle &handle) = 0; + ThreadPool::TPHandle &handle, + ScrubMap* const map = nullptr) = 0; void be_large_omap_check( const map &maps, const set &master_set, diff --git a/src/osd/ReplicatedBackend.cc b/src/osd/ReplicatedBackend.cc index 7f41687c7d4b..9c3a7344a6e6 100644 --- a/src/osd/ReplicatedBackend.cc +++ b/src/osd/ReplicatedBackend.cc @@ -695,7 +695,8 @@ void ReplicatedBackend::be_deep_scrub( const hobject_t &poid, uint32_t seed, ScrubMap::object &o, - ThreadPool::TPHandle &handle) + ThreadPool::TPHandle &handle, + ScrubMap* const map) { dout(10) << __func__ << " " << poid << " seed " << std::hex << seed << std::dec << dendl; @@ -798,6 +799,7 @@ void ReplicatedBackend::be_deep_scrub( o.large_omap_object_found = true; o.large_omap_object_key_count = keys_scanned; o.large_omap_object_value_size = value_sum; + map->has_large_omap_object_errors = true; } if (iter->status() < 0) { diff --git a/src/osd/ReplicatedBackend.h b/src/osd/ReplicatedBackend.h index 3891e0fe2a34..249b056ff238 100644 --- a/src/osd/ReplicatedBackend.h +++ b/src/osd/ReplicatedBackend.h @@ -433,7 +433,8 @@ private: const hobject_t &obj, uint32_t seed, ScrubMap::object &o, - ThreadPool::TPHandle &handle) override; + ThreadPool::TPHandle &handle, + ScrubMap* const map = nullptr) override; uint64_t be_get_ondisk_size(uint64_t logical_size) override { return logical_size; } }; diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 7683991ab57d..34759442b7bc 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -4895,6 +4895,7 @@ 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 insert(const ScrubMap &r) {