From: Cory Snyder Date: Tue, 8 Nov 2022 15:26:00 +0000 (+0000) Subject: rgw: refactor RGWDeleteMultiObj formatter_flush_cond member to local var in execute() X-Git-Tag: v16.2.13~36^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=dbda609d73044fd815b1a70262e4d0fd51b2138d;p=ceph.git rgw: refactor RGWDeleteMultiObj formatter_flush_cond member to local var in execute() Make formatter_flush_cond a local variable in RGWDeleteMultiObj::execute(). Signed-off-by: Cory Snyder (cherry picked from commit 9c11b5fb340eb2120ed311b2a9bc13d5fdc5ab43) Conflicts: src/rgw/rgw_op.cc Cherry-pick notes: - rgw_op L7177 version_id arg as local var vs. del_op->result.version_id --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 5e2b3eb6927..64e6b10da9b 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -7035,9 +7035,11 @@ void RGWDeleteMultiObj::write_ops_log_entry(rgw_log_entry& entry) const { entry.delete_multi_obj_meta.objects = std::move(ops_log_entries); } -void RGWDeleteMultiObj::wait_flush(optional_yield y, std::function predicate) +void RGWDeleteMultiObj::wait_flush(optional_yield y, + boost::asio::deadline_timer *formatter_flush_cond, + std::function predicate) { - if (y) { + if (y && formatter_flush_cond) { auto yc = y.get_yield_context(); while (!predicate()) { boost::system::error_code error; @@ -7047,7 +7049,8 @@ void RGWDeleteMultiObj::wait_flush(optional_yield y, std::function predi } } -void RGWDeleteMultiObj::handle_individual_object(const rgw_obj_key *o, optional_yield y) +void RGWDeleteMultiObj::handle_individual_object(const rgw_obj_key *o, optional_yield y, + boost::asio::deadline_timer *formatter_flush_cond) { std::string version_id; RGWObjectCtx *obj_ctx = static_cast(s->obj_ctx); @@ -7060,7 +7063,7 @@ void RGWDeleteMultiObj::handle_individual_object(const rgw_obj_key *o, optional_ rgw::IAM::s3DeleteObjectVersion, ARN(obj->get_obj())); if (identity_policy_res == Effect::Deny) { - send_partial_response(*o, false, "", -EACCES); + send_partial_response(*o, false, "", -EACCES, formatter_flush_cond); return; } @@ -7076,7 +7079,7 @@ void RGWDeleteMultiObj::handle_individual_object(const rgw_obj_key *o, optional_ princ_type); } if (e == Effect::Deny) { - send_partial_response(*o, false, "", -EACCES); + send_partial_response(*o, false, "", -EACCES, formatter_flush_cond); return; } @@ -7088,34 +7091,34 @@ void RGWDeleteMultiObj::handle_individual_object(const rgw_obj_key *o, optional_ rgw::IAM::s3DeleteObjectVersion, ARN(obj->get_obj())); if (session_policy_res == Effect::Deny) { - send_partial_response(*o, false, "", -EACCES); + send_partial_response(*o, false, "", -EACCES, formatter_flush_cond); return; } if (princ_type == rgw::IAM::PolicyPrincipal::Role) { //Intersection of session policy and identity policy plus intersection of session policy and bucket policy if ((session_policy_res != Effect::Allow || identity_policy_res != Effect::Allow) && (session_policy_res != Effect::Allow || e != Effect::Allow)) { - send_partial_response(*o, false, "", -EACCES); + send_partial_response(*o, false, "", -EACCES, formatter_flush_cond); return; } } else if (princ_type == rgw::IAM::PolicyPrincipal::Session) { //Intersection of session policy and identity policy plus bucket policy if ((session_policy_res != Effect::Allow || identity_policy_res != Effect::Allow) && e != Effect::Allow) { - send_partial_response(*o, false, "", -EACCES); + send_partial_response(*o, false, "", -EACCES, formatter_flush_cond); return; } } else if (princ_type == rgw::IAM::PolicyPrincipal::Other) {// there was no match in the bucket policy if (session_policy_res != Effect::Allow || identity_policy_res != Effect::Allow) { - send_partial_response(*o, false, "", -EACCES); + send_partial_response(*o, false, "", -EACCES, formatter_flush_cond); return; } } - send_partial_response(*o, false, "", -EACCES); + send_partial_response(*o, false, "", -EACCES, formatter_flush_cond); return; } if ((identity_policy_res == Effect::Pass && e == Effect::Pass && !acl_allowed)) { - send_partial_response(*o, false, "", -EACCES); + send_partial_response(*o, false, "", -EACCES, formatter_flush_cond); return; } } @@ -7134,7 +7137,7 @@ void RGWDeleteMultiObj::handle_individual_object(const rgw_obj_key *o, optional_ check_obj_lock = false; } else { // Something went wrong. - send_partial_response(*o, false, "", ret); + send_partial_response(*o, false, "", ret, formatter_flush_cond); return; } } else { @@ -7146,7 +7149,7 @@ void RGWDeleteMultiObj::handle_individual_object(const rgw_obj_key *o, optional_ ceph_assert(astate); int object_lock_response = verify_object_lock(this, astate->attrset, bypass_perm, bypass_governance_mode); if (object_lock_response != 0) { - send_partial_response(*o, false, "", object_lock_response); + send_partial_response(*o, false, "", object_lock_response, formatter_flush_cond); return; } } @@ -7159,7 +7162,7 @@ void RGWDeleteMultiObj::handle_individual_object(const rgw_obj_key *o, optional_ rgw::notify::ObjectRemovedDeleteMarkerCreated : rgw::notify::ObjectRemovedDelete; op_ret = rgw::notify::publish_reserve(this, event_type, res, nullptr); if (op_ret < 0) { - send_partial_response(*o, false, "", op_ret); + send_partial_response(*o, false, "", op_ret, formatter_flush_cond); return; } @@ -7171,7 +7174,7 @@ void RGWDeleteMultiObj::handle_individual_object(const rgw_obj_key *o, optional_ op_ret = 0; } - send_partial_response(*o, obj->get_delete_marker(), version_id, op_ret); + send_partial_response(*o, obj->get_delete_marker(), version_id, op_ret, formatter_flush_cond); // send request to notification manager const auto ret = rgw::notify::publish_commit(obj.get(), obj_size, ceph::real_clock::now(), etag, event_type, res, this); @@ -7187,8 +7190,9 @@ void RGWDeleteMultiObj::execute(optional_yield y) vector::iterator iter; RGWMultiDelXMLParser parser; uint32_t aio_count = 0; - uint32_t max_aio = s->cct->_conf->rgw_multi_obj_del_max_aio; + const uint32_t max_aio = s->cct->_conf->rgw_multi_obj_del_max_aio; char* buf; + std::unique_ptr formatter_flush_cond; if (y) { formatter_flush_cond = std::make_unique(y.get_io_context()); } @@ -7254,19 +7258,19 @@ void RGWDeleteMultiObj::execute(optional_yield y) ++iter) { rgw_obj_key* obj_key = &*iter; if (y && max_aio > 1) { - wait_flush(y, [&aio_count, max_aio] { + wait_flush(y, formatter_flush_cond.get(), [&aio_count, max_aio] { return aio_count < max_aio; }); aio_count++; - spawn::spawn(y.get_yield_context(), [this, &y, &aio_count, obj_key] (yield_context yield) { - handle_individual_object(obj_key, optional_yield { y.get_io_context(), yield }); + spawn::spawn(y.get_yield_context(), [this, &y, &aio_count, obj_key, &formatter_flush_cond] (yield_context yield) { + handle_individual_object(obj_key, optional_yield { y.get_io_context(), yield }, formatter_flush_cond.get()); aio_count--; }); } else { - handle_individual_object(obj_key, y); + handle_individual_object(obj_key, y, formatter_flush_cond.get()); } } - wait_flush(y, [this, n=multi_delete->objects.size()] { + wait_flush(y, formatter_flush_cond.get(), [this, n=multi_delete->objects.size()] { return n == ops_log_entries.size(); }); diff --git a/src/rgw/rgw_op.h b/src/rgw/rgw_op.h index fbf97817164..da4dd75b0ad 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -1911,7 +1911,9 @@ class RGWDeleteMultiObj : public RGWOp { * Handles the deletion of an individual object and uses * set_partial_response to record the outcome. */ - void handle_individual_object(const rgw_obj_key *o, optional_yield y); + void handle_individual_object(const rgw_obj_key *o, + optional_yield y, + boost::asio::deadline_timer *formatter_flush_cond); /** * When the request is being executed in a coroutine, performs @@ -1924,20 +1926,12 @@ class RGWDeleteMultiObj : public RGWOp { * and saved on the req_state vs. one that is passed on the stack. * This is a no-op in the case where we're not executing as a coroutine. */ - void wait_flush(optional_yield y, std::function predicate); + void wait_flush(optional_yield y, + boost::asio::deadline_timer *formatter_flush_cond, + std::function predicate); protected: std::vector ops_log_entries; - - /** - * Acts as an async condition variable when the request is being - * executed on a coroutine. Formatter flushing must happen on the main - * request coroutine vs. spawned coroutines, so spawned coroutines use - * the cancellation of this timer to notify the main coroutine when - * data is ready to flush. - */ - std::unique_ptr formatter_flush_cond; - bufferlist data; rgw::sal::RGWBucket* bucket; bool quiet; @@ -1962,7 +1956,8 @@ public: virtual void send_status() = 0; virtual void begin_response() = 0; virtual void send_partial_response(const rgw_obj_key& key, bool delete_marker, - const std::string& marker_version_id, int ret) = 0; + const std::string& marker_version_id, int ret, + boost::asio::deadline_timer *formatter_flush_cond) = 0; virtual void end_response() = 0; const char* name() const override { return "multi_object_delete"; } RGWOpType get_type() override { return RGW_OP_DELETE_MULTI_OBJ; } diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index a0b2d6f36ca..2ec0fb5fdb2 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -3928,7 +3928,8 @@ void RGWDeleteMultiObj_ObjStore_S3::begin_response() void RGWDeleteMultiObj_ObjStore_S3::send_partial_response(const rgw_obj_key& key, bool delete_marker, const string& marker_version_id, - int ret) + int ret, + boost::asio::deadline_timer *formatter_flush_cond) { if (!key.empty()) { delete_multi_obj_entry ops_log_entry; diff --git a/src/rgw/rgw_rest_s3.h b/src/rgw/rgw_rest_s3.h index 9b32e4097c9..c01d8f6b457 100644 --- a/src/rgw/rgw_rest_s3.h +++ b/src/rgw/rgw_rest_s3.h @@ -493,7 +493,8 @@ public: void send_status() override; void begin_response() override; void send_partial_response(const rgw_obj_key& key, bool delete_marker, - const std::string& marker_version_id, int ret) override; + const std::string& marker_version_id, int ret, + boost::asio::deadline_timer *formatter_flush_cond) override; void end_response() override; };