From: Ali Maredia Date: Thu, 2 May 2019 20:49:37 +0000 (-0400) Subject: rgw: thread option_yield through bucket index transaction prepare X-Git-Tag: v15.1.0~2269^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5bcee0969956a343a229842c7ee737c7337debd1;p=ceph.git rgw: thread option_yield through bucket index transaction prepare Signed-off-by: Ali Maredia --- diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index abdfb335657..d7ac54d79bb 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -6034,7 +6034,7 @@ next: } map attrs; - ret = obj->put(bl, attrs, dpp()); + ret = obj->put(bl, attrs, dpp(), null_yield); if (ret < 0) { cerr << "ERROR: put object returned error: " << cpp_strerror(-ret) << std::endl; } @@ -6083,7 +6083,7 @@ next: } } if (need_rewrite) { - ret = store->rewrite_obj(bucket_info, obj, dpp()); + ret = store->rewrite_obj(bucket_info, obj, dpp(), null_yield); if (ret < 0) { cerr << "ERROR: object rewrite returned: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -6200,7 +6200,7 @@ next: if (!need_rewrite) { formatter->dump_string("status", "Skipped"); } else { - r = store->rewrite_obj(bucket_info, obj, dpp()); + r = store->rewrite_obj(bucket_info, obj, dpp(), null_yield); if (r == 0) { formatter->dump_string("status", "Success"); } else { diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index fce0d0b8e81..d1288187c5f 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -715,7 +715,7 @@ int rgw_remove_bucket_bypass_gc(RGWRados *store, rgw_bucket& bucket, } } // for all shadow objs - ret = store->delete_obj_aio(head_obj, info, astate, handles, keep_index_consistent); + ret = store->delete_obj_aio(head_obj, info, astate, handles, keep_index_consistent, null_yield); if (ret < 0) { lderr(store->ctx()) << "ERROR: delete obj aio failed with " << ret << dendl; return ret; diff --git a/src/rgw/rgw_cr_rados.cc b/src/rgw/rgw_cr_rados.cc index 502d35ce5ab..eda3fd19403 100644 --- a/src/rgw/rgw_cr_rados.cc +++ b/src/rgw/rgw_cr_rados.cc @@ -727,7 +727,7 @@ int RGWAsyncRemoveObj::_send_request() del_op.params.high_precision_time = true; del_op.params.zones_trace = &zones_trace; - ret = del_op.delete_obj(); + ret = del_op.delete_obj(null_yield); if (ret < 0) { ldout(store->ctx(), 20) << __func__ << "(): delete_obj() obj=" << obj << " returned ret=" << ret << dendl; } diff --git a/src/rgw/rgw_cr_tools.cc b/src/rgw/rgw_cr_tools.cc index b79e76b56f3..b7a120df09a 100644 --- a/src/rgw/rgw_cr_tools.cc +++ b/src/rgw/rgw_cr_tools.cc @@ -243,7 +243,7 @@ int RGWObjectSimplePutCR::Request::_send_request() obj->set_user_data(*params.user_data); } - ret = obj->put(params.data, params.attrs, dpp); + ret = obj->put(params.data, params.attrs, dpp, null_yield); if (ret < 0) { lderr(cct) << "ERROR: put object returned error: " << cpp_strerror(-ret) << dendl; } diff --git a/src/rgw/rgw_file.cc b/src/rgw/rgw_file.cc index 41f94a24f99..8a79a643103 100644 --- a/src/rgw/rgw_file.cc +++ b/src/rgw/rgw_file.cc @@ -1703,7 +1703,8 @@ namespace rgw { op_ret = processor->complete(s->obj_size, etag, &mtime, real_time(), attrs, (delete_at ? *delete_at : real_time()), - if_match, if_nomatch, nullptr, nullptr, nullptr); + if_match, if_nomatch, nullptr, nullptr, nullptr, + s->yield); if (op_ret != 0) { /* revert attr updates */ rgw_fh->set_mtime(omtime); diff --git a/src/rgw/rgw_lc.cc b/src/rgw/rgw_lc.cc index 59cca9ddaed..3fbb7313e4f 100644 --- a/src/rgw/rgw_lc.cc +++ b/src/rgw/rgw_lc.cc @@ -607,7 +607,7 @@ static int remove_expired_obj(lc_op_ctx& oc, bool remove_indeed) del_op.params.obj_owner = obj_owner; del_op.params.unmod_since = meta.mtime; - return del_op.delete_obj(); + return del_op.delete_obj(null_yield); } class LCOpAction { @@ -877,7 +877,7 @@ public: } int r = oc.store->transition_obj(oc.rctx, oc.bucket_info, oc.obj, - target_placement, o.meta.mtime, o.versioned_epoch, oc.dpp); + target_placement, o.meta.mtime, o.versioned_epoch, oc.dpp, null_yield); if (r < 0) { ldpp_dout(oc.dpp, 0) << "ERROR: failed to transition obj (r=" << r << ")" << dendl; return r; diff --git a/src/rgw/rgw_multi.cc b/src/rgw/rgw_multi.cc index 46962bae958..689a773b7c4 100644 --- a/src/rgw/rgw_multi.cc +++ b/src/rgw/rgw_multi.cc @@ -291,7 +291,7 @@ int abort_multipart_upload(RGWRados *store, CephContext *cct, } // and also remove the metadata obj - ret = del_op.delete_obj(); + ret = del_op.delete_obj(null_yield); if (ret < 0) { ldout(cct, 20) << __func__ << ": del_op.delete_obj returned " << ret << dendl; diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index dfea5ba31db..0fd088f0db2 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -453,7 +453,7 @@ static int modify_obj_attr(RGWRados *store, struct req_state *s, const rgw_obj& } store->set_atomic(s->obj_ctx, read_op.state.obj); attrs[attr_name] = attr_val; - return store->set_attrs(s->obj_ctx, s->bucket_info, read_op.state.obj, attrs, NULL); + return store->set_attrs(s->obj_ctx, s->bucket_info, read_op.state.obj, attrs, NULL, s->yield); } static int read_bucket_policy(RGWRados *store, @@ -1145,7 +1145,7 @@ void RGWDeleteObjTags::execute() map rmattr; bufferlist bl; rmattr[RGW_ATTR_TAGS] = bl; - op_ret = store->set_attrs(s->obj_ctx, s->bucket_info, obj, attrs, &rmattr); + op_ret = store->set_attrs(s->obj_ctx, s->bucket_info, obj, attrs, &rmattr, s->yield); } int RGWGetBucketTags::verify_permission() @@ -4008,7 +4008,8 @@ void RGWPutObj::execute() tracepoint(rgw_op, processor_complete_enter, s->req_id.c_str()); op_ret = processor->complete(s->obj_size, etag, &mtime, real_time(), attrs, (delete_at ? *delete_at : real_time()), if_match, if_nomatch, - (user_data.empty() ? nullptr : &user_data), nullptr, nullptr); + (user_data.empty() ? nullptr : &user_data), nullptr, nullptr, + s->yield); tracepoint(rgw_op, processor_complete_exit, s->req_id.c_str()); /* produce torrent */ @@ -4247,7 +4248,8 @@ void RGWPostObj::execute() op_ret = processor.complete(s->obj_size, etag, nullptr, real_time(), attrs, (delete_at ? *delete_at : real_time()), - nullptr, nullptr, nullptr, nullptr, nullptr); + nullptr, nullptr, nullptr, nullptr, nullptr, + s->yield); if (op_ret < 0) { return; } @@ -4533,7 +4535,7 @@ void RGWPutMetadataObject::execute() } } - op_ret = store->set_attrs(s->obj_ctx, s->bucket_info, obj, attrs, &rmattrs); + op_ret = store->set_attrs(s->obj_ctx, s->bucket_info, obj, attrs, &rmattrs, s->yield); } int RGWDeleteObj::handle_slo_manifest(bufferlist& bl) @@ -4763,7 +4765,7 @@ void RGWDeleteObj::execute() del_op.params.unmod_since = unmod_since; del_op.params.high_precision_time = s->system_request; /* system request uses high precision time */ - op_ret = del_op.delete_obj(); + op_ret = del_op.delete_obj(s->yield); if (op_ret >= 0) { delete_marker = del_op.result.delete_marker; version_id = del_op.result.version_id; @@ -5083,7 +5085,8 @@ void RGWCopyObj::execute() &s->req_id, /* use req_id as tag */ &etag, copy_obj_progress_cb, (void *)this, - this); + this, + s->yield); } int RGWGetACLs::verify_permission() @@ -5746,7 +5749,7 @@ void RGWInitMultipart::execute() encode(upload_info, bl); obj_op.meta.data = &bl; - op_ret = obj_op.write_meta(bl.length(), 0, attrs); + op_ret = obj_op.write_meta(bl.length(), 0, attrs, s->yield); } while (op_ret == -EEXIST); } @@ -6041,7 +6044,7 @@ void RGWCompleteMultipart::execute() obj_op.meta.modify_tail = true; obj_op.meta.completeMultipart = true; obj_op.meta.olh_epoch = olh_epoch; - op_ret = obj_op.write_meta(ofs, accounted_size, attrs); + op_ret = obj_op.write_meta(ofs, accounted_size, attrs, s->yield); if (op_ret < 0) return; @@ -6396,7 +6399,7 @@ void RGWDeleteMultiObj::execute() del_op.params.versioning_status = s->bucket_info.versioning_status(); del_op.params.obj_owner = s->owner; - op_ret = del_op.delete_obj(); + op_ret = del_op.delete_obj(s->yield); if (op_ret == -ENOENT) { op_ret = 0; } @@ -6471,7 +6474,7 @@ bool RGWBulkDelete::Deleter::delete_single(const acct_path_t& path) del_op.params.versioning_status = binfo.versioning_status(); del_op.params.obj_owner = bowner; - ret = del_op.delete_obj(); + ret = del_op.delete_obj(s->yield); if (ret < 0) { goto delop_fail; } @@ -7076,7 +7079,8 @@ int RGWBulkUploadOp::handle_file(const boost::string_ref path, /* Complete the transaction. */ op_ret = processor.complete(size, etag, nullptr, ceph::real_time(), attrs, ceph::real_time() /* delete_at */, - nullptr, nullptr, nullptr, nullptr, nullptr); + nullptr, nullptr, nullptr, nullptr, nullptr, + s->yield); if (op_ret < 0) { ldpp_dout(this, 20) << "processor::complete returned op_ret=" << op_ret << dendl; } @@ -7236,7 +7240,7 @@ void RGWSetAttrs::execute() if (!s->object.empty()) { store->set_atomic(s->obj_ctx, obj); - op_ret = store->set_attrs(s->obj_ctx, s->bucket_info, obj, attrs, nullptr); + op_ret = store->set_attrs(s->obj_ctx, s->bucket_info, obj, attrs, nullptr, s->yield); } else { for (auto& iter : attrs) { s->bucket_attrs[iter.first] = std::move(iter.second); diff --git a/src/rgw/rgw_pubsub.cc b/src/rgw/rgw_pubsub.cc index 5e149a4ca64..1ff28bfa888 100644 --- a/src/rgw/rgw_pubsub.cc +++ b/src/rgw/rgw_pubsub.cc @@ -600,7 +600,7 @@ int RGWUserPubSub::SubWithEvents::remove_event(const string& event_id del_op.params.bucket_owner = bucket_info.owner; del_op.params.versioning_status = bucket_info.versioning_status(); - ret = del_op.delete_obj(); + ret = del_op.delete_obj(null_yield); if (ret < 0) { ldout(store->ctx(), 1) << "ERROR: failed to remove event (obj=" << obj << "): ret=" << ret << dendl; } diff --git a/src/rgw/rgw_putobj_processor.cc b/src/rgw/rgw_putobj_processor.cc index 6460d5218a9..c38c8e190a4 100644 --- a/src/rgw/rgw_putobj_processor.cc +++ b/src/rgw/rgw_putobj_processor.cc @@ -280,7 +280,7 @@ int AtomicObjectProcessor::complete(size_t accounted_size, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, - bool *pcanceled) + bool *pcanceled, optional_yield y) { int r = writer.drain(); if (r < 0) { @@ -316,7 +316,7 @@ int AtomicObjectProcessor::complete(size_t accounted_size, obj_op.meta.zones_trace = zones_trace; obj_op.meta.modify_tail = true; - r = obj_op.write_meta(actual_size, accounted_size, attrs); + r = obj_op.write_meta(actual_size, accounted_size, attrs, y); if (r < 0) { return r; } @@ -418,7 +418,7 @@ int MultipartObjectProcessor::complete(size_t accounted_size, const char *if_nomatch, const std::string *user_data, rgw_zone_set *zones_trace, - bool *pcanceled) + bool *pcanceled, optional_yield y) { int r = writer.drain(); if (r < 0) { @@ -441,7 +441,7 @@ int MultipartObjectProcessor::complete(size_t accounted_size, obj_op.meta.zones_trace = zones_trace; obj_op.meta.modify_tail = true; - r = obj_op.write_meta(actual_size, accounted_size, attrs); + r = obj_op.write_meta(actual_size, accounted_size, attrs, y); if (r < 0) return r; @@ -596,7 +596,8 @@ int AppendObjectProcessor::prepare() int AppendObjectProcessor::complete(size_t accounted_size, const string &etag, ceph::real_time *mtime, ceph::real_time set_mtime, map &attrs, ceph::real_time delete_at, const char *if_match, const char *if_nomatch, - const string *user_data, rgw_zone_set *zones_trace, bool *pcanceled) + const string *user_data, rgw_zone_set *zones_trace, bool *pcanceled, + optional_yield y) { int r = writer.drain(); if (r < 0) @@ -649,7 +650,7 @@ int AppendObjectProcessor::complete(size_t accounted_size, const string &etag, c etag_bl.append(final_etag_str, strlen(final_etag_str) + 1); attrs[RGW_ATTR_ETAG] = etag_bl; } - r = obj_op.write_meta(actual_size + cur_size, accounted_size + *cur_accounted_size, attrs); + r = obj_op.write_meta(actual_size + cur_size, accounted_size + *cur_accounted_size, attrs, y); if (r < 0) { return r; } diff --git a/src/rgw/rgw_putobj_processor.h b/src/rgw/rgw_putobj_processor.h index b202f74fb44..7a5d6f2cbfc 100644 --- a/src/rgw/rgw_putobj_processor.h +++ b/src/rgw/rgw_putobj_processor.h @@ -40,7 +40,8 @@ class ObjectProcessor : public DataProcessor { ceph::real_time delete_at, const char *if_match, const char *if_nomatch, const std::string *user_data, - rgw_zone_set *zones_trace, bool *canceled) = 0; + rgw_zone_set *zones_trace, bool *canceled, + optional_yield y) = 0; }; // an object processor with special handling for the first chunk of the head. @@ -189,7 +190,8 @@ class AtomicObjectProcessor : public ManifestObjectProcessor { ceph::real_time delete_at, const char *if_match, const char *if_nomatch, const std::string *user_data, - rgw_zone_set *zones_trace, bool *canceled) override; + rgw_zone_set *zones_trace, bool *canceled, + optional_yield y) override; }; @@ -235,7 +237,8 @@ class MultipartObjectProcessor : public ManifestObjectProcessor { ceph::real_time delete_at, const char *if_match, const char *if_nomatch, const std::string *user_data, - rgw_zone_set *zones_trace, bool *canceled) override; + rgw_zone_set *zones_trace, bool *canceled, + optional_yield y) override; }; @@ -268,7 +271,8 @@ class MultipartObjectProcessor : public ManifestObjectProcessor { ceph::real_time *mtime, ceph::real_time set_mtime, map& attrs, ceph::real_time delete_at, const char *if_match, const char *if_nomatch, const string *user_data, - rgw_zone_set *zones_trace, bool *canceled) override; + rgw_zone_set *zones_trace, bool *canceled, + optional_yield y) override; }; } // namespace putobj diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 4d152bc89dd..5289f045f87 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -3408,7 +3408,8 @@ int RGWRados::swift_versioning_copy(RGWObjectCtx& obj_ctx, NULL, /* string *petag */ NULL, /* void (*progress_cb)(off_t, void *) */ NULL, /* void *progress_data */ - dpp); + dpp, + null_yield); if (r == -ECANCELED || r == -ENOENT) { /* Has already been overwritten, meaning another rgw process already * copied it out */ @@ -3502,7 +3503,8 @@ int RGWRados::swift_versioning_restore(RGWSysObjectCtx& sysobj_ctx, nullptr, /* string *petag */ nullptr, /* void (*progress_cb)(off_t, void *) */ nullptr, /* void *progress_data */ - dpp); + dpp, + null_yield); if (ret == -ECANCELED || ret == -ENOENT) { /* Has already been overwritten, meaning another rgw process already * copied it out */ @@ -3531,7 +3533,7 @@ int RGWRados::swift_versioning_restore(RGWSysObjectCtx& sysobj_ctx, int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_size, map& attrs, bool assume_noent, bool modify_tail, - void *_index_op) + void *_index_op, optional_yield y) { RGWRados::Bucket::UpdateIndex *index_op = static_cast(_index_op); RGWRados *store = target->get_store(); @@ -3692,7 +3694,7 @@ int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_si if (!index_op->is_prepared()) { tracepoint(rgw_rados, prepare_enter, req_id.c_str()); - r = index_op->prepare(CLS_RGW_OP_ADD, &state->write_tag); + r = index_op->prepare(CLS_RGW_OP_ADD, &state->write_tag, y); tracepoint(rgw_rados, prepare_exit, req_id.c_str()); if (r < 0) return r; @@ -3813,7 +3815,7 @@ done_cancel: } int RGWRados::Object::Write::write_meta(uint64_t size, uint64_t accounted_size, - map& attrs) + map& attrs, optional_yield y) { RGWBucketInfo& bucket_info = target->get_bucket_info(); @@ -3824,13 +3826,13 @@ int RGWRados::Object::Write::write_meta(uint64_t size, uint64_t accounted_size, bool assume_noent = (meta.if_match == NULL && meta.if_nomatch == NULL); int r; if (assume_noent) { - r = _do_write_meta(size, accounted_size, attrs, assume_noent, meta.modify_tail, (void *)&index_op); + r = _do_write_meta(size, accounted_size, attrs, assume_noent, meta.modify_tail, (void *)&index_op, y); if (r == -EEXIST) { assume_noent = false; } } if (!assume_noent) { - r = _do_write_meta(size, accounted_size, attrs, assume_noent, meta.modify_tail, (void *)&index_op); + r = _do_write_meta(size, accounted_size, attrs, assume_noent, meta.modify_tail, (void *)&index_op, y); } return r; } @@ -4010,7 +4012,7 @@ static void set_copy_attrs(map& src_attrs, } } -int RGWRados::rewrite_obj(RGWBucketInfo& dest_bucket_info, const rgw_obj& obj, const DoutPrefixProvider *dpp) +int RGWRados::rewrite_obj(RGWBucketInfo& dest_bucket_info, const rgw_obj& obj, const DoutPrefixProvider *dpp, optional_yield y) { map attrset; @@ -4034,7 +4036,7 @@ int RGWRados::rewrite_obj(RGWBucketInfo& dest_bucket_info, const rgw_obj& obj, c return copy_obj_data(rctx, dest_bucket_info, dest_bucket_info.placement_rule, read_op, obj_size - 1, obj, NULL, mtime, attrset, - 0, real_time(), NULL, dpp); + 0, real_time(), NULL, dpp, y); } struct obj_time_weight { @@ -4464,7 +4466,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, bool canceled = false; ret = processor.complete(cb.get_data_len(), etag, mtime, set_mtime, attrs, delete_at, nullptr, nullptr, nullptr, - zones_trace, &canceled); + zones_trace, &canceled, null_yield); if (ret < 0) { goto set_err_state; } @@ -4589,7 +4591,8 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, string *petag, void (*progress_cb)(off_t, void *), void *progress_data, - const DoutPrefixProvider *dpp) + const DoutPrefixProvider *dpp, + optional_yield y) { int ret; uint64_t obj_size; @@ -4741,7 +4744,7 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, if (copy_data) { /* refcounting tail wouldn't work here, just copy the data */ attrs.erase(RGW_ATTR_TAIL_TAG); return copy_obj_data(obj_ctx, dest_bucket_info, dest_placement, read_op, obj_size - 1, dest_obj, - mtime, real_time(), attrs, olh_epoch, delete_at, petag, dpp); + mtime, real_time(), attrs, olh_epoch, delete_at, petag, dpp, y); } RGWObjManifest::obj_iterator miter = astate->manifest.obj_begin(); @@ -4827,7 +4830,7 @@ int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, write_op.meta.delete_at = delete_at; write_op.meta.modify_tail = !copy_itself; - ret = write_op.write_meta(obj_size, astate->accounted_size, attrs); + ret = write_op.write_meta(obj_size, astate->accounted_size, attrs, y); if (ret < 0) { goto done_ret; } @@ -4866,7 +4869,8 @@ int RGWRados::copy_obj_data(RGWObjectCtx& obj_ctx, uint64_t olh_epoch, real_time delete_at, string *petag, - const DoutPrefixProvider *dpp) + const DoutPrefixProvider *dpp, + optional_yield y) { string tag; append_rand_alpha(cct, tag, tag, 32); @@ -4875,7 +4879,7 @@ int RGWRados::copy_obj_data(RGWObjectCtx& obj_ctx, using namespace rgw::putobj; AtomicObjectProcessor processor(&aio, this, dest_bucket_info, &dest_placement, dest_bucket_info.owner, obj_ctx, - dest_obj, olh_epoch, tag, dpp, null_yield); + dest_obj, olh_epoch, tag, dpp, y); int ret = processor.prepare(); if (ret < 0) return ret; @@ -4929,7 +4933,7 @@ int RGWRados::copy_obj_data(RGWObjectCtx& obj_ctx, } return processor.complete(accounted_size, etag, mtime, set_mtime, attrs, delete_at, - nullptr, nullptr, nullptr, nullptr, nullptr); + nullptr, nullptr, nullptr, nullptr, nullptr, y); } int RGWRados::transition_obj(RGWObjectCtx& obj_ctx, @@ -4938,7 +4942,8 @@ int RGWRados::transition_obj(RGWObjectCtx& obj_ctx, const rgw_placement_rule& placement_rule, const real_time& mtime, uint64_t olh_epoch, - const DoutPrefixProvider *dpp) + const DoutPrefixProvider *dpp, + optional_yield y) { map attrs; real_time read_mtime; @@ -4973,7 +4978,8 @@ int RGWRados::transition_obj(RGWObjectCtx& obj_ctx, olh_epoch, real_time(), nullptr /* petag */, - dpp); + dpp, + y); if (ret < 0) { return ret; } @@ -5418,7 +5424,7 @@ void RGWRados::cls_obj_check_mtime(ObjectOperation& op, const real_time& mtime, * obj: name of the object to delete * Returns: 0 on success, -ERR# otherwise. */ -int RGWRados::Object::Delete::delete_obj() +int RGWRados::Object::Delete::delete_obj(optional_yield y) { RGWRados *store = target->get_store(); rgw_obj& src_obj = target->get_obj(); @@ -5565,7 +5571,7 @@ int RGWRados::Object::Delete::delete_obj() index_op.set_zones_trace(params.zones_trace); index_op.set_bilog_flags(params.bilog_flags); - r = index_op.prepare(CLS_RGW_OP_DEL, &state->write_tag); + r = index_op.prepare(CLS_RGW_OP_DEL, &state->write_tag, y); if (r < 0) return r; @@ -5626,7 +5632,7 @@ int RGWRados::delete_obj(RGWObjectCtx& obj_ctx, del_op.params.expiration_time = expiration_time; del_op.params.zones_trace = zones_trace; - return del_op.delete_obj(); + return del_op.delete_obj(null_yield); } int RGWRados::delete_raw_obj(const rgw_raw_obj& obj) @@ -6172,12 +6178,13 @@ int RGWRados::set_attr(void *ctx, const RGWBucketInfo& bucket_info, rgw_obj& obj { map attrs; attrs[name] = bl; - return set_attrs(ctx, bucket_info, obj, attrs, NULL); + return set_attrs(ctx, bucket_info, obj, attrs, NULL, null_yield); } int RGWRados::set_attrs(void *ctx, const RGWBucketInfo& bucket_info, rgw_obj& src_obj, map& attrs, - map* rmattrs) + map* rmattrs, + optional_yield y) { rgw_obj obj = src_obj; if (obj.key.instance == "null") { @@ -6250,7 +6257,7 @@ int RGWRados::set_attrs(void *ctx, const RGWBucketInfo& bucket_info, rgw_obj& sr string tag; append_rand_alpha(cct, tag, tag, 32); state->write_tag = tag; - r = index_op.prepare(CLS_RGW_OP_ADD, &state->write_tag); + r = index_op.prepare(CLS_RGW_OP_ADD, &state->write_tag, y); if (r < 0) return r; @@ -6472,7 +6479,7 @@ int RGWRados::Bucket::UpdateIndex::guard_reshard(BucketShard **pbs, std::functio return 0; } -int RGWRados::Bucket::UpdateIndex::prepare(RGWModifyOp op, const string *write_tag) +int RGWRados::Bucket::UpdateIndex::prepare(RGWModifyOp op, const string *write_tag, optional_yield y) { if (blind) { return 0; @@ -6488,7 +6495,7 @@ int RGWRados::Bucket::UpdateIndex::prepare(RGWModifyOp op, const string *write_t } int r = guard_reshard(nullptr, [&](BucketShard *bs) -> int { - return store->cls_obj_prepare_op(*bs, op, optag, obj, bilog_flags, zones_trace); + return store->cls_obj_prepare_op(*bs, op, optag, obj, bilog_flags, y, zones_trace); }); if (r < 0) { @@ -9000,7 +9007,7 @@ bool RGWRados::process_expire_objects() } int RGWRados::cls_obj_prepare_op(BucketShard& bs, RGWModifyOp op, string& tag, - rgw_obj& obj, uint16_t bilog_flags, rgw_zone_set *_zones_trace) + rgw_obj& obj, uint16_t bilog_flags, optional_yield y, rgw_zone_set *_zones_trace) { rgw_zone_set zones_trace; if (_zones_trace) { @@ -9012,7 +9019,7 @@ int RGWRados::cls_obj_prepare_op(BucketShard& bs, RGWModifyOp op, string& tag, cls_rgw_obj_key key(obj.key.get_index_key_name(), obj.key.instance); cls_rgw_guard_bucket_resharding(o, -ERR_BUSY_RESHARDING); cls_rgw_bucket_prepare_op(o, op, tag, key, obj.key.get_loc(), svc.zone->get_zone().log_data, bilog_flags, zones_trace); - return bs.index_ctx.operate(bs.bucket_obj, &o); + return rgw_rados_operate(bs.index_ctx, bs.bucket_obj, &o, y); } int RGWRados::cls_obj_complete_op(BucketShard& bs, const rgw_obj& obj, RGWModifyOp op, string& tag, @@ -10114,7 +10121,8 @@ int RGWRados::delete_raw_obj_aio(const rgw_raw_obj& obj, list& handles, bool keep_index_consistent) + list& handles, bool keep_index_consistent, + optional_yield y) { rgw_rados_ref ref; int ret = get_obj_head_ref(bucket_info, obj, &ref); @@ -10127,7 +10135,7 @@ int RGWRados::delete_obj_aio(const rgw_obj& obj, RGWRados::Bucket bop(this, bucket_info); RGWRados::Bucket::UpdateIndex index_op(&bop, obj); - ret = index_op.prepare(CLS_RGW_OP_DEL, &astate->write_tag); + ret = index_op.prepare(CLS_RGW_OP_DEL, &astate->write_tag, y); if (ret < 0) { lderr(cct) << "ERROR: failed to prepare index op with ret=" << ret << dendl; return ret; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 4ef1791a6cb..20b1e360f69 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -1616,9 +1616,9 @@ public: int _do_write_meta(uint64_t size, uint64_t accounted_size, map& attrs, bool modify_tail, bool assume_noent, - void *index_op); + void *index_op, optional_yield y); int write_meta(uint64_t size, uint64_t accounted_size, - map& attrs); + map& attrs, optional_yield y); int write_data(const char *data, uint64_t ofs, uint64_t len, bool exclusive); const req_state* get_req_state() { return (req_state *)target->get_ctx().get_private(); @@ -1654,7 +1654,7 @@ public: explicit Delete(RGWRados::Object *_target) : target(_target) {} - int delete_obj(); + int delete_obj(optional_yield y); }; struct Stat { @@ -1762,7 +1762,7 @@ public: zones_trace = _zones_trace; } - int prepare(RGWModifyOp, const string *write_tag); + int prepare(RGWModifyOp, const string *write_tag, optional_yield y); int complete(int64_t poolid, uint64_t epoch, uint64_t size, uint64_t accounted_size, ceph::real_time& ut, const string& etag, const string& content_type, @@ -1870,7 +1870,7 @@ public: ATTRSMOD_MERGE = 2 }; - int rewrite_obj(RGWBucketInfo& dest_bucket_info, const rgw_obj& obj, const DoutPrefixProvider *dpp); + int rewrite_obj(RGWBucketInfo& dest_bucket_info, const rgw_obj& obj, const DoutPrefixProvider *dpp, optional_yield y); int stat_remote_obj(RGWObjectCtx& obj_ctx, const rgw_user& user_id, @@ -1961,7 +1961,8 @@ public: string *petag, void (*progress_cb)(off_t, void *), void *progress_data, - const DoutPrefixProvider *dpp); + const DoutPrefixProvider *dpp, + optional_yield y); int copy_obj_data(RGWObjectCtx& obj_ctx, RGWBucketInfo& dest_bucket_info, @@ -1974,7 +1975,8 @@ public: uint64_t olh_epoch, ceph::real_time delete_at, string *petag, - const DoutPrefixProvider *dpp); + const DoutPrefixProvider *dpp, + optional_yield y); int transition_obj(RGWObjectCtx& obj_ctx, RGWBucketInfo& bucket_info, @@ -1982,7 +1984,8 @@ public: const rgw_placement_rule& placement_rule, const real_time& mtime, uint64_t olh_epoch, - const DoutPrefixProvider *dpp); + const DoutPrefixProvider *dpp, + optional_yield y); int check_bucket_empty(RGWBucketInfo& bucket_info); @@ -2029,7 +2032,8 @@ public: int set_attrs(void *ctx, const RGWBucketInfo& bucket_info, rgw_obj& obj, map& attrs, - map* rmattrs); + map* rmattrs, + optional_yield y); int get_obj_state(RGWObjectCtx *rctx, const RGWBucketInfo& bucket_info, const rgw_obj& obj, RGWObjState **state, bool follow_olh, bool assume_noent = false); @@ -2196,7 +2200,7 @@ public: int put_linked_bucket_info(RGWBucketInfo& info, bool exclusive, ceph::real_time mtime, obj_version *pep_objv, map *pattrs, bool create_entry_point); - int cls_obj_prepare_op(BucketShard& bs, RGWModifyOp op, string& tag, rgw_obj& obj, uint16_t bilog_flags, rgw_zone_set *zones_trace = nullptr); + int cls_obj_prepare_op(BucketShard& bs, RGWModifyOp op, string& tag, rgw_obj& obj, uint16_t bilog_flags, optional_yield y, rgw_zone_set *zones_trace = nullptr); int cls_obj_complete_op(BucketShard& bs, const rgw_obj& obj, RGWModifyOp op, string& tag, int64_t pool, uint64_t epoch, rgw_bucket_dir_entry& ent, RGWObjCategory category, list *remove_objs, uint16_t bilog_flags, rgw_zone_set *zones_trace = nullptr); int cls_obj_complete_add(BucketShard& bs, const rgw_obj& obj, string& tag, int64_t pool, uint64_t epoch, rgw_bucket_dir_entry& ent, @@ -2354,7 +2358,8 @@ public: int delete_raw_obj_aio(const rgw_raw_obj& obj, list& handles); int delete_obj_aio(const rgw_obj& obj, RGWBucketInfo& info, RGWObjState *astate, - list& handles, bool keep_index_consistent); + list& handles, bool keep_index_consistent, + optional_yield y); /* mfa/totp stuff */ private: diff --git a/src/rgw/rgw_tools.cc b/src/rgw/rgw_tools.cc index eb9760512be..d79e6cbe3c7 100644 --- a/src/rgw/rgw_tools.cc +++ b/src/rgw/rgw_tools.cc @@ -420,7 +420,8 @@ int RGWDataAccess::Bucket::get_object(const rgw_obj_key& key, int RGWDataAccess::Object::put(bufferlist& data, map& attrs, - const DoutPrefixProvider *dpp) + const DoutPrefixProvider *dpp, + optional_yield y) { RGWRados *store = sd->store; CephContext *cct = store->ctx(); @@ -442,7 +443,7 @@ int RGWDataAccess::Object::put(bufferlist& data, using namespace rgw::putobj; AtomicObjectProcessor processor(&aio, store, bucket_info, nullptr, owner.get_id(), obj_ctx, obj, olh_epoch, - req_id, dpp, null_yield); + req_id, dpp, y); int ret = processor.prepare(); if (ret < 0) @@ -526,7 +527,7 @@ int RGWDataAccess::Object::put(bufferlist& data, attrs, delete_at, nullptr, nullptr, puser_data, - nullptr, nullptr); + nullptr, nullptr, y); } void RGWDataAccess::Object::set_policy(const RGWAccessControlPolicy& policy) diff --git a/src/rgw/rgw_tools.h b/src/rgw/rgw_tools.h index b0c7d40ab6a..e3c2471c875 100644 --- a/src/rgw/rgw_tools.h +++ b/src/rgw/rgw_tools.h @@ -155,7 +155,7 @@ public: bucket(_bucket), key(_key) {} public: - int put(bufferlist& data, map& attrs, const DoutPrefixProvider *dpp); /* might modify attrs */ + int put(bufferlist& data, map& attrs, const DoutPrefixProvider *dpp, optional_yield y); /* might modify attrs */ void set_mtime(const ceph::real_time& _mtime) { mtime = _mtime;