From: Samuel Just Date: Fri, 20 Sep 2024 19:56:17 +0000 (-0700) Subject: crimson: introduce rollback_obc_if_modified without an error argument X-Git-Tag: v20.0.0~812^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5e28a3bd3b58353ff29cf1cd1b9627575158c290;p=ceph.git crimson: introduce rollback_obc_if_modified without an error argument Signed-off-by: Samuel Just --- diff --git a/src/crimson/osd/ops_executer.h b/src/crimson/osd/ops_executer.h index 185ead24e755..6986f49ea08a 100644 --- a/src/crimson/osd/ops_executer.h +++ b/src/crimson/osd/ops_executer.h @@ -551,6 +551,7 @@ OpsExecuter::flush_changes_n_do_ops_effects( template struct OpsExecuter::RollbackHelper { + void rollback_obc_if_modified(); void rollback_obc_if_modified(const std::error_code& e); seastar::lw_shared_ptr ox; Func func; @@ -562,6 +563,33 @@ OpsExecuter::create_rollbacker(Func&& func) { return {shared_from_this(), std::forward(func)}; } +template +void OpsExecuter::RollbackHelper::rollback_obc_if_modified() +{ + // Oops, an operation had failed. do_osd_ops() altogether with + // OpsExecuter already dropped the ObjectStore::Transaction if + // there was any. However, this is not enough to completely + // rollback as we gave OpsExecuter the very single copy of `obc` + // we maintain and we did it for both reading and writing. + // Now all modifications must be reverted. + // + // The conditional's purpose is to efficiently handle hot errors + // which may appear as a result of e.g. CEPH_OSD_OP_CMPXATTR or + // CEPH_OSD_OP_OMAP_CMP. These are read-like ops and clients + // typically append them before any write. If OpsExecuter hasn't + // seen any modifying operation, `obc` is supposed to be kept + // unchanged. + assert(ox); + const auto need_rollback = ox->has_seen_write(); + crimson::get_logger(ceph_subsys_osd).debug( + "{}: object {} got error, need_rollback={}", + __func__, + ox->obc->get_oid(), + need_rollback); + if (need_rollback) { + func(ox->obc); + } +} template void OpsExecuter::RollbackHelper::rollback_obc_if_modified(