From 721fe711326b82ca9aaf77b90bf98baec7a1fae3 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 26 Nov 2024 18:27:29 +0000 Subject: [PATCH] os, os/bluestore: omap_iterate informs whether it has been stopped Signed-off-by: Radoslaw Zarzynski --- src/os/ObjectStore.h | 5 ++++- src/os/bluestore/BlueStore.cc | 4 +++- src/os/kstore/KStore.cc | 4 +++- src/os/memstore/MemStore.cc | 4 +++- src/osd/PrimaryLogPG.cc | 2 +- src/osd/ReplicatedBackend.cc | 19 +++++++------------ 6 files changed, 21 insertions(+), 17 deletions(-) diff --git a/src/os/ObjectStore.h b/src/os/ObjectStore.h index 8235ab1ce218a..31cb641e0b1ec 100644 --- a/src/os/ObjectStore.h +++ b/src/os/ObjectStore.h @@ -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, diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index 8d22a763fc2cc..3d8a7c7dcfb98 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -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 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; } // ----------------- diff --git a/src/os/kstore/KStore.cc b/src/os/kstore/KStore.cc index 36c400350a275..0007644f2097d 100644 --- a/src/os/kstore/KStore.cc +++ b/src/os/kstore/KStore.cc @@ -1881,6 +1881,7 @@ int KStore::omap_iterate( { dout(10) << __func__ << " " << ch->cid << " " << oid << dendl; Collection *c = static_cast(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; } diff --git a/src/os/memstore/MemStore.cc b/src/os/memstore/MemStore.cc index 9b88b4eddfc4d..24f172898e7cc 100644 --- a/src/os/memstore/MemStore.cc +++ b/src/os/memstore/MemStore.cc @@ -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; } diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index b5c33d4ead6a6..06da8a4daf938 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -7781,7 +7781,7 @@ int PrimaryLogPG::do_osd_ops(OpContext *ctx, vector& 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 diff --git a/src/osd/ReplicatedBackend.cc b/src/osd/ReplicatedBackend.cc index bfdcbcc1a568a..ac34259d6ab9b 100644 --- a/src/osd/ReplicatedBackend.cc +++ b/src/osd/ReplicatedBackend.cc @@ -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(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 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(result); !more) { new_progress.omap_complete = true; } } -- 2.39.5