]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: switch rest of PrimaryLogPG to omap_iterate
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 29 Nov 2024 20:21:26 +0000 (20:21 +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/PrimaryLogPG.cc

index 06da8a4daf93894fc6f0169786e6a209f7962c5c..1340ec88679a7f6379fcc3588dbe480c2a3d5d09 100644 (file)
@@ -7733,18 +7733,26 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
        uint32_t num = 0;
        bool truncated = false;
        if (oi.is_omap()) {
-         ObjectMap::ObjectMapIterator iter = osd->store->get_omap_iterator(
-           ch, ghobject_t(soid)
-           );
-         ceph_assert(iter);
-         iter->upper_bound(start_after);
-         for (num = 0; iter->valid(); ++num, iter->next()) {
-           if (num >= max_return ||
-               bl.length() >= cct->_conf->osd_max_omap_bytes_per_request) {
-             truncated = true;
-             break;
-           }
-           encode(iter->key(), bl);
+          const auto result = osd->store->omap_iterate(
+            ch, ghobject_t(soid),
+            ObjectStore::omap_iter_seek_t{
+              .seek_position = start_after,
+              .seek_type = ObjectStore::omap_iter_seek_t::UPPER_BOUND
+            },
+            [&bl, &num, max_return,
+            max_bytes=cct->_conf->osd_max_omap_bytes_per_request]
+            (std::string_view key, std::string_view value) mutable {
+             if (num >= max_return || bl.length() >= max_bytes) {
+                return ObjectStore::omap_iter_ret_t::STOP;
+             }
+             encode(key, bl);
+             ++num;
+              return ObjectStore::omap_iter_ret_t::NEXT;
+            });
+          if (result < 0) {
+           ceph_abort();
+         } else if (const auto more = static_cast<bool>(result); more) {
+           truncated = true;
          }
        } // else return empty out_set
        encode(num, osd_op.outdata);
@@ -9384,28 +9392,34 @@ int PrimaryLogPG::do_copy_get(OpContext *ctx, bufferlist::const_iterator& bp,
                                    &reply_obj.omap_header);
       }
       bufferlist omap_data;
-      ObjectMap::ObjectMapIterator iter =
-       osd->store->get_omap_iterator(ch, ghobject_t(oi.soid));
-      ceph_assert(iter);
-      iter->upper_bound(cursor.omap_offset);
-      for (; iter->valid(); iter->next()) {
-       ++omap_keys;
-       encode(iter->key(), omap_data);
-       encode(iter->value(), omap_data);
-       left -= iter->key().length() + 4 + iter->value().length() + 4;
-       if (left <= 0)
-         break;
+      const auto result = osd->store->omap_iterate(
+        ch, ghobject_t(oi.soid),
+        ObjectStore::omap_iter_seek_t{
+          .seek_position = cursor.omap_offset,
+          .seek_type = ObjectStore::omap_iter_seek_t::UPPER_BOUND
+        },
+        [&omap_data, &omap_keys, &left, &cursor]
+        (std::string_view key, std::string_view value) mutable {
+         ++omap_keys;
+         encode(key, omap_data);
+         encode(value, omap_data);
+         left -= key.length() + 4 + value.length() + 4;
+         if (left <= 0) {
+           cursor.omap_offset = key;
+            return ObjectStore::omap_iter_ret_t::STOP;
+         }
+          return ObjectStore::omap_iter_ret_t::NEXT;
+        });
+      if (result < 0) {
+       ceph_abort();
+      } else if (const auto more = static_cast<bool>(result); !more) {
+       cursor.omap_complete = true;
+       dout(20) << " got omap" << dendl;
       }
       if (omap_keys) {
        encode(omap_keys, reply_obj.omap_data);
        reply_obj.omap_data.claim_append(omap_data);
       }
-      if (iter->valid()) {
-       cursor.omap_offset = iter->key();
-      } else {
-       cursor.omap_complete = true;
-       dout(20) << " got omap" << dendl;
-      }
     }
   }