]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: Add a flag to ScrubMap to signal check needed
authorBrad Hubbard <bhubbard@redhat.com>
Fri, 13 Oct 2017 05:46:47 +0000 (15:46 +1000)
committerNathan Cutler <ncutler@suse.com>
Thu, 3 May 2018 16:46:29 +0000 (18:46 +0200)
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 <bhubbard@redhat.com>
(cherry picked from commit 2094fda7655ddd82b56850b3ded961a8c5c66966)

src/osd/ECBackend.cc
src/osd/ECBackend.h
src/osd/PGBackend.cc
src/osd/PGBackend.h
src/osd/ReplicatedBackend.cc
src/osd/ReplicatedBackend.h
src/osd/osd_types.h

index 3e6663630d13fff2a6418c34517f64284a884c60..5eccb1887e723dba346a429a535681a767ba4d69 100644 (file)
@@ -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;
index 120e2d298bfadefc0b518975c975d7ccd08b957c..8799ec991fc19e5f3e72f2933373f098cf0aa06c 100644 (file)
@@ -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);
   }
index 95ee62b219a6c6b547dc1b1ad45ead0a949ad51b..21b896262a204362503e771a79e73c1509441356 100644 (file)
@@ -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<pg_shard_t,ScrubMap*> &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) {
index 2d9ba77fc16df7d315104083cd9cce8ddcdc5682..7a1eae025c7c33858b6a420cbd3c21173f446f51 100644 (file)
@@ -594,7 +594,8 @@ typedef ceph::shared_ptr<const OSDMap> 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<pg_shard_t,ScrubMap*> &maps,
      const set<hobject_t> &master_set,
index 77040239ff386eada382b192033e95229ec1ff42..2b7bc325039b84030da07a2912560b52e270aee7 100644 (file)
@@ -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) {
index 7cb1df40c63a6f84b70ff586ee73437adc3ad332..50f3861e3ee8c01fb347f198f4e4b743b8c196da 100644 (file)
@@ -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; }
 };
 
index 3e0c1f53bf94775415df5ba1a16fbd09098a9420..2d93d7bdf08a5671fb3e4c052790e116fe7c61d5 100644 (file)
@@ -4965,6 +4965,7 @@ struct ScrubMap {
   map<hobject_t,object> 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) {