]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: switch SnapMapper to omap_iterate
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 27 Nov 2024 00:29:17 +0000 (00:29 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 4 Apr 2025 18:21:54 +0000 (18:21 +0000)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/osd/SnapMapper.cc
src/osd/SnapMapper.h

index 265b2a0c7f5a79753c0110d2528b93a4131f3182..ceb6dc34e69cd32f2ebcb0d5308ddf2d03e5c3b8 100644 (file)
@@ -925,44 +925,39 @@ void SnapMapper::record_purged_snaps(
 
 
 #ifndef WITH_CRIMSON
-bool SnapMapper::Scrubber::_parse_p(ObjectMap::ObjectMapIterator& psit)
+bool SnapMapper::Scrubber::_parse_p(std::string_view key, std::string_view value)
 {
-  if (!psit->valid()) {
+  if (key.find(PURGED_SNAP_PREFIX) != 0) {
     pool = -1;
     return false;
   }
-  if (psit->key().find(PURGED_SNAP_PREFIX) != 0) {
-    pool = -1;
-    return false;
-  }
-  ceph::buffer::list v = psit->value();
+  ceph::buffer::list v;
+  v.append(value);
   auto p = v.cbegin();
   ceph::decode(pool, p);
   ceph::decode(begin, p);
   ceph::decode(end, p);
   dout(20) << __func__ << " purged_snaps pool " << pool
           << " [" << begin << "," << end << ")" << dendl;
-  psit->next();
   return true;
 }
 
-bool SnapMapper::Scrubber::_parse_m(ObjectMap::ObjectMapIterator& mapit)
+bool SnapMapper::Scrubber::_parse_m(
+  std::string_view key,
+  std::string_view value)
 {
-  if (!mapit->valid()) {
+  if (key.find(MAPPING_PREFIX) != 0) {
     return false;
   }
-  if (mapit->key().find(MAPPING_PREFIX) != 0) {
-    return false;
-  }
-  auto v = mapit->value();
+  ceph::bufferlist v;
+  v.append(value); // create_static if decoding if anyhow visible a flamegraph
   auto p = v.cbegin();
   mapping.decode(p);
 
   {
     unsigned long long p, s;
     long sh;
-    string k = mapit->key();
-    int r = sscanf(k.c_str(), "SNA_%lld_%llx.%lx", &p, &s, &sh);
+    int r = sscanf(key.data(), "SNA_%lld_%llx.%lx", &p, &s, &sh);
     if (r != 1) {
       shard = shard_id_t::NO_SHARD;
     } else {
@@ -973,7 +968,6 @@ bool SnapMapper::Scrubber::_parse_m(ObjectMap::ObjectMapIterator& mapit)
           << " snap " << mapping.snap
           << " shard " << shard
           << " " << mapping.hoid << dendl;
-  mapit->next();
   return true;
 }
 
@@ -981,54 +975,69 @@ void SnapMapper::Scrubber::run()
 {
   dout(10) << __func__ << dendl;
 
-  ObjectMap::ObjectMapIterator psit;
-  ObjectMap::ObjectMapIterator mapit;
-
-  psit = store->get_omap_iterator(ch, purged_snaps_hoid);
-  psit->upper_bound(PURGED_SNAP_PREFIX);
-  _parse_p(psit);
-
-  mapit = store->get_omap_iterator(ch, mapping_hoid);
-  mapit->upper_bound(MAPPING_PREFIX);
-
-  while (_parse_m(mapit)) {
-    // advance to next purged_snaps range?
-    while (pool >= 0 &&
-          (mapping.hoid.pool > pool ||
-           (mapping.hoid.pool == pool && mapping.snap >= end))) {
-      _parse_p(psit);
-    }
-    if (pool < 0) {
-      dout(10) << __func__ << " passed final purged_snaps interval, rest ok"
-              << dendl;
-      break;
-    }
-    if (mapping.hoid.pool < pool ||
-       mapping.snap < begin) {
-      // ok
-      dout(20) << __func__ << " ok " << mapping.hoid
-              << " snap " << mapping.snap
-              << " precedes pool " << pool
-              << " purged_snaps [" << begin << "," << end << ")" << dendl;
-    } else {
-      assert(mapping.snap >= begin &&
-            mapping.snap < end &&
-            mapping.hoid.pool == pool);
-      // invalid
-      dout(10) << __func__ << " stray " << mapping.hoid
-              << " snap " << mapping.snap
-              << " in pool " << pool
-              << " shard " << shard
-              << " purged_snaps [" << begin << "," << end << ")" << dendl;
-      stray.emplace_back(std::tuple<int64_t,snapid_t,uint32_t,shard_id_t>(
-                          pool, mapping.snap, mapping.hoid.get_hash(),
-                          shard
-                          ));
-    }
-  }
-
+  store->omap_iterate(
+    ch, mapping_hoid,
+    ObjectStore::omap_iter_seek_t{
+      .seek_position = MAPPING_PREFIX,
+      .seek_type = ObjectStore::omap_iter_seek_t::UPPER_BOUND
+    },
+    [this] (std::string_view key, std::string_view value) mutable {
+      if (!_parse_m(key, value)) {
+        return ObjectStore::omap_iter_ret_t::STOP;
+      }
+      // advance to next purged_snaps range?
+      const auto ret = store->omap_iterate(
+        ch, purged_snaps_hoid,
+        ObjectStore::omap_iter_seek_t{
+          .seek_position = PURGED_SNAP_PREFIX,
+          .seek_type = ObjectStore::omap_iter_seek_t::UPPER_BOUND
+        },
+        [this] (std::string_view key, std::string_view value) mutable {
+          _parse_p(key, value);
+          if (pool >= 0 &&
+                 (mapping.hoid.pool > pool ||
+                  (mapping.hoid.pool == pool && mapping.snap >= end))) {
+            return ObjectStore::omap_iter_ret_t::NEXT;
+         } else {
+            return ObjectStore::omap_iter_ret_t::STOP;
+         }
+        });
+      if (ret < 0) {
+       // beware _parse_p() also modifies pool
+       pool = -1;
+       derr << "omap_iterate() on purged_snaps_hoid returns " << ret << dendl;
+      } else if (const auto more = static_cast<bool>(ret); !more) {
+       pool = -1;
+      }
+      if (pool < 0) {
+        dout(10) << __func__ << " passed final purged_snaps interval, rest ok"
+                 << dendl;
+        return ObjectStore::omap_iter_ret_t::STOP;
+      }
+      if (mapping.hoid.pool < pool ||
+          mapping.snap < begin) {
+        // ok
+        dout(20) << __func__ << " ok " << mapping.hoid
+                 << " snap " << mapping.snap
+                 << " precedes pool " << pool
+                 << " purged_snaps [" << begin << "," << end << ")" << dendl;
+      } else {
+        assert(mapping.snap >= begin);
+        assert(mapping.snap < end);
+        assert(mapping.hoid.pool == pool);
+        // invalid
+        dout(10) << __func__ << " stray " << mapping.hoid
+                 << " snap " << mapping.snap
+                 << " in pool " << pool
+                 << " shard " << shard
+                 << " purged_snaps [" << begin << "," << end << ")" << dendl;
+        stray.emplace_back(std::tuple<int64_t,snapid_t,uint32_t,shard_id_t>(
+                          pool, mapping.snap, mapping.hoid.get_hash(),
+                          shard
+                          ));
+      }
+      return ObjectStore::omap_iter_ret_t::NEXT;
+    });
   dout(10) << __func__ << " end, found " << stray.size() << " stray" << dendl;
-  psit = ObjectMap::ObjectMapIterator();
-  mapit = ObjectMap::ObjectMapIterator();
 }
 #endif // !WITH_CRIMSON
index 9f40226c7ff311c6b6a231ffa47a45b414131837..377b2185b9db68d0f5dc13757ef89e894ee7c1ad 100644 (file)
@@ -186,12 +186,12 @@ public:
     int64_t pool;
     snapid_t begin, end;
 
-    bool _parse_p(ObjectMap::ObjectMapIterator& psit);   ///< advance the purged_snaps pointer
+    bool _parse_p(std::string_view key, std::string_view value);
 
     Mapping mapping;
     shard_id_t shard;
 
-    bool _parse_m(ObjectMap::ObjectMapIterator& mapit);   ///< advance the (object) mapper pointer
+    bool _parse_m(std::string_view key, std::string_view value);
 
     std::vector<std::tuple<int64_t, snapid_t, uint32_t, shard_id_t>> stray;