From: Sun Yuechi Date: Wed, 1 Jul 2026 08:15:17 +0000 (+0800) Subject: crimson/osd/replicated_recovery_backend: fix use-after-move in stats X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=019bc135105945534c9ef7fadad53d35ecdd388c;p=ceph.git crimson/osd/replicated_recovery_backend: fix use-after-move in stats _handle_pull_response() moved `data` and `push_op.omap_entries` into submit_push_data() (which takes both by value) and only afterwards read data.length() and omap_entries.size(). Both were moved-from by then, so num_bytes_recovered and num_keys_recovered always increased by 0. Capture the lengths before the move. Signed-off-by: Sun Yuechi --- diff --git a/src/crimson/osd/replicated_recovery_backend.cc b/src/crimson/osd/replicated_recovery_backend.cc index 6d43707e14fb..ca57f5c6d7a4 100644 --- a/src/crimson/osd/replicated_recovery_backend.cc +++ b/src/crimson/osd/replicated_recovery_backend.cc @@ -919,14 +919,15 @@ ReplicatedRecoveryBackend::_handle_pull_response( push_op.data_included, push_op.data); bool complete = pull_info.is_complete(); bool clear_omap = !push_op.before_progress.omap_complete; + const auto bytes_recovered = data.length(); + const auto keys_recovered = push_op.omap_entries.size(); co_await submit_push_data(pull_info.recovery_info, first, complete, clear_omap, std::move(data_zeros), std::move(usable_intervals), std::move(data), std::move(push_op.omap_header), push_op.attrset, std::move(push_op.omap_entries), &t); - const auto bytes_recovered = data.length(); - pull_info.stat.num_keys_recovered += push_op.omap_entries.size(); + pull_info.stat.num_keys_recovered += keys_recovered; pull_info.stat.num_bytes_recovered += bytes_recovered; if (complete) {