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: v12.2.6~166^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=e6d6f373d46fff2b0489bf2fdcc10a96565d0a39;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 (cherry picked from commit 2094fda7655ddd82b56850b3ded961a8c5c66966) --- diff --git a/src/osd/ECBackend.cc b/src/osd/ECBackend.cc index 3e6663630d13..5eccb1887e72 100644 --- a/src/osd/ECBackend.cc +++ b/src/osd/ECBackend.cc @@ -2390,7 +2390,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 120e2d298bfa..8799ec991fc1 100644 --- a/src/osd/ECBackend.h +++ b/src/osd/ECBackend.h @@ -674,7 +674,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 95ee62b219a6..21b896262a20 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; @@ -1128,6 +1128,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 2d9ba77fc16d..7a1eae025c7c 100644 --- a/src/osd/PGBackend.h +++ b/src/osd/PGBackend.h @@ -594,7 +594,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 77040239ff38..2b7bc325039b 100644 --- a/src/osd/ReplicatedBackend.cc +++ b/src/osd/ReplicatedBackend.cc @@ -707,7 +707,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; @@ -803,6 +804,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 7cb1df40c63a..50f3861e3ee8 100644 --- a/src/osd/ReplicatedBackend.h +++ b/src/osd/ReplicatedBackend.h @@ -434,7 +434,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 3e0c1f53bf94..2d93d7bdf08a 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -4965,6 +4965,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) {