From 1e6670141301b7222d013e8ec5d8d7f9470787da Mon Sep 17 00:00:00 2001 From: Ali Maredia Date: Tue, 17 Jan 2023 15:28:05 -0500 Subject: [PATCH] rgw: stop blocking for asio threads for create_bucket() Asio thread for create_bucket operation are no longer blocked because optional yield is passed down in previous instances where asio threads for op were blocked. Signed-off-by: Ali Maredia --- src/rgw/driver/rados/rgw_bucket.cc | 10 +++++----- src/rgw/driver/rados/rgw_cr_rados.cc | 2 +- src/rgw/driver/rados/rgw_data_sync.cc | 2 +- src/rgw/driver/rados/rgw_rados.cc | 16 ++++++++-------- src/rgw/driver/rados/rgw_rados.h | 4 ++-- src/rgw/driver/rados/rgw_reshard.cc | 6 +++--- src/rgw/driver/rados/rgw_sal_rados.cc | 16 ++++++++-------- src/rgw/services/svc_user_rados.cc | 2 +- 8 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/rgw/driver/rados/rgw_bucket.cc b/src/rgw/driver/rados/rgw_bucket.cc index e404037bce6..90f5c21c4ef 100644 --- a/src/rgw/driver/rados/rgw_bucket.cc +++ b/src/rgw/driver/rados/rgw_bucket.cc @@ -110,7 +110,7 @@ void check_bad_user_bucket_mapping(rgw::sal::Driver* driver, rgw::sal::User& use auto& bucket = i->second; std::unique_ptr actual_bucket; - int r = driver->get_bucket(dpp, &user, user.get_tenant(), bucket->get_name(), &actual_bucket, null_yield); + int r = driver->get_bucket(dpp, &user, user.get_tenant(), bucket->get_name(), &actual_bucket, y); if (r < 0) { ldout(driver->ctx(), 0) << "could not get bucket info for bucket=" << bucket << dendl; continue; @@ -123,7 +123,7 @@ void check_bad_user_bucket_mapping(rgw::sal::Driver* driver, rgw::sal::User& use cout << "bucket info mismatch: expected " << actual_bucket << " got " << bucket << std::endl; if (fix) { cout << "fixing" << std::endl; - r = actual_bucket->chown(dpp, user, null_yield); + r = actual_bucket->chown(dpp, user, y); if (r < 0) { cerr << "failed to fix bucket: " << cpp_strerror(-r) << std::endl; } @@ -984,7 +984,7 @@ int RGWBucketAdminOp::limit_check(rgw::sal::Driver* driver, * as we may now not reach the end of * the loop body */ - ret = bucket->load_bucket(dpp, null_yield); + ret = bucket->load_bucket(dpp, y); if (ret < 0) continue; @@ -1060,7 +1060,7 @@ int RGWBucketAdminOp::info(rgw::sal::Driver* driver, int ret = 0; const std::string& bucket_name = op_state.get_bucket_name(); if (!bucket_name.empty()) { - ret = bucket.init(driver, op_state, null_yield, dpp); + ret = bucket.init(driver, op_state, y, dpp); if (-ENOENT == ret) return -ERR_NO_SUCH_BUCKET; else if (ret < 0) @@ -2770,7 +2770,7 @@ int RGWBucketCtl::sync_user_stats(const DoutPrefixProvider *dpp, if (!pent) { pent = &ent; } - int r = svc.bi->read_stats(dpp, bucket_info, pent, null_yield); + int r = svc.bi->read_stats(dpp, bucket_info, pent, y); if (r < 0) { ldpp_dout(dpp, 20) << __func__ << "(): failed to read bucket stats (r=" << r << ")" << dendl; return r; diff --git a/src/rgw/driver/rados/rgw_cr_rados.cc b/src/rgw/driver/rados/rgw_cr_rados.cc index 7d9f3957dcb..aac0b76e1e6 100644 --- a/src/rgw/driver/rados/rgw_cr_rados.cc +++ b/src/rgw/driver/rados/rgw_cr_rados.cc @@ -675,7 +675,7 @@ int RGWAsyncGetBucketInstanceInfo::_send_request(const DoutPrefixProvider *dpp) int RGWAsyncPutBucketInstanceInfo::_send_request(const DoutPrefixProvider *dpp) { auto r = store->getRados()->put_bucket_instance_info(bucket_info, exclusive, - mtime, attrs, dpp); + mtime, attrs, dpp, null_yield); if (r < 0) { ldpp_dout(dpp, 0) << "ERROR: failed to put bucket instance info for " << bucket_info.bucket << dendl; diff --git a/src/rgw/driver/rados/rgw_data_sync.cc b/src/rgw/driver/rados/rgw_data_sync.cc index 2ecfffa0e38..cae231965a3 100644 --- a/src/rgw/driver/rados/rgw_data_sync.cc +++ b/src/rgw/driver/rados/rgw_data_sync.cc @@ -3011,7 +3011,7 @@ RGWCoroutine *RGWArchiveDataSyncModule::sync_object(const DoutPrefixProvider *dp (sync_pipe.dest_bucket_info.flags & BUCKET_VERSIONS_SUSPENDED)) { ldout(sc->cct, 0) << "SYNC_ARCHIVE: sync_object: enabling object versioning for archive bucket" << dendl; sync_pipe.dest_bucket_info.flags = (sync_pipe.dest_bucket_info.flags & ~BUCKET_VERSIONS_SUSPENDED) | BUCKET_VERSIONED; - int op_ret = sync_env->driver->getRados()->put_bucket_instance_info(sync_pipe.dest_bucket_info, false, real_time(), NULL, sync_env->dpp); + int op_ret = sync_env->driver->getRados()->put_bucket_instance_info(sync_pipe.dest_bucket_info, false, real_time(), NULL, sync_env->dpp, null_yield); if (op_ret < 0) { ldpp_dout(sync_env->dpp, 0) << "SYNC_ARCHIVE: sync_object: error versioning archive bucket" << dendl; return NULL; diff --git a/src/rgw/driver/rados/rgw_rados.cc b/src/rgw/driver/rados/rgw_rados.cc index 6779e519c46..d7c36eeadbc 100644 --- a/src/rgw/driver/rados/rgw_rados.cc +++ b/src/rgw/driver/rados/rgw_rados.cc @@ -2300,7 +2300,7 @@ int RGWRados::create_bucket(const RGWUserInfo& owner, rgw_bucket& bucket, return r; } - ret = put_linked_bucket_info(info, exclusive, ceph::real_time(), pep_objv, &attrs, true, dpp); + ret = put_linked_bucket_info(info, exclusive, ceph::real_time(), pep_objv, &attrs, true, dpp, y); if (ret == -ECANCELED) { ret = -EEXIST; } @@ -4814,7 +4814,7 @@ int RGWRados::set_bucket_owner(rgw_bucket& bucket, ACLOwner& owner, const DoutPr info.owner = owner.get_id(); - r = put_bucket_instance_info(info, false, real_time(), &attrs, dpp); + r = put_bucket_instance_info(info, false, real_time(), &attrs, dpp, null_yield); if (r < 0) { ldpp_dout(dpp, 0) << "NOTICE: put_bucket_info on bucket=" << bucket.name << " returned err=" << r << dendl; return r; @@ -4852,7 +4852,7 @@ int RGWRados::set_buckets_enabled(vector& buckets, bool enabled, con info.flags |= BUCKET_SUSPENDED; } - r = put_bucket_instance_info(info, false, real_time(), &attrs, dpp); + r = put_bucket_instance_info(info, false, real_time(), &attrs, dpp, null_yield); if (r < 0) { ldpp_dout(dpp, 0) << "NOTICE: put_bucket_info on bucket=" << bucket.name << " returned err=" << r << ", skipping bucket" << dendl; ret = r; @@ -7950,9 +7950,9 @@ int RGWRados::try_refresh_bucket_info(RGWBucketInfo& info, int RGWRados::put_bucket_instance_info(RGWBucketInfo& info, bool exclusive, real_time mtime, map *pattrs, - const DoutPrefixProvider *dpp) + const DoutPrefixProvider *dpp, optional_yield y) { - return ctl.bucket->store_bucket_instance_info(info.bucket, info, null_yield, dpp, + return ctl.bucket->store_bucket_instance_info(info.bucket, info, y, dpp, RGWBucketCtl::BucketInstance::PutParams() .set_exclusive(exclusive) .set_mtime(mtime) @@ -7961,11 +7961,11 @@ int RGWRados::put_bucket_instance_info(RGWBucketInfo& info, bool exclusive, int RGWRados::put_linked_bucket_info(RGWBucketInfo& info, bool exclusive, real_time mtime, obj_version *pep_objv, map *pattrs, bool create_entry_point, - const DoutPrefixProvider *dpp) + const DoutPrefixProvider *dpp, optional_yield y) { bool create_head = !info.has_instance_obj || create_entry_point; - int ret = put_bucket_instance_info(info, exclusive, mtime, pattrs, dpp); + int ret = put_bucket_instance_info(info, exclusive, mtime, pattrs, dpp, y); if (ret < 0) { return ret; } @@ -7987,7 +7987,7 @@ int RGWRados::put_linked_bucket_info(RGWBucketInfo& info, bool exclusive, real_t *pep_objv = ot.write_version; } } - ret = ctl.bucket->store_bucket_entrypoint_info(info.bucket, entry_point, null_yield, dpp, RGWBucketCtl::Bucket::PutParams() + ret = ctl.bucket->store_bucket_entrypoint_info(info.bucket, entry_point, y, dpp, RGWBucketCtl::Bucket::PutParams() .set_exclusive(exclusive) .set_objv_tracker(&ot) .set_mtime(mtime)); diff --git a/src/rgw/driver/rados/rgw_rados.h b/src/rgw/driver/rados/rgw_rados.h index eb161d72bce..f73b1088eba 100644 --- a/src/rgw/driver/rados/rgw_rados.h +++ b/src/rgw/driver/rados/rgw_rados.h @@ -1356,7 +1356,7 @@ public: std::map& stats, std::string *max_marker, bool* syncstopped = NULL); int get_bucket_stats_async(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info, const rgw::bucket_index_layout_generation& idx_layout, int shard_id, RGWGetBucketStats_CB *cb); - int put_bucket_instance_info(RGWBucketInfo& info, bool exclusive, ceph::real_time mtime, std::map *pattrs, const DoutPrefixProvider *dpp); + int put_bucket_instance_info(RGWBucketInfo& info, bool exclusive, ceph::real_time mtime, std::map *pattrs, const DoutPrefixProvider *dpp, optional_yield y); /* xxx dang obj_ctx -> svc */ int get_bucket_instance_info(const std::string& meta_key, RGWBucketInfo& info, ceph::real_time *pmtime, std::map *pattrs, optional_yield y, const DoutPrefixProvider *dpp); int get_bucket_instance_info(const rgw_bucket& bucket, RGWBucketInfo& info, ceph::real_time *pmtime, std::map *pattrs, optional_yield y, const DoutPrefixProvider *dpp); @@ -1380,7 +1380,7 @@ public: int put_linked_bucket_info(RGWBucketInfo& info, bool exclusive, ceph::real_time mtime, obj_version *pep_objv, std::map *pattrs, bool create_entry_point, - const DoutPrefixProvider *dpp); + const DoutPrefixProvider *dpp, optional_yield y); int cls_obj_prepare_op(const DoutPrefixProvider *dpp, BucketShard& bs, RGWModifyOp op, std::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, std::string& tag, int64_t pool, uint64_t epoch, diff --git a/src/rgw/driver/rados/rgw_reshard.cc b/src/rgw/driver/rados/rgw_reshard.cc index b2dec7af1c8..4e38221722d 100644 --- a/src/rgw/driver/rados/rgw_reshard.cc +++ b/src/rgw/driver/rados/rgw_reshard.cc @@ -379,7 +379,7 @@ static int init_target_layout(rgw::sal::RadosStore* store, if (ret = fault.check("set_target_layout"); ret == 0) { // no fault injected, write the bucket instance metadata ret = store->getRados()->put_bucket_instance_info(bucket_info, false, - real_time(), &bucket_attrs, dpp); + real_time(), &bucket_attrs, dpp, null_yield); } else if (ret == -ECANCELED) { fault.clear(); // clear the fault so a retry can succeed } @@ -452,7 +452,7 @@ static int revert_target_layout(rgw::sal::RadosStore* store, ret == 0) { // no fault injected, revert the bucket instance metadata ret = store->getRados()->put_bucket_instance_info(bucket_info, false, real_time(), - &bucket_attrs, dpp); + &bucket_attrs, dpp, null_yield); } else if (ret == -ECANCELED) { fault.clear(); // clear the fault so a retry can succeed } @@ -573,7 +573,7 @@ static int commit_target_layout(rgw::sal::RadosStore* store, int ret = fault.check("commit_target_layout"); if (ret == 0) { // no fault injected, write the bucket instance metadata ret = store->getRados()->put_bucket_instance_info( - bucket_info, false, real_time(), &bucket_attrs, dpp); + bucket_info, false, real_time(), &bucket_attrs, dpp, null_yield); } else if (ret == -ECANCELED) { fault.clear(); // clear the fault so a retry can succeed } diff --git a/src/rgw/driver/rados/rgw_sal_rados.cc b/src/rgw/driver/rados/rgw_sal_rados.cc index 548090f23f6..53d5d246400 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.cc +++ b/src/rgw/driver/rados/rgw_sal_rados.cc @@ -511,7 +511,7 @@ int RadosBucket::remove_bucket_bypass_gc(int concurrent_max, bool string bucket_ver, master_ver; - ret = load_bucket(dpp, null_yield); + ret = load_bucket(dpp, y); if (ret < 0) return ret; @@ -537,7 +537,7 @@ int RadosBucket::remove_bucket_bypass_gc(int concurrent_max, bool results.is_truncated = true; while (results.is_truncated) { - ret = list(dpp, params, listing_max_entries, results, null_yield); + ret = list(dpp, params, listing_max_entries, results, y); if (ret < 0) return ret; @@ -589,7 +589,7 @@ int RadosBucket::remove_bucket_bypass_gc(int concurrent_max, bool } } // for all shadow objs - ret = head_obj->delete_obj_aio(dpp, astate, handles.get(), keep_index_consistent, null_yield); + ret = head_obj->delete_obj_aio(dpp, astate, handles.get(), keep_index_consistent, y); if (ret < 0) { ldpp_dout(dpp, -1) << "ERROR: delete obj aio failed with " << ret << dendl; return ret; @@ -768,7 +768,7 @@ int RadosBucket::chown(const DoutPrefixProvider* dpp, User& new_user, optional_y int RadosBucket::put_info(const DoutPrefixProvider* dpp, bool exclusive, ceph::real_time _mtime) { mtime = _mtime; - return store->getRados()->put_bucket_instance_info(info, exclusive, mtime, &attrs, dpp); + return store->getRados()->put_bucket_instance_info(info, exclusive, mtime, &attrs, dpp, null_yield); } /* Make sure to call get_bucket_info() if you need it first */ @@ -1924,7 +1924,7 @@ int RadosObject::transition_to_cloud(Bucket* bucket, std::unique_ptr read_op(get_read_op()); read_op->params.lastmod = &read_mtime; - ret = read_op->prepare(null_yield, dpp); + ret = read_op->prepare(y, dpp); if (ret < 0) { ldpp_dout(dpp, 0) << "ERROR: Updating tier object(" << o.key << ") failed ret=" << ret << dendl; return ret; @@ -1940,7 +1940,7 @@ int RadosObject::transition_to_cloud(Bucket* bucket, target_placement.inherit_from(tier_ctx.bucket_info.placement_rule); target_placement.storage_class = tier->get_storage_class(); - ret = write_cloud_tier(dpp, null_yield, tier_ctx.o.versioned_epoch, + ret = write_cloud_tier(dpp, y, tier_ctx.o.versioned_epoch, tier, tier_ctx.is_multipart_upload, target_placement, tier_ctx.obj); @@ -3438,7 +3438,7 @@ int RadosRole::read_id(const DoutPrefixProvider *dpp, const std::string& role_na std::string oid = info.tenant + get_names_oid_prefix() + role_name; bufferlist bl; - int ret = rgw_get_system_obj(sysobj, store->svc()->zone->get_zone_params().roles_pool, oid, bl, nullptr, nullptr, null_yield, dpp); + int ret = rgw_get_system_obj(sysobj, store->svc()->zone->get_zone_params().roles_pool, oid, bl, nullptr, nullptr, y, dpp); if (ret < 0) { return ret; } @@ -3462,7 +3462,7 @@ int RadosRole::read_name(const DoutPrefixProvider *dpp, optional_yield y) std::string oid = info.tenant + get_names_oid_prefix() + info.name; bufferlist bl; - int ret = rgw_get_system_obj(sysobj, store->svc()->zone->get_zone_params().roles_pool, oid, bl, nullptr, nullptr, null_yield, dpp); + int ret = rgw_get_system_obj(sysobj, store->svc()->zone->get_zone_params().roles_pool, oid, bl, nullptr, nullptr, y, dpp); if (ret < 0) { ldpp_dout(dpp, 0) << "ERROR: failed reading role name from Role pool: " << info.name << ": " << cpp_strerror(-ret) << dendl; diff --git a/src/rgw/services/svc_user_rados.cc b/src/rgw/services/svc_user_rados.cc index 3226e435e51..c99af935415 100644 --- a/src/rgw/services/svc_user_rados.cc +++ b/src/rgw/services/svc_user_rados.cc @@ -898,7 +898,7 @@ int RGWSI_User_RADOS::read_stats(const DoutPrefixProvider *dpp, RGWUserInfo info; real_time mtime; - int ret = read_user_info(ctx, user, &info, nullptr, &mtime, nullptr, nullptr, null_yield, dpp); + int ret = read_user_info(ctx, user, &info, nullptr, &mtime, nullptr, nullptr, y, dpp); if (ret < 0) { return ret; -- 2.39.5