From 2094fda7655ddd82b56850b3ded961a8c5c66966 Mon Sep 17 00:00:00 2001 From: Brad Hubbard Date: Fri, 13 Oct 2017 15:46:47 +1000 Subject: [PATCH] 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 --- src/osd/ECBackend.cc | 3 ++- src/osd/ECBackend.h | 3 ++- src/osd/PGBackend.cc | 14 +++++++++++++- src/osd/PGBackend.h | 3 ++- src/osd/ReplicatedBackend.cc | 4 +++- src/osd/ReplicatedBackend.h | 3 ++- src/osd/osd_types.h | 1 + 7 files changed, 25 insertions(+), 6 deletions(-) diff --git a/src/osd/ECBackend.cc b/src/osd/ECBackend.cc index 780bdb676b3..1c81165c3c5 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 35655e16d9f..bcae74e06af 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 9de930365a6..f03d6a15ccb 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 85a42ad284d..8a25d0284a2 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 7f41687c7d4..9c3a7344a6e 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 3891e0fe2a3..249b056ff23 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 7683991ab57..34759442b7b 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) { -- 2.39.5