From: Casey Bodley Date: Wed, 27 May 2026 20:22:14 +0000 (-0400) Subject: rgw: use local error code in handle_individual_object() X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=72483c1eb0bae5caaee26090e053d24c6500e919;p=ceph.git rgw: use local error code in handle_individual_object() op_ret is a member variable of RGWDeleteMultiObj shared between concurrent callers of handle_individual_object(). because that coroutine may suspend between writing to op_ret and later reading it back for send_partial_response(), it's likely that other callers have modified it in the meantime store this error code in a local variable instead, so each coroutine has its own consistent copy of it Fixes: https://tracker.ceph.com/issues/76960 Signed-off-by: Casey Bodley --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 9809a481f905..e7c21d1aa3fe 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -8079,9 +8079,9 @@ void RGWDeleteMultiObj::handle_individual_object(const RGWMultiDelObject& object rgw::notify::ObjectRemovedDelete; std::unique_ptr res = driver->get_notification(obj.get(), s->src_object.get(), s, event_type, y); - op_ret = res->publish_reserve(dpp); - if (op_ret < 0) { - send_partial_response(o, false, "", op_ret); + int r = res->publish_reserve(dpp); + if (r < 0) { + send_partial_response(o, false, "", r); return; } @@ -8097,10 +8097,10 @@ void RGWDeleteMultiObj::handle_individual_object(const RGWMultiDelObject& object del_op->params.if_match = object.get_if_match(); del_op->params.size_match = object.get_size_match(); - op_ret = del_op->delete_obj(dpp, y, - rgw::sal::FLAG_LOG_OP | (skip_olh_obj_update ? rgw::sal::FLAG_SKIP_UPDATE_OLH : 0)); - if (op_ret == -ENOENT) { - op_ret = 0; + r = del_op->delete_obj(dpp, y, + rgw::sal::FLAG_LOG_OP | (skip_olh_obj_update ? rgw::sal::FLAG_SKIP_UPDATE_OLH : 0)); + if (r == -ENOENT) { + r = 0; } if (auto ret = rgw::bucketlogging::log_record(driver, rgw::bucketlogging::LoggingType::Any, obj.get(), s, canonical_name(), etag, obj_size, this, y, true, false); ret < 0) { @@ -8108,7 +8108,7 @@ void RGWDeleteMultiObj::handle_individual_object(const RGWMultiDelObject& object ldpp_dout(this, 5) << "WARNING: multi DELETE operation ignores bucket logging failure: " << ret << dendl; } - if (op_ret == 0) { + if (r == 0) { // send request to notification manager int ret = res->publish_commit(dpp, obj_size, ceph::real_clock::now(), etag, version_id); if (ret < 0) { @@ -8117,7 +8117,7 @@ void RGWDeleteMultiObj::handle_individual_object(const RGWMultiDelObject& object } } - send_partial_response(o, del_op->result.delete_marker, del_op->result.version_id, op_ret); + send_partial_response(o, del_op->result.delete_marker, del_op->result.version_id, r); } void RGWDeleteMultiObj::handle_objects(const std::vector& objects,