]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os, os/bluestore: omap_iterate informs whether it has been stopped
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 26 Nov 2024 18:27:29 +0000 (18:27 +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/os/ObjectStore.h
src/os/bluestore/BlueStore.cc
src/os/kstore/KStore.cc
src/os/memstore/MemStore.cc
src/osd/PrimaryLogPG.cc
src/osd/ReplicatedBackend.cc

index 8235ab1ce218a480a2cc0ea38d5bae0c256765d7..31cb641e0b1ecca7cc73109392a5cd6ca5cdb2c8 100644 (file)
@@ -791,7 +791,10 @@ public:
    *                object's OMAP or till the iteration is stopped
    *                by `STOP`. Please note that if there is no such
    *                entry, `visitor` will be called 0 times.
-   * @return error code, zero on success
+   * @return  - error code (negative value) on failure,
+   *          - positive value when the iteration has been
+   *            stopped (omap_iter_ret_t::STOP) by the callable,
+   *          - 0 otherwise.
    */
   virtual int omap_iterate(
     CollectionHandle &c,
index 8d22a763fc2ccf2997ce12da3d16357baeb2b8a3..3d8a7c7dcfb987992f2ad7bdba72bfd695ad51fe 100644 (file)
@@ -13991,6 +13991,7 @@ int BlueStore::omap_iterate(
   }
 
   // iterate!
+  bool more = false;
   ceph::timespan next_lat_acc{0};
   while (it->valid()) {
     const auto& db_key = it->raw_key_as_sv().second;
@@ -14000,6 +14001,7 @@ int BlueStore::omap_iterate(
     std::string_view user_key = db_key.substr(userkey_offset_in_dbkey);
     omap_iter_ret_t ret = f(user_key, it->value_as_sv());
     if (ret == omap_iter_ret_t::STOP) {
+      more = true;
       break;
     } else if (ret == omap_iter_ret_t::NEXT) {
       ceph::time_guard<ceph::mono_clock> measure_next{next_lat_acc};
@@ -14013,7 +14015,7 @@ int BlueStore::omap_iterate(
     l_bluestore_omap_next_lat,
     next_lat_acc,
     c->store->cct->_conf->bluestore_log_omap_iterator_age);
-  return 0;
+  return more;
 }
 
 // -----------------
index 36c400350a2751e16e50a4706769e59889ebc2c6..0007644f2097d057dd9107caec8d957274ecabe5 100644 (file)
@@ -1881,6 +1881,7 @@ int KStore::omap_iterate(
 {
   dout(10) << __func__ << " " << ch->cid << " " << oid << dendl;
   Collection *c = static_cast<Collection*>(ch.get());
+  bool more = false;
   {
     std::shared_lock l{c->lock};
 
@@ -1927,6 +1928,7 @@ int KStore::omap_iterate(
       }
       omap_iter_ret_t ret = f(user_key, it->value_as_sv());
       if (ret == omap_iter_ret_t::STOP) {
+        more = true;
         break;
       } else if (ret == omap_iter_ret_t::NEXT) {
         it->next();
@@ -1935,7 +1937,7 @@ int KStore::omap_iterate(
       }
     }
   }
-  return 0;
+  return more;
 }
 
 
index 9b88b4eddfc4d6fe79b82879aa26d40dbeae217e..24f172898e7cc716507d997208df8bffd48bfae5 100644 (file)
@@ -629,6 +629,7 @@ int MemStore::omap_iterate(
     return -ENOENT;
   }
 
+  bool more = false;
   {
     std::lock_guard lock{o->omap_mutex};
 
@@ -648,6 +649,7 @@ int MemStore::omap_iterate(
       omap_iter_ret_t ret =
         f(it->first, std::string_view{it->second.c_str(), it->second.length()});
       if (ret == omap_iter_ret_t::STOP) {
+        more = true;
         break;
       } else if (ret == omap_iter_ret_t::NEXT) {
         ++it;
@@ -656,7 +658,7 @@ int MemStore::omap_iterate(
       }
     }
   }
-  return 0;
+  return more;
 }
 
 
index b5c33d4ead6a66934fdf364514ea256ed3ea205a..06da8a4daf93894fc6f0169786e6a209f7962c5c 100644 (file)
@@ -7781,7 +7781,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
        bufferlist bl;
        if (oi.is_omap()) {
          using omap_iter_seek_t = ObjectStore::omap_iter_seek_t;
-         result = osd->store->omap_iterate(
+         const auto result = osd->store->omap_iterate(
            ch, ghobject_t(soid),
            // try to seek as many keys-at-once as possible for the sake of performance.
            // note complexity should be logarithmic, so seek(n/2) + seek(n/2) is worse
index bfdcbcc1a568a9cc788dc9bf1aa30ee8ed6696c3..ac34259d6ab9b3c3ad0c4c785d5d7a7782ab5053 100644 (file)
@@ -827,7 +827,6 @@ int ReplicatedBackend::be_deep_scrub(
 
   // omap
   using omap_iter_seek_t = ObjectStore::omap_iter_seek_t;
-  bool more = false;
   auto result = store->omap_iterate(
     ch,
     ghobject_t{
@@ -839,13 +838,12 @@ int ReplicatedBackend::be_deep_scrub(
       .seek_position = pos.omap_pos,
       .seek_type = omap_iter_seek_t::LOWER_BOUND
     },
-    [&pos, &more, first=true, max=cct->_conf->osd_deep_scrub_keys]
+    [&pos, first=true, max=cct->_conf->osd_deep_scrub_keys]
     (std::string_view key, std::string_view value) mutable {
       --max;
       if (first) {
         first = false; // preserve exact compat on `max` with old code
       } else if (max == 0) {
-        more = true;
         pos.omap_pos = key;
         return ObjectStore::omap_iter_ret_t::STOP;
       }
@@ -857,7 +855,7 @@ int ReplicatedBackend::be_deep_scrub(
     });
   if (result < 0) {
     return -EIO;
-  } else if (more) {
+  } else if (const auto more = static_cast<bool>(result); more) {
     return -EINPROGRESS;
   }
 
@@ -2203,7 +2201,6 @@ int ReplicatedBackend::build_push_op(const ObjectRecoveryInfo &recovery_info,
 
   uint64_t available = cct->_conf->osd_recovery_max_chunk;
   if (!progress.omap_complete) {
-    std::optional<std::string> more_from;
     using omap_iter_seek_t = ObjectStore::omap_iter_seek_t;
     auto result = store->omap_iterate(
       ch,
@@ -2215,17 +2212,17 @@ int ReplicatedBackend::build_push_op(const ObjectRecoveryInfo &recovery_info,
         .seek_position = progress.omap_recovered_to,
         .seek_type = omap_iter_seek_t::LOWER_BOUND
       },
-      [&available, &more_from, &omap_entries=out_op->omap_entries,
+      [&available, &new_progress, &omap_entries=out_op->omap_entries,
        max_entries=cct->_conf->osd_recovery_max_omap_entries_per_chunk]
       (std::string_view key, std::string_view value) mutable {
         const auto num_new_bytes = key.size() + value.size();
         if (auto cur_num_entries = omap_entries.size(); cur_num_entries > 0) {
          if (max_entries > 0 && cur_num_entries >= max_entries) {
-           more_from = key;
-            return ObjectStore::omap_iter_ret_t::STOP;
+            new_progress.omap_recovered_to = key;
+            return ObjectStore::omap_iter_ret_t::STOP; // want more!
          }
          if (num_new_bytes >= available) {
-           more_from = key;
+            new_progress.omap_recovered_to = key;
             return ObjectStore::omap_iter_ret_t::STOP;
          }
         }
@@ -2235,9 +2232,7 @@ int ReplicatedBackend::build_push_op(const ObjectRecoveryInfo &recovery_info,
       });
     if (result < 0) {
       return -EIO;
-    } else if (more_from) {
-      new_progress.omap_recovered_to = *more_from;
-    } else {
+    } else if (const auto more = static_cast<bool>(result); !more) {
       new_progress.omap_complete = true;
     }
   }