From: Casey Bodley Date: Tue, 7 Nov 2023 01:26:28 +0000 (-0500) Subject: rgw/sal: Bucket owner as rgw_user X-Git-Tag: v19.0.0~115^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=eb4cac740e75474b944bb3bed842776df1e516d4;p=ceph.git rgw/sal: Bucket owner as rgw_user stop maintaining a User pointer for the bucket owner, and use the stored rgw_user owner directly Signed-off-by: Casey Bodley --- diff --git a/src/rgw/driver/d4n/rgw_sal_d4n.cc b/src/rgw/driver/d4n/rgw_sal_d4n.cc index efeb281c3cea6..a25d5bbdfd95f 100644 --- a/src/rgw/driver/d4n/rgw_sal_d4n.cc +++ b/src/rgw/driver/d4n/rgw_sal_d4n.cc @@ -326,7 +326,6 @@ int D4NFilterObject::D4NFilterReadOp::prepare(optional_yield y, const DoutPrefix ldpp_dout(dpp, 20) << "D4N Filter: Cache get object operation failed." << dendl; } else { /* Set metadata locally */ - RGWQuotaInfo quota_info; RGWObjState* astate; source->get_obj_state(dpp, &astate, y); @@ -343,16 +342,9 @@ int D4NFilterObject::D4NFilterReadOp::prepare(optional_yield y, const DoutPrefix source->set_instance(it->second); } else if (!std::strcmp(it->first.data(), "source_zone_short_id")) { astate->zone_short_id = static_cast(std::stoul(it->second)); - } else if (!std::strcmp(it->first.data(), "user_quota.max_size")) { - quota_info.max_size = std::stoull(it->second); - } else if (!std::strcmp(it->first.data(), "user_quota.max_objects")) { - quota_info.max_objects = std::stoull(it->second); - } else if (!std::strcmp(it->first.data(), "max_buckets")) { - source->get_bucket()->get_owner()->set_max_buckets(std::stoull(it->second)); } } - source->get_bucket()->get_owner()->set_info(quota_info); source->set_obj_state(*astate); /* Set attributes locally */ @@ -491,19 +483,6 @@ int D4NFilterWriter::complete(size_t accounted_size, const std::string& etag, bl.clear(); } - RGWUserInfo info = obj->get_bucket()->get_owner()->get_info(); - bl.append(std::to_string(info.quota.user_quota.max_size)); - baseAttrs.insert({"user_quota.max_size", bl}); - bl.clear(); - - bl.append(std::to_string(info.quota.user_quota.max_objects)); - baseAttrs.insert({"user_quota.max_objects", bl}); - bl.clear(); - - bl.append(std::to_string(obj->get_bucket()->get_owner()->get_max_buckets())); - baseAttrs.insert({"max_buckets", bl}); - bl.clear(); - baseAttrs.insert(attrs.begin(), attrs.end()); int setObjReturn = filter->get_d4n_cache()->setObject(obj->get_key().get_oid(), &baseAttrs); diff --git a/src/rgw/driver/d4n/rgw_sal_d4n.h b/src/rgw/driver/d4n/rgw_sal_d4n.h index a54371f6cc648..cebae1eaf6ba5 100644 --- a/src/rgw/driver/d4n/rgw_sal_d4n.h +++ b/src/rgw/driver/d4n/rgw_sal_d4n.h @@ -78,8 +78,8 @@ class D4NFilterBucket : public FilterBucket { D4NFilterDriver* filter; public: - D4NFilterBucket(std::unique_ptr _next, User* _user, D4NFilterDriver* _filter) : - FilterBucket(std::move(_next), _user), + D4NFilterBucket(std::unique_ptr _next, D4NFilterDriver* _filter) : + FilterBucket(std::move(_next)), filter(_filter) {} virtual ~D4NFilterBucket() = default; diff --git a/src/rgw/driver/posix/rgw_sal_posix.cc b/src/rgw/driver/posix/rgw_sal_posix.cc index b72c7868600b7..fc48c4f8fa8c5 100644 --- a/src/rgw/driver/posix/rgw_sal_posix.cc +++ b/src/rgw/driver/posix/rgw_sal_posix.cc @@ -348,16 +348,16 @@ std::unique_ptr POSIXDriver::get_object(const rgw_obj_key& k) return std::make_unique(this, k); } -int POSIXDriver::load_bucket(const DoutPrefixProvider* dpp, User* u, const rgw_bucket& b, std::unique_ptr* bucket, optional_yield y) +int POSIXDriver::load_bucket(const DoutPrefixProvider* dpp, const rgw_bucket& b, std::unique_ptr* bucket, optional_yield y) { - *bucket = std::make_unique(this, root_fd, b, u); + *bucket = std::make_unique(this, root_fd, b); return (*bucket)->load_bucket(dpp, y); } -std::unique_ptr POSIXDriver::get_bucket(User* u, const RGWBucketInfo& i) +std::unique_ptr POSIXDriver::get_bucket(const RGWBucketInfo& i) { /* Don't need to fetch the bucket info, use the provided one */ - return std::make_unique(this, root_fd, i, u); + return std::make_unique(this, root_fd, i); } std::string POSIXDriver::zone_unique_trans_id(const uint64_t unique_num) @@ -525,8 +525,7 @@ int POSIXBucket::create(const DoutPrefixProvider* dpp, const CreateParams& params, optional_yield y) { - ceph_assert(owner); - info.owner = owner->get_id(); + info.owner = params.owner; info.bucket.marker = params.marker; info.bucket.bucket_id = params.bucket_id; @@ -632,7 +631,7 @@ int POSIXDriver::mint_listing_entry(const std::string &bname, POSIXObject *pobj; int ret; - ret = load_bucket(nullptr, nullptr, rgw_bucket(std::string(), bname), + ret = load_bucket(nullptr, rgw_bucket(std::string(), bname), &b, null_yield); if (ret < 0) return ret; @@ -883,10 +882,6 @@ int POSIXBucket::load_bucket(const DoutPrefixProvider* dpp, optional_yield y) mtime = ceph::real_clock::from_time_t(stx.stx_mtime.tv_sec); info.creation_time = ceph::real_clock::from_time_t(stx.stx_btime.tv_sec); - if (owner) { - info.owner = owner->get_id(); - } - ret = open(dpp); if (ret < 0) { return ret; @@ -981,7 +976,7 @@ int POSIXBucket::check_bucket_shards(const DoutPrefixProvider* dpp, return 0; } -int POSIXBucket::chown(const DoutPrefixProvider* dpp, User& new_user, optional_yield y) +int POSIXBucket::chown(const DoutPrefixProvider* dpp, const rgw_user& new_owner, optional_yield y) { /* TODO map user to UID/GID, and change it */ return 0; @@ -1204,7 +1199,7 @@ int POSIXBucket::get_shadow_bucket(const DoutPrefixProvider* dpp, optional_yield open(dpp); - bp = new POSIXBucket(driver, dir_fd, b, owner, ons); + bp = new POSIXBucket(driver, dir_fd, b, ons); ret = bp->load_bucket(dpp, y); if (ret == -ENOENT && create) { /* Create it if it doesn't exist */ diff --git a/src/rgw/driver/posix/rgw_sal_posix.h b/src/rgw/driver/posix/rgw_sal_posix.h index 16f88729ab4a9..1599808beff33 100644 --- a/src/rgw/driver/posix/rgw_sal_posix.h +++ b/src/rgw/driver/posix/rgw_sal_posix.h @@ -52,10 +52,9 @@ public: std::string& user_str, optional_yield y, std::unique_ptr* user) override; virtual std::unique_ptr get_object(const rgw_obj_key& k) override; - virtual std::unique_ptr get_bucket(User* u, const RGWBucketInfo& i) override; - virtual int load_bucket(const DoutPrefixProvider* dpp, User* u, const - rgw_bucket& b, std::unique_ptr* bucket, - optional_yield y) override; + virtual std::unique_ptr get_bucket(const RGWBucketInfo& i) override; + virtual int load_bucket(const DoutPrefixProvider* dpp, const rgw_bucket& b, + std::unique_ptr* bucket, optional_yield y) override; virtual std::string zone_unique_trans_id(const uint64_t unique_num) override; virtual std::unique_ptr get_append_writer(const DoutPrefixProvider *dpp, @@ -143,16 +142,16 @@ private: std::optional ns; public: - POSIXBucket(POSIXDriver *_dr, int _p_fd, const rgw_bucket& _b, User* _u, std::optional _ns = std::nullopt) - : StoreBucket(_b, _u), + POSIXBucket(POSIXDriver *_dr, int _p_fd, const rgw_bucket& _b, std::optional _ns = std::nullopt) + : StoreBucket(_b), driver(_dr), parent_fd(_p_fd), acls(), ns(_ns) { } - POSIXBucket(POSIXDriver *_dr, int _p_fd, const RGWBucketInfo& _i, User* _u) - : StoreBucket(_i, _u), + POSIXBucket(POSIXDriver *_dr, int _p_fd, const RGWBucketInfo& _i) + : StoreBucket(_i), driver(_dr), parent_fd(_p_fd), acls() @@ -201,7 +200,7 @@ public: RGWBucketEnt* ent) override; virtual int check_bucket_shards(const DoutPrefixProvider* dpp, uint64_t num_objs, optional_yield y) override; - virtual int chown(const DoutPrefixProvider* dpp, User& new_user, optional_yield y) override; + virtual int chown(const DoutPrefixProvider* dpp, const rgw_user& new_owner, optional_yield y) override; virtual int put_info(const DoutPrefixProvider* dpp, bool exclusive, ceph::real_time mtime, optional_yield y) override; virtual int check_empty(const DoutPrefixProvider* dpp, optional_yield y) override; diff --git a/src/rgw/driver/rados/rgw_bucket.cc b/src/rgw/driver/rados/rgw_bucket.cc index 0e1eb274d4039..066654adfa8cc 100644 --- a/src/rgw/driver/rados/rgw_bucket.cc +++ b/src/rgw/driver/rados/rgw_bucket.cc @@ -109,8 +109,7 @@ void check_bad_user_bucket_mapping(rgw::sal::Driver* driver, rgw::sal::User& use for (const auto& ent : listing.buckets) { std::unique_ptr bucket; - int r = driver->load_bucket(dpp, &user, - rgw_bucket(user.get_tenant(), ent.bucket.name), + int r = driver->load_bucket(dpp, rgw_bucket(user.get_tenant(), ent.bucket.name), &bucket, y); if (r < 0) { ldpp_dout(dpp, 0) << "could not get bucket info for bucket=" << bucket << dendl; @@ -122,7 +121,7 @@ void check_bad_user_bucket_mapping(rgw::sal::Driver* driver, rgw::sal::User& use << " got " << bucket << std::endl; if (fix) { cout << "fixing" << std::endl; - r = bucket->chown(dpp, user, y); + r = bucket->chown(dpp, user.get_id(), y); if (r < 0) { cerr << "failed to fix bucket: " << cpp_strerror(-r) << std::endl; } @@ -183,7 +182,7 @@ int RGWBucket::init(rgw::sal::Driver* _driver, RGWBucketAdminOpState& op_state, bucket_name = bucket_name.substr(pos + 1); } - int r = driver->load_bucket(dpp, user.get(), rgw_bucket(tenant, bucket_name), + int r = driver->load_bucket(dpp, rgw_bucket(tenant, bucket_name), &bucket, y); if (r < 0) { set_err_msg(err_msg, "failed to fetch bucket info for bucket=" + bucket_name); @@ -246,11 +245,6 @@ bool rgw_find_bucket_by_id(const DoutPrefixProvider *dpp, CephContext *cct, rgw: int RGWBucket::chown(RGWBucketAdminOpState& op_state, const string& marker, optional_yield y, const DoutPrefixProvider *dpp, std::string *err_msg) { - /* User passed in by rgw_admin is the new user; get the current user and set it in - * the bucket */ - std::unique_ptr old_user = driver->get_user(bucket->get_info().owner); - bucket->set_owner(old_user.get()); - return rgw_chown_bucket_and_objects(driver, bucket.get(), user.get(), marker, err_msg, dpp, y); } @@ -1243,11 +1237,9 @@ int RGWBucketAdminOp::remove_bucket(rgw::sal::Driver* driver, RGWBucketAdminOpSt bool bypass_gc, bool keep_index_consistent) { std::unique_ptr bucket; - std::unique_ptr user = driver->get_user(op_state.get_user_id()); - int ret = driver->load_bucket(dpp, user.get(), - rgw_bucket(user->get_tenant(), - op_state.get_bucket_name()), + int ret = driver->load_bucket(dpp, rgw_bucket(op_state.get_tenant(), + op_state.get_bucket_name()), &bucket, y); if (ret < 0) return ret; @@ -1289,8 +1281,7 @@ static int bucket_stats(rgw::sal::Driver* driver, std::unique_ptr bucket; map stats; - int ret = driver->load_bucket(dpp, nullptr, - rgw_bucket(tenant_name, bucket_name), + int ret = driver->load_bucket(dpp, rgw_bucket(tenant_name, bucket_name), &bucket, y); if (ret < 0) { return ret; @@ -1416,7 +1407,7 @@ int RGWBucketAdminOp::limit_check(rgw::sal::Driver* driver, uint64_t num_objects = 0; std::unique_ptr bucket; - ret = driver->load_bucket(dpp, user.get(), ent.bucket, &bucket, y); + ret = driver->load_bucket(dpp, ent.bucket, &bucket, y); if (ret < 0) continue; @@ -1600,7 +1591,7 @@ void get_stale_instances(rgw::sal::Driver* driver, const std::string& bucket_nam std::unique_ptr bucket; rgw_bucket rbucket; rgw_bucket_parse_bucket_key(driver->ctx(), bucket_instance, &rbucket, nullptr); - int r = driver->load_bucket(dpp, nullptr, rbucket, &bucket, y); + int r = driver->load_bucket(dpp, rbucket, &bucket, y); if (r < 0){ // this can only happen if someone deletes us right when we're processing ldpp_dout(dpp, -1) << "Bucket instance is invalid: " << bucket_instance @@ -1620,7 +1611,7 @@ void get_stale_instances(rgw::sal::Driver* driver, const std::string& bucket_nam auto [tenant, bname] = split_tenant(bucket_name); RGWBucketInfo cur_bucket_info; std::unique_ptr cur_bucket; - int r = driver->load_bucket(dpp, nullptr, rgw_bucket(tenant, bname), + int r = driver->load_bucket(dpp, rgw_bucket(tenant, bname), &cur_bucket, y); if (r < 0) { if (r == -ENOENT) { @@ -1755,7 +1746,7 @@ int RGWBucketAdminOp::clear_stale_instances(rgw::sal::Driver* driver, Formatter *formatter, rgw::sal::Driver* driver){ for (const auto &binfo: lst) { - auto bucket = driver->get_bucket(nullptr, binfo); + auto bucket = driver->get_bucket(binfo); int ret = bucket->purge_instance(dpp, y); if (ret == 0){ auto md_key = "bucket.instance:" + binfo.bucket.get_key(); @@ -1777,8 +1768,7 @@ static int fix_single_bucket_lc(rgw::sal::Driver* driver, const DoutPrefixProvider *dpp, optional_yield y) { std::unique_ptr bucket; - int ret = driver->load_bucket(dpp, nullptr, - rgw_bucket(tenant_name, bucket_name), + int ret = driver->load_bucket(dpp, rgw_bucket(tenant_name, bucket_name), &bucket, y); if (ret < 0) { // TODO: Should we handle the case where the bucket could've been removed between @@ -1949,7 +1939,7 @@ int RGWBucketAdminOp::fix_obj_expiry(rgw::sal::Driver* driver, ldpp_dout(dpp, -1) << "failed to initialize bucket" << dendl; return ret; } - auto bucket = driver->get_bucket(nullptr, admin_bucket.get_bucket_info()); + auto bucket = driver->get_bucket(admin_bucket.get_bucket_info()); return fix_bucket_obj_expiry(dpp, driver, bucket.get(), flusher, dry_run, y); } @@ -2630,7 +2620,7 @@ int RGWMetadataHandlerPut_BucketInstance::put_post(const DoutPrefixProvider *dpp /* update lifecyle policy */ { - auto bucket = bihandler->driver->get_bucket(nullptr, bci.info); + auto bucket = bihandler->driver->get_bucket(bci.info); auto lc = bihandler->driver->get_rgwlc(); diff --git a/src/rgw/driver/rados/rgw_cr_rados.h b/src/rgw/driver/rados/rgw_cr_rados.h index ff7a0efb481aa..676fd3d3cae2c 100644 --- a/src/rgw/driver/rados/rgw_cr_rados.h +++ b/src/rgw/driver/rados/rgw_cr_rados.h @@ -1350,7 +1350,7 @@ public: if (_zones_trace) { zones_trace = *_zones_trace; } - bucket = store->get_bucket(nullptr, _bucket_info); + bucket = store->get_bucket(_bucket_info); obj = bucket->get_object(_key); } }; diff --git a/src/rgw/driver/rados/rgw_cr_tools.cc b/src/rgw/driver/rados/rgw_cr_tools.cc index 928cc9c0c988e..a46ba1ac6e123 100644 --- a/src/rgw/driver/rados/rgw_cr_tools.cc +++ b/src/rgw/driver/rados/rgw_cr_tools.cc @@ -100,8 +100,7 @@ int RGWGetUserInfoCR::Request::_send_request(const DoutPrefixProvider *dpp) template<> int RGWGetBucketInfoCR::Request::_send_request(const DoutPrefixProvider *dpp) { - return store->load_bucket(dpp, nullptr, - rgw_bucket(params.tenant, params.bucket_name), + return store->load_bucket(dpp, rgw_bucket(params.tenant, params.bucket_name), &result->bucket, null_yield); } diff --git a/src/rgw/driver/rados/rgw_notify.cc b/src/rgw/driver/rados/rgw_notify.cc index 7abb0d84a7d19..3935957bc5c3e 100644 --- a/src/rgw/driver/rados/rgw_notify.cc +++ b/src/rgw/driver/rados/rgw_notify.cc @@ -873,8 +873,7 @@ static inline void populate_event(reservation_t& res, event.x_amz_id_2 = res.store->getRados()->host_id; // RGW on which the change was made // configurationId is filled from notification configuration event.bucket_name = res.bucket->get_name(); - event.bucket_ownerIdentity = res.bucket->get_owner() ? - res.bucket->get_owner()->get_id().id : res.bucket->get_info().owner.id; + event.bucket_ownerIdentity = res.bucket->get_owner().id; const auto region = res.store->get_zone()->get_zonegroup().get_api_name(); rgw::ARN bucket_arn(res.bucket->get_key()); bucket_arn.region = region; diff --git a/src/rgw/driver/rados/rgw_object_expirer_core.cc b/src/rgw/driver/rados/rgw_object_expirer_core.cc index ba6580b89b073..72c21c1d262a6 100644 --- a/src/rgw/driver/rados/rgw_object_expirer_core.cc +++ b/src/rgw/driver/rados/rgw_object_expirer_core.cc @@ -201,7 +201,7 @@ int RGWObjectExpirer::garbage_single_object(const DoutPrefixProvider *dpp, objex RGWBucketInfo bucket_info; std::unique_ptr bucket; - int ret = driver->load_bucket(dpp, nullptr, rgw_bucket(hint.tenant, hint.bucket_name, hint.bucket_id), &bucket, null_yield); + int ret = driver->load_bucket(dpp, rgw_bucket(hint.tenant, hint.bucket_name, hint.bucket_id), &bucket, null_yield); if (-ENOENT == ret) { ldpp_dout(dpp, 15) << "NOTICE: cannot find bucket = " \ << hint.bucket_name << ". The object must be already removed" << dendl; diff --git a/src/rgw/driver/rados/rgw_rest_bucket.cc b/src/rgw/driver/rados/rgw_rest_bucket.cc index 4fac8ef64f7c5..dc71e40335ffa 100644 --- a/src/rgw/driver/rados/rgw_rest_bucket.cc +++ b/src/rgw/driver/rados/rgw_rest_bucket.cc @@ -233,7 +233,7 @@ void RGWOp_Bucket_Remove::execute(optional_yield y) return; } - op_ret = driver->load_bucket(s, nullptr, rgw_bucket("", bucket_name), + op_ret = driver->load_bucket(s, rgw_bucket("", bucket_name), &bucket, y); if (op_ret < 0) { ldpp_dout(this, 0) << "get_bucket returned ret=" << op_ret << dendl; @@ -301,7 +301,7 @@ void RGWOp_Set_Bucket_Quota::execute(optional_yield y) } if (use_http_params) { std::unique_ptr bucket; - op_ret = driver->load_bucket(s, nullptr, rgw_bucket(uid.tenant, bucket_name), + op_ret = driver->load_bucket(s, rgw_bucket(uid.tenant, bucket_name), &bucket, s->yield); if (op_ret < 0) { return; diff --git a/src/rgw/driver/rados/rgw_rest_log.cc b/src/rgw/driver/rados/rgw_rest_log.cc index d331097f10b94..9c0467ec36a49 100644 --- a/src/rgw/driver/rados/rgw_rest_log.cc +++ b/src/rgw/driver/rados/rgw_rest_log.cc @@ -414,7 +414,7 @@ void RGWOp_BILog_List::execute(optional_yield y) { b.name = bn; b.bucket_id = bucket_instance; } - op_ret = driver->load_bucket(s, nullptr, b, &bucket, y); + op_ret = driver->load_bucket(s, b, &bucket, y); if (op_ret < 0) { ldpp_dout(this, 5) << "could not get bucket info for bucket=" << bucket_name << dendl; return; @@ -541,7 +541,7 @@ void RGWOp_BILog_Info::execute(optional_yield y) { b.name = bn; b.bucket_id = bucket_instance; } - op_ret = driver->load_bucket(s, nullptr, b, &bucket, y); + op_ret = driver->load_bucket(s, b, &bucket, y); if (op_ret < 0) { ldpp_dout(this, 5) << "could not get bucket info for bucket=" << bucket_name << dendl; return; @@ -635,7 +635,7 @@ void RGWOp_BILog_Delete::execute(optional_yield y) { b.name = bn; b.bucket_id = bucket_instance; } - op_ret = driver->load_bucket(s, nullptr, b, &bucket, y); + op_ret = driver->load_bucket(s, b, &bucket, y); if (op_ret < 0) { ldpp_dout(this, 5) << "could not get bucket info for bucket=" << bucket_name << dendl; return; @@ -985,7 +985,7 @@ void RGWOp_BILog_Status::execute(optional_yield y) // read the bucket instance info for num_shards std::unique_ptr bucket; - op_ret = driver->load_bucket(s, nullptr, b, &bucket, y); + op_ret = driver->load_bucket(s, b, &bucket, y); if (op_ret < 0) { ldpp_dout(this, 4) << "failed to read bucket info: " << cpp_strerror(op_ret) << dendl; return; @@ -1069,7 +1069,7 @@ void RGWOp_BILog_Status::execute(optional_yield y) if (*pipe.dest.bucket != pinfo->bucket) { opt_dest_info.emplace(); std::unique_ptr dest_bucket; - op_ret = driver->load_bucket(s, nullptr, *pipe.dest.bucket, &dest_bucket, y); + op_ret = driver->load_bucket(s, *pipe.dest.bucket, &dest_bucket, y); if (op_ret < 0) { ldpp_dout(this, 4) << "failed to read target bucket info (bucket=: " << cpp_strerror(op_ret) << dendl; return; diff --git a/src/rgw/driver/rados/rgw_sal_rados.cc b/src/rgw/driver/rados/rgw_sal_rados.cc index 08722cc24b519..ed6e2525ac2b8 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.cc +++ b/src/rgw/driver/rados/rgw_sal_rados.cc @@ -124,15 +124,12 @@ int RadosBucket::create(const DoutPrefixProvider* dpp, const CreateParams& params, optional_yield y) { - ceph_assert(owner); - const rgw_user& owner_id = owner->get_id(); - rgw_bucket key = get_key(); key.marker = params.marker; key.bucket_id = params.bucket_id; int ret = store->getRados()->create_bucket( - dpp, y, key, owner_id, params.zonegroup_id, + dpp, y, key, params.owner, params.zonegroup_id, params.placement_rule, params.zone_placement, params.attrs, params.obj_lock_enabled, params.swift_ver_location, params.quota, params.creation_time, &bucket_version, info); @@ -146,7 +143,7 @@ int RadosBucket::create(const DoutPrefixProvider* dpp, * If all is ok then update the user's list of buckets. Otherwise inform * client about a name conflict. */ - if (info.owner != owner_id) { + if (info.owner != params.owner) { return -ERR_BUCKET_EXISTS; } ret = 0; @@ -154,10 +151,10 @@ int RadosBucket::create(const DoutPrefixProvider* dpp, return ret; } - ret = link(dpp, owner, y, false); + ret = link(dpp, params.owner, y, false); if (ret && !existed && ret != -EEXIST) { /* if it exists (or previously existed), don't remove it! */ - ret = unlink(dpp, owner, y); + ret = unlink(dpp, params.owner, y); if (ret < 0) { ldpp_dout(dpp, 0) << "WARNING: failed to unlink bucket: ret=" << ret << dendl; @@ -542,7 +539,7 @@ int RadosBucket::read_stats_async(const DoutPrefixProvider *dpp, int RadosBucket::sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y, RGWBucketEnt* ent) { - return store->ctl()->bucket->sync_user_stats(dpp, owner->get_id(), info, y, ent); + return store->ctl()->bucket->sync_user_stats(dpp, info.owner, info, y, ent); } int RadosBucket::check_bucket_shards(const DoutPrefixProvider* dpp, @@ -551,17 +548,17 @@ int RadosBucket::check_bucket_shards(const DoutPrefixProvider* dpp, return store->getRados()->check_bucket_shards(info, num_objs, dpp, y); } -int RadosBucket::link(const DoutPrefixProvider* dpp, User* new_user, optional_yield y, bool update_entrypoint, RGWObjVersionTracker* objv) +int RadosBucket::link(const DoutPrefixProvider* dpp, const rgw_user& new_user, optional_yield y, bool update_entrypoint, RGWObjVersionTracker* objv) { RGWBucketEntryPoint ep; ep.bucket = info.bucket; - ep.owner = new_user->get_id(); + ep.owner = new_user; ep.creation_time = get_creation_time(); ep.linked = true; Attrs ep_attrs; rgw_ep_info ep_data{ep, ep_attrs}; - int r = store->ctl()->bucket->link_bucket(new_user->get_id(), info.bucket, + int r = store->ctl()->bucket->link_bucket(new_user, info.bucket, get_creation_time(), y, dpp, update_entrypoint, &ep_data); if (r < 0) @@ -573,27 +570,20 @@ int RadosBucket::link(const DoutPrefixProvider* dpp, User* new_user, optional_yi return r; } -int RadosBucket::unlink(const DoutPrefixProvider* dpp, User* new_user, optional_yield y, bool update_entrypoint) +int RadosBucket::unlink(const DoutPrefixProvider* dpp, const rgw_user& owner, optional_yield y, bool update_entrypoint) { - return store->ctl()->bucket->unlink_bucket(new_user->get_id(), info.bucket, y, dpp, update_entrypoint); + return store->ctl()->bucket->unlink_bucket(owner, info.bucket, y, dpp, update_entrypoint); } -int RadosBucket::chown(const DoutPrefixProvider* dpp, User& new_user, optional_yield y) +int RadosBucket::chown(const DoutPrefixProvider* dpp, const rgw_user& new_owner, optional_yield y) { std::string obj_marker; - int r; - - if (!owner) { - ldpp_dout(dpp, 0) << __func__ << " Cannot chown without an owner " << dendl; - return -EINVAL; - } - - r = this->unlink(dpp, owner, y); + int r = this->unlink(dpp, info.owner, y); if (r < 0) { return r; } - return this->link(dpp, &new_user, y); + return this->link(dpp, new_owner, y); } int RadosBucket::put_info(const DoutPrefixProvider* dpp, bool exclusive, ceph::real_time _mtime, optional_yield y) @@ -633,14 +623,14 @@ int RadosBucket::read_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch, RGWUsageIter& usage_iter, map& usage) { - return store->getRados()->read_usage(dpp, owner->get_id(), get_name(), start_epoch, + return store->getRados()->read_usage(dpp, info.owner, get_name(), start_epoch, end_epoch, max_entries, is_truncated, usage_iter, usage); } int RadosBucket::trim_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch, uint64_t end_epoch, optional_yield y) { - return store->getRados()->trim_usage(dpp, owner->get_id(), get_name(), start_epoch, end_epoch, y); + return store->getRados()->trim_usage(dpp, info.owner, get_name(), start_epoch, end_epoch, y); } int RadosBucket::remove_objs_from_index(const DoutPrefixProvider *dpp, std::list& objs_to_unlink) @@ -987,16 +977,16 @@ std::unique_ptr RadosStore::get_object(const rgw_obj_key& k) return std::make_unique(this, k); } -std::unique_ptr RadosStore::get_bucket(User* u, const RGWBucketInfo& i) +std::unique_ptr RadosStore::get_bucket(const RGWBucketInfo& i) { /* Don't need to fetch the bucket info, use the provided one */ - return std::make_unique(this, i, u); + return std::make_unique(this, i); } -int RadosStore::load_bucket(const DoutPrefixProvider* dpp, User* u, const rgw_bucket& b, +int RadosStore::load_bucket(const DoutPrefixProvider* dpp, const rgw_bucket& b, std::unique_ptr* bucket, optional_yield y) { - *bucket = std::make_unique(this, b, u); + *bucket = std::make_unique(this, b); return (*bucket)->load_bucket(dpp, y); } @@ -2102,7 +2092,7 @@ int RadosObject::swift_versioning_restore(bool& restored, { rgw_obj obj = get_obj(); return store->getRados()->swift_versioning_restore(*rados_ctx, - bucket->get_owner()->get_id(), + bucket->get_owner(), bucket->get_info(), obj, restored, diff --git a/src/rgw/driver/rados/rgw_sal_rados.h b/src/rgw/driver/rados/rgw_sal_rados.h index c67d23289ed28..7efd7757c3c4b 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.h +++ b/src/rgw/driver/rados/rgw_sal_rados.h @@ -135,8 +135,8 @@ class RadosStore : public StoreDriver { virtual int get_user_by_email(const DoutPrefixProvider* dpp, const std::string& email, optional_yield y, std::unique_ptr* user) override; virtual int get_user_by_swift(const DoutPrefixProvider* dpp, const std::string& user_str, optional_yield y, std::unique_ptr* user) override; virtual std::unique_ptr get_object(const rgw_obj_key& k) override; - std::unique_ptr get_bucket(User* u, const RGWBucketInfo& i) override; - int load_bucket(const DoutPrefixProvider* dpp, User* u, const rgw_bucket& b, + std::unique_ptr get_bucket(const RGWBucketInfo& i) override; + int load_bucket(const DoutPrefixProvider* dpp, const rgw_bucket& b, std::unique_ptr* bucket, optional_yield y) override; virtual bool is_meta_master() override; virtual Zone* get_zone() { return zone.get(); } @@ -479,12 +479,6 @@ class RadosBucket : public StoreBucket { acls() { } - RadosBucket(RadosStore *_st, User* _u) - : StoreBucket(_u), - store(_st), - acls() { - } - RadosBucket(RadosStore *_st, const rgw_bucket& _b) : StoreBucket(_b), store(_st), @@ -497,18 +491,6 @@ class RadosBucket : public StoreBucket { acls() { } - RadosBucket(RadosStore *_st, const rgw_bucket& _b, User* _u) - : StoreBucket(_b, _u), - store(_st), - acls() { - } - - RadosBucket(RadosStore *_st, const RGWBucketInfo& _i, User* _u) - : StoreBucket(_i, _u), - store(_st), - acls() { - } - virtual ~RadosBucket(); virtual std::unique_ptr get_object(const rgw_obj_key& k) override; virtual int list(const DoutPrefixProvider* dpp, ListParams&, int, ListResults&, optional_yield y) override; @@ -535,7 +517,7 @@ class RadosBucket : public StoreBucket { RGWBucketEnt* ent) override; int check_bucket_shards(const DoutPrefixProvider* dpp, uint64_t num_objs, optional_yield y) override; - virtual int chown(const DoutPrefixProvider* dpp, User& new_user, optional_yield y) override; + virtual int chown(const DoutPrefixProvider* dpp, const rgw_user& new_owner, optional_yield y) override; virtual int put_info(const DoutPrefixProvider* dpp, bool exclusive, ceph::real_time mtime, optional_yield y) override; virtual int check_empty(const DoutPrefixProvider* dpp, optional_yield y) override; virtual int check_quota(const DoutPrefixProvider *dpp, RGWQuota& quota, uint64_t obj_size, optional_yield y, bool check_size_only = false) override; @@ -575,8 +557,8 @@ class RadosBucket : public StoreBucket { optional_yield y, const DoutPrefixProvider *dpp) override; private: - int link(const DoutPrefixProvider* dpp, User* new_user, optional_yield y, bool update_entrypoint = true, RGWObjVersionTracker* objv = nullptr); - int unlink(const DoutPrefixProvider* dpp, User* new_user, optional_yield y, bool update_entrypoint = true); + int link(const DoutPrefixProvider* dpp, const rgw_user& new_owner, optional_yield y, bool update_entrypoint = true, RGWObjVersionTracker* objv = nullptr); + int unlink(const DoutPrefixProvider* dpp, const rgw_user& owner, optional_yield y, bool update_entrypoint = true); friend class RadosUser; }; diff --git a/src/rgw/driver/rados/rgw_tools.cc b/src/rgw/driver/rados/rgw_tools.cc index 72a7da1c31de1..635e5ce887d09 100644 --- a/src/rgw/driver/rados/rgw_tools.cc +++ b/src/rgw/driver/rados/rgw_tools.cc @@ -285,7 +285,7 @@ int RGWDataAccess::Bucket::finish_init() int RGWDataAccess::Bucket::init(const DoutPrefixProvider *dpp, optional_yield y) { std::unique_ptr bucket; - int ret = sd->driver->load_bucket(dpp, nullptr, rgw_bucket(tenant, name), &bucket, y); + int ret = sd->driver->load_bucket(dpp, rgw_bucket(tenant, name), &bucket, y); if (ret < 0) { return ret; } @@ -327,7 +327,7 @@ int RGWDataAccess::Object::put(bufferlist& data, rgw::BlockingAioThrottle aio(driver->ctx()->_conf->rgw_put_obj_min_window_size); - std::unique_ptr b = driver->get_bucket(nullptr, bucket_info); + std::unique_ptr b = driver->get_bucket(bucket_info); std::unique_ptr obj = b->get_object(key); auto& owner = bucket->policy.get_owner(); diff --git a/src/rgw/driver/rados/rgw_user.cc b/src/rgw/driver/rados/rgw_user.cc index c27be158c3347..506ac0acf1122 100644 --- a/src/rgw/driver/rados/rgw_user.cc +++ b/src/rgw/driver/rados/rgw_user.cc @@ -1579,7 +1579,7 @@ int RGWUser::execute_rename(const DoutPrefixProvider *dpp, RGWUserAdminOpState& for (const auto& ent : listing.buckets) { std::unique_ptr bucket; - ret = driver->load_bucket(dpp, old_user.get(), ent.bucket, &bucket, y); + ret = driver->load_bucket(dpp, ent.bucket, &bucket, y); if (ret < 0) { set_err_msg(err_msg, "failed to fetch bucket info for bucket=" + bucket->get_name()); return ret; @@ -1785,7 +1785,7 @@ int RGWUser::execute_remove(const DoutPrefixProvider *dpp, RGWUserAdminOpState& for (const auto& ent : listing.buckets) { std::unique_ptr bucket; - ret = driver->load_bucket(dpp, user, ent.bucket, &bucket, y); + ret = driver->load_bucket(dpp, ent.bucket, &bucket, y); if (ret < 0) { set_err_msg(err_msg, "unable to load bucket " + ent.bucket.name); return ret; diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 46aef1ee2d24f..d44e66c700cd6 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -1189,20 +1189,19 @@ public: } }; -static int init_bucket(rgw::sal::User* user, const rgw_bucket& b, +static int init_bucket(const rgw_bucket& b, std::unique_ptr* bucket) { - return driver->load_bucket(dpp(), user, b, bucket, null_yield); + return driver->load_bucket(dpp(), b, bucket, null_yield); } -static int init_bucket(rgw::sal::User* user, - const string& tenant_name, +static int init_bucket(const string& tenant_name, const string& bucket_name, const string& bucket_id, std::unique_ptr* bucket) { rgw_bucket b{tenant_name, bucket_name, bucket_id}; - return init_bucket(user, b, bucket); + return init_bucket(b, bucket); } static int read_input(const string& infile, bufferlist& bl) @@ -1407,8 +1406,7 @@ int set_bucket_quota(rgw::sal::Driver* driver, OPT opt_cmd, bool have_max_size, bool have_max_objects) { std::unique_ptr bucket; - int r = driver->load_bucket(dpp(), nullptr, - rgw_bucket(tenant_name, bucket_name), + int r = driver->load_bucket(dpp(), rgw_bucket(tenant_name, bucket_name), &bucket, null_yield); if (r < 0) { cerr << "could not get bucket info for bucket=" << bucket_name << ": " << cpp_strerror(-r) << std::endl; @@ -1433,8 +1431,7 @@ int set_bucket_ratelimit(rgw::sal::Driver* driver, OPT opt_cmd, bool have_max_read_bytes, bool have_max_write_bytes) { std::unique_ptr bucket; - int r = driver->load_bucket(dpp(), nullptr, - rgw_bucket(tenant_name, bucket_name), + int r = driver->load_bucket(dpp(), rgw_bucket(tenant_name, bucket_name), &bucket, null_yield); if (r < 0) { cerr << "could not get bucket info for bucket=" << bucket_name << ": " << cpp_strerror(-r) << std::endl; @@ -1538,8 +1535,7 @@ int show_bucket_ratelimit(rgw::sal::Driver* driver, const string& tenant_name, const string& bucket_name, Formatter *formatter) { std::unique_ptr bucket; - int r = driver->load_bucket(dpp(), nullptr, - rgw_bucket(tenant_name, bucket_name), + int r = driver->load_bucket(dpp(), rgw_bucket(tenant_name, bucket_name), &bucket, null_yield); if (r < 0) { cerr << "could not get bucket info for bucket=" << bucket_name << ": " << cpp_strerror(-r) << std::endl; @@ -1724,7 +1720,7 @@ int do_check_object_locator(const string& tenant_name, const string& bucket_name f->open_object_section("bucket"); f->dump_string("bucket", bucket_name); - int ret = init_bucket(nullptr, tenant_name, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant_name, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return ret; @@ -2041,12 +2037,11 @@ static int update_period(rgw::sal::ConfigStore* cfgstore, return 0; } -static int init_bucket_for_sync(rgw::sal::User* user, - const string& tenant, const string& bucket_name, +static int init_bucket_for_sync(const string& tenant, const string& bucket_name, const string& bucket_id, std::unique_ptr* bucket) { - int ret = init_bucket(user, tenant, bucket_name, bucket_id, bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return ret; @@ -2522,7 +2517,7 @@ static int bucket_source_sync_status(const DoutPrefixProvider *dpp, rgw::sal::Ra } std::unique_ptr source_bucket; - int r = init_bucket(nullptr, *pipe.source.bucket, &source_bucket); + int r = init_bucket(*pipe.source.bucket, &source_bucket); if (r < 0) { ldpp_dout(dpp, -1) << "failed to read source bucket info: " << cpp_strerror(r) << dendl; return r; @@ -2651,7 +2646,7 @@ static void get_hint_entities(const std::set& zones, const std::set for (auto& zone_id : zones) { for (auto& b : buckets) { std::unique_ptr hint_bucket; - int ret = init_bucket(nullptr, b, &hint_bucket); + int ret = init_bucket(b, &hint_bucket); if (ret < 0) { ldpp_dout(dpp(), 20) << "could not init bucket info for hint bucket=" << b << " ... skipping" << dendl; continue; @@ -2694,7 +2689,7 @@ static int sync_info(std::optional opt_target_zone, std::optional bucket; - int ret = init_bucket(nullptr, *eff_bucket, &bucket); + int ret = init_bucket(*eff_bucket, &bucket); if (ret < 0 && ret != -ENOENT) { cerr << "ERROR: init_bucket failed: " << cpp_strerror(-ret) << std::endl; return ret; @@ -2998,7 +2993,7 @@ int check_reshard_bucket_params(rgw::sal::Driver* driver, return -EINVAL; } - int ret = init_bucket(nullptr, tenant, bucket_name, bucket_id, bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return ret; @@ -3181,7 +3176,7 @@ public: return 0; } - ret = init_bucket(nullptr, *b, &bucket); + ret = init_bucket(*b, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return ret; @@ -7020,7 +7015,7 @@ int main(int argc, const char **argv) bucket_op.marker = marker; RGWBucketAdminOp::info(driver, bucket_op, stream_flusher, null_yield, dpp()); } else { - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -7113,7 +7108,7 @@ int main(int argc, const char **argv) cerr << "ERROR: bucket not specified" << std::endl; return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { return -ret; } @@ -7227,7 +7222,7 @@ int main(int argc, const char **argv) cerr << "ERROR: bucket not specified" << std::endl; return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { return -ret; } @@ -7435,7 +7430,7 @@ next: if (!bucket_name.empty()) { - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -7479,7 +7474,7 @@ next: } if (!bucket_name.empty()) { - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -7518,7 +7513,7 @@ next: } if (opt_cmd == OPT::OLH_GET) { - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -7535,7 +7530,7 @@ next: } if (opt_cmd == OPT::OLH_READLOG) { - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -7573,7 +7568,7 @@ next: cerr << "ERROR: object not specified" << std::endl; return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -7599,7 +7594,7 @@ next: cerr << "ERROR: bucket name not specified" << std::endl; return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -7627,7 +7622,7 @@ next: return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { ldpp_dout(dpp(), 0) << "ERROR: could not init bucket: " << cpp_strerror(-ret) << dendl; @@ -7697,14 +7692,14 @@ next: cerr << "ERROR: bucket name not specified" << std::endl; return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; } std::unique_ptr cur_bucket; - ret = init_bucket(user.get(), tenant, bucket_name, string(), &cur_bucket); + ret = init_bucket(tenant, bucket_name, string(), &cur_bucket); if (ret == -ENOENT) { // no bucket entrypoint } else if (ret < 0) { @@ -7782,7 +7777,7 @@ next: } if (opt_cmd == OPT::OBJECT_RM) { - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -7806,7 +7801,7 @@ next: return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -7849,7 +7844,7 @@ next: return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << "." << std::endl; @@ -7942,7 +7937,7 @@ next: return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -8184,7 +8179,7 @@ next: return EINVAL; } - ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -8221,7 +8216,7 @@ next: } bool bucket_initable = true; - ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { if (yes_i_really_mean_it) { bucket_initable = false; @@ -8283,7 +8278,7 @@ next: } // OPT_RESHARD_CANCEL if (opt_cmd == OPT::OBJECT_UNLINK) { - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -8303,7 +8298,7 @@ next: } if (opt_cmd == OPT::OBJECT_STAT) { - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -8509,7 +8504,7 @@ next: } RGWLifecycleConfiguration config; - ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -8535,7 +8530,7 @@ next: if (opt_cmd == OPT::LC_PROCESS) { if ((! bucket_name.empty()) || (! bucket_id.empty())) { - int ret = init_bucket(nullptr, tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; @@ -8696,7 +8691,7 @@ next: if (sync_stats) { if (!bucket_name.empty()) { - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -9219,7 +9214,7 @@ next: cerr << "ERROR: bucket not specified" << std::endl; return EINVAL; } - int ret = init_bucket_for_sync(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket_for_sync(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { return -ret; } @@ -9227,7 +9222,7 @@ next: if (opt_sb && opt_sb->bucket_id.empty()) { string sbid; std::unique_ptr sbuck; - int ret = init_bucket_for_sync(user.get(), opt_sb->tenant, opt_sb->name, sbid, &sbuck); + int ret = init_bucket_for_sync(opt_sb->tenant, opt_sb->name, sbid, &sbuck); if (ret < 0) { return -ret; } @@ -9258,7 +9253,7 @@ next: cerr << "ERROR: bucket not specified" << std::endl; return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { return -ret; } @@ -9310,7 +9305,7 @@ next: cerr << "ERROR: bucket not specified" << std::endl; return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { return -ret; } @@ -9322,7 +9317,7 @@ next: cerr << "ERROR: bucket not specified" << std::endl; return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { return -ret; } @@ -9338,7 +9333,7 @@ next: cerr << "ERROR: bucket not specified" << std::endl; return EINVAL; } - int ret = init_bucket_for_sync(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket_for_sync(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { return -ret; } @@ -9371,7 +9366,7 @@ next: cerr << "ERROR: bucket not specified" << std::endl; return EINVAL; } - int ret = init_bucket_for_sync(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket_for_sync(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { return -ret; } @@ -9396,7 +9391,7 @@ next: cerr << "ERROR: bucket not specified" << std::endl; return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -9906,7 +9901,7 @@ next: cerr << "ERROR: bucket not specified" << std::endl; return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -9929,7 +9924,7 @@ next: cerr << "ERROR: bucket not specified" << std::endl; return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -10514,7 +10509,7 @@ next: RGWPubSub ps(driver, tenant); rgw_pubsub_bucket_topics result; - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -10581,7 +10576,7 @@ next: return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -10635,7 +10630,7 @@ next: return EINVAL; } - int ret = init_bucket(user.get(), tenant, bucket_name, bucket_id, &bucket); + int ret = init_bucket(tenant, bucket_name, bucket_id, &bucket); if (ret < 0) { cerr << "ERROR: could not init bucket: " << cpp_strerror(-ret) << std::endl; return -ret; diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 852469b7eac93..93cd2ea763493 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -137,7 +137,7 @@ int rgw_chown_bucket_and_objects(rgw::sal::Driver* driver, rgw::sal::Bucket* buc const DoutPrefixProvider *dpp, optional_yield y) { /* Chown on the bucket */ - int ret = bucket->chown(dpp, *new_user, y); + int ret = bucket->chown(dpp, new_user->get_id(), y); if (ret < 0) { set_err_msg(err_msg, "Failed to change object ownership: " + cpp_strerror(-ret)); } diff --git a/src/rgw/rgw_lc.cc b/src/rgw/rgw_lc.cc index ca8330c396244..978f9736b8ebf 100644 --- a/src/rgw/rgw_lc.cc +++ b/src/rgw/rgw_lc.cc @@ -1331,17 +1331,8 @@ public: /* notifications */ auto& bucket = oc.bucket; - auto& bucket_info = oc.bucket->get_info(); std::string version_id; - std::unique_ptr user; - user = oc.driver->get_user(bucket_info.owner); - if (! bucket->get_owner()) { - if (user) { - bucket->set_owner(user.get()); - } - } - auto& obj = oc.obj; const auto event_type = (bucket->versioned() && @@ -1619,8 +1610,7 @@ int RGWLC::bucket_lc_process(string& shard_id, LCWorker* worker, return 0; } - int ret = driver->load_bucket(this, nullptr, - rgw_bucket(bucket_tenant, bucket_name), + int ret = driver->load_bucket(this, rgw_bucket(bucket_tenant, bucket_name), &bucket, null_yield); if (ret < 0) { ldpp_dout(this, 0) << "LC:get_bucket for " << bucket_name @@ -1628,13 +1618,6 @@ int RGWLC::bucket_lc_process(string& shard_id, LCWorker* worker, return ret; } - ret = bucket->load_bucket(this, null_yield); - if (ret < 0) { - ldpp_dout(this, 0) << "LC:load_bucket for " << bucket_name - << " failed" << dendl; - return ret; - } - auto stack_guard = make_scope_guard( [&worker] { @@ -1757,15 +1740,6 @@ int RGWLC::bucket_lc_process(string& shard_id, LCWorker* worker, worker->workpool->drain(); } - std::unique_ptr user; - if (! bucket->get_owner()) { - auto& bucket_info = bucket->get_info(); - std::unique_ptr user = driver->get_user(bucket_info.owner); - if (user) { - bucket->set_owner(user.get()); - } - } - ret = handle_multipart_expiration(bucket.get(), prefix_map, worker, stop_at, once); return ret; } diff --git a/src/rgw/rgw_lua_request.cc b/src/rgw/rgw_lua_request.cc index 058384929b3cb..cb819deff14c3 100644 --- a/src/rgw/rgw_lua_request.cc +++ b/src/rgw/rgw_lua_request.cc @@ -305,7 +305,7 @@ struct BucketMetaTable : public EmptyMetaTable { create_metatable(L, name, index, false, &(bucket->get_info().placement_rule)); } else if (strcasecmp(index, "User") == 0) { create_metatable(L, name, index, false, - const_cast(&bucket->get_owner()->get_id())); + const_cast(&bucket->get_owner())); } else { return error_unknown_field(L, index, name); } diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 00715db9219d1..dc802b4c45287 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -533,8 +533,8 @@ int rgw_build_bucket_policies(const DoutPrefixProvider *dpp, rgw::sal::Driver* d /* check if copy source is within the current domain */ if (!s->src_bucket_name.empty()) { std::unique_ptr src_bucket; - ret = driver->load_bucket(dpp, nullptr, - rgw_bucket(s->src_tenant_name, s->src_bucket_name), + ret = driver->load_bucket(dpp, rgw_bucket(s->src_tenant_name, + s->src_bucket_name), &src_bucket, y); if (ret == 0) { s->local_source = zonegroup.equals(src_bucket->get_info().zonegroup); @@ -554,9 +554,8 @@ int rgw_build_bucket_policies(const DoutPrefixProvider *dpp, rgw::sal::Driver* d /* This is the only place that s->bucket is created. It should never be * overwritten. */ - ret = driver->load_bucket(dpp, s->user.get(), - rgw_bucket(s->bucket_tenant, s->bucket_name, - s->bucket_instance_id), + ret = driver->load_bucket(dpp, rgw_bucket(s->bucket_tenant, s->bucket_name, + s->bucket_instance_id), &s->bucket, y); if (ret < 0) { if (ret != -ENOENT) { @@ -1976,8 +1975,7 @@ int RGWGetObj::handle_user_manifest(const char *prefix, optional_yield y) if (bucket_name.compare(s->bucket->get_name()) != 0) { map bucket_attrs; - r = driver->load_bucket(this, s->user.get(), - rgw_bucket(s->user->get_tenant(), bucket_name), + r = driver->load_bucket(this, rgw_bucket(s->user->get_tenant(), bucket_name), &ubucket, y); if (r < 0) { ldpp_dout(this, 0) << "could not get bucket info for bucket=" @@ -2108,8 +2106,8 @@ int RGWGetObj::handle_slo_manifest(bufferlist& bl, optional_yield y) RGWAccessControlPolicy& _bucket_acl = allocated_acls.back(); std::unique_ptr tmp_bucket; - int r = driver->load_bucket(this, s->user.get(), - rgw_bucket(s->user->get_tenant(), bucket_name), + int r = driver->load_bucket(this, rgw_bucket(s->user->get_tenant(), + bucket_name), &tmp_bucket, y); if (r < 0) { ldpp_dout(this, 0) << "could not get bucket info for bucket=" @@ -3019,7 +3017,7 @@ void RGWStatBucket::execute(optional_yield y) return; } - op_ret = driver->load_bucket(this, s->user.get(), s->bucket->get_key(), &bucket, y); + op_ret = driver->load_bucket(this, s->bucket->get_key(), &bucket, y); if (op_ret) { return; } @@ -3488,8 +3486,7 @@ void RGWCreateBucket::execute(optional_yield y) } // read the bucket info if it exists - op_ret = driver->load_bucket(this, s->user.get(), - rgw_bucket(s->bucket_tenant, s->bucket_name), + op_ret = driver->load_bucket(this, rgw_bucket(s->bucket_tenant, s->bucket_name), &s->bucket, y); if (op_ret < 0 && op_ret != -ENOENT) return; @@ -3530,6 +3527,7 @@ void RGWCreateBucket::execute(optional_yield y) s->bucket_owner.set_id(s->user->get_id()); s->bucket_owner.set_name(s->user->get_display_name()); + createparams.owner = s->user->get_id(); buffer::list aclbl; policy.encode(aclbl); @@ -3610,7 +3608,7 @@ void RGWCreateBucket::execute(optional_yield y) op_ret = s->bucket->load_bucket(this, y); if (op_ret < 0) { return; - } else if (!s->bucket->is_owner(s->user.get())) { + } else if (s->bucket->get_owner() != s->user->get_id()) { /* New bucket doesn't belong to the account we're operating on. */ op_ret = -EEXIST; return; @@ -3789,23 +3787,16 @@ int RGWPutObj::init_processing(optional_yield y) { } } std::unique_ptr bucket; - ret = driver->load_bucket(this, s->user.get(), - rgw_bucket(copy_source_tenant_name, - copy_source_bucket_name), + ret = driver->load_bucket(this, rgw_bucket(copy_source_tenant_name, + copy_source_bucket_name), &bucket, y); if (ret < 0) { - ldpp_dout(this, 5) << __func__ << "(): get_bucket() returned ret=" << ret << dendl; + ldpp_dout(this, 5) << __func__ << "(): load_bucket() returned ret=" << ret << dendl; if (ret == -ENOENT) { ret = -ERR_NO_SUCH_BUCKET; } return ret; } - - ret = bucket->load_bucket(this, y); - if (ret < 0) { - ldpp_dout(this, 5) << __func__ << "(): load_bucket() returned ret=" << ret << dendl; - return ret; - } copy_source_bucket_info = bucket->get_info(); /* handle x-amz-copy-source-range */ @@ -3853,7 +3844,7 @@ int RGWPutObj::verify_permission(optional_yield y) RGWAccessControlPolicy cs_acl(s->cct); boost::optional policy; map cs_attrs; - auto cs_bucket = driver->get_bucket(nullptr, copy_source_bucket_info); + auto cs_bucket = driver->get_bucket(copy_source_bucket_info); auto cs_object = cs_bucket->get_object(rgw_obj_key(copy_source_object_name, copy_source_version_id)); cs_object->set_atomic(); @@ -4039,7 +4030,7 @@ int RGWPutObj::get_data(const off_t fst, const off_t lst, bufferlist& bl) new_ofs = fst; new_end = lst; - auto bucket = driver->get_bucket(nullptr, copy_source_bucket_info); + auto bucket = driver->get_bucket(copy_source_bucket_info); auto obj = bucket->get_object(rgw_obj_key(copy_source_object_name, copy_source_version_id)); auto read_op = obj->get_read_op(); @@ -4300,7 +4291,7 @@ void RGWPutObj::execute(optional_yield y) return; } if ((! copy_source.empty()) && !copy_source_range) { - auto bucket = driver->get_bucket(nullptr, copy_source_bucket_info); + auto bucket = driver->get_bucket(copy_source_bucket_info); auto obj = bucket->get_object(rgw_obj_key(copy_source_object_name, copy_source_version_id)); @@ -5474,9 +5465,8 @@ int RGWCopyObj::init_processing(optional_yield y) return op_ret; } - op_ret = driver->load_bucket(this, s->user.get(), - rgw_bucket(s->src_tenant_name, - s->src_bucket_name), + op_ret = driver->load_bucket(this, rgw_bucket(s->src_tenant_name, + s->src_bucket_name), &src_bucket, y); if (op_ret < 0) { if (op_ret == -ENOENT) { @@ -7437,9 +7427,8 @@ bool RGWBulkDelete::Deleter::delete_single(const acct_path_t& path, optional_yie ACLOwner bowner; RGWObjVersionTracker ot; - int ret = driver->load_bucket(dpp, s->user.get(), - rgw_bucket(s->user->get_tenant(), - path.bucket_name), + int ret = driver->load_bucket(dpp, rgw_bucket(s->user->get_tenant(), + path.bucket_name), &bucket, y); if (ret < 0) { goto binfo_fail; @@ -7693,7 +7682,7 @@ int RGWBulkUploadOp::handle_dir(const std::string_view path, optional_yield y) // load the bucket std::unique_ptr bucket; - ret = driver->load_bucket(this, s->user.get(), new_bucket, &bucket, y); + ret = driver->load_bucket(this, new_bucket, &bucket, y); // return success if it exists if (ret != -ENOENT) { @@ -7704,6 +7693,7 @@ int RGWBulkUploadOp::handle_dir(const std::string_view path, optional_yield y) const auto& zonegroup = s->penv.site->get_zonegroup(); rgw::sal::Bucket::CreateParams createparams; + createparams.owner = s->user->get_id(); createparams.zonegroup_id = zonegroup.id; createparams.placement_rule.storage_class = s->info.storage_class; op_ret = select_bucket_placement(this, zonegroup, s->user->get_info(), @@ -7831,8 +7821,8 @@ int RGWBulkUploadOp::handle_file(const std::string_view path, std::unique_ptr bucket; ACLOwner bowner; - op_ret = driver->load_bucket(this, s->user.get(), - rgw_bucket(s->user->get_tenant(), bucket_name), + op_ret = driver->load_bucket(this, rgw_bucket(s->user->get_tenant(), + bucket_name), &bucket, y); if (op_ret < 0) { if (op_ret == -ENOENT) { diff --git a/src/rgw/rgw_orphan.cc b/src/rgw/rgw_orphan.cc index 8b9125f29067f..b7dc562c721b9 100644 --- a/src/rgw/rgw_orphan.cc +++ b/src/rgw/rgw_orphan.cc @@ -502,7 +502,7 @@ int RGWOrphanSearch::build_linked_oids_for_bucket(const DoutPrefixProvider *dpp, } std::unique_ptr cur_bucket; - ret = store->load_bucket(dpp, nullptr, orphan_bucket, &cur_bucket, null_yield); + ret = store->load_bucket(dpp, orphan_bucket, &cur_bucket, null_yield); if (ret < 0) { if (ret == -ENOENT) { /* probably raced with bucket removal */ @@ -529,7 +529,7 @@ int RGWOrphanSearch::build_linked_oids_for_bucket(const DoutPrefixProvider *dpp, rgw_bucket b; rgw_bucket_parse_bucket_key(store->ctx(), bucket_instance_id, &b, nullptr); std::unique_ptr bucket; - ret = store->load_bucket(dpp, nullptr, b, &bucket, null_yield); + ret = store->load_bucket(dpp, b, &bucket, null_yield); if (ret < 0) { if (ret == -ENOENT) { /* probably raced with bucket removal */ @@ -1241,7 +1241,7 @@ int RGWRadosList::process_bucket( continue; } - auto bucket = store->get_bucket(nullptr, bucket_info); + auto bucket = store->get_bucket(bucket_info); // we need to do this in two cases below, so use a lambda auto do_stat_key = [&](const rgw_obj_key& key) -> int { @@ -1388,7 +1388,7 @@ int RGWRadosList::run(const DoutPrefixProvider *dpp, bucket_process_map.erase(front); std::unique_ptr bucket; - ret = store->load_bucket(dpp, nullptr, rgw_bucket(tenant_name, bucket_name), + ret = store->load_bucket(dpp, rgw_bucket(tenant_name, bucket_name), &bucket, null_yield); if (ret == -ENOENT) { std::cerr << "WARNING: bucket " << bucket_name << @@ -1460,8 +1460,7 @@ int RGWRadosList::run(const DoutPrefixProvider *dpp, // initial bucket std::unique_ptr bucket; - ret = store->load_bucket(dpp, nullptr, - rgw_bucket(tenant_name, start_bucket_name), + ret = store->load_bucket(dpp, rgw_bucket(tenant_name, start_bucket_name), &bucket, null_yield); if (ret == -ENOENT) { // bucket deletion race? diff --git a/src/rgw/rgw_quota.cc b/src/rgw/rgw_quota.cc index 3786ccd6729a1..c2f300b1fdb83 100644 --- a/src/rgw/rgw_quota.cc +++ b/src/rgw/rgw_quota.cc @@ -265,7 +265,7 @@ int BucketAsyncRefreshHandler::init_fetch() std::unique_ptr rbucket; const DoutPrefix dp(driver->ctx(), dout_subsys, "rgw bucket async refresh handler: "); - int r = driver->load_bucket(&dp, nullptr, bucket, &rbucket, null_yield); + int r = driver->load_bucket(&dp, bucket, &rbucket, null_yield); if (r < 0) { ldpp_dout(&dp, 0) << "could not get bucket info for bucket=" << bucket << " r=" << r << dendl; return r; @@ -340,7 +340,7 @@ int RGWBucketStatsCache::fetch_stats_from_storage(const rgw_user& _u, const rgw_ std::unique_ptr user = driver->get_user(_u); std::unique_ptr bucket; - int r = driver->load_bucket(dpp, user.get(), _b, &bucket, y); + int r = driver->load_bucket(dpp, _b, &bucket, y); if (r < 0) { ldpp_dout(dpp, 0) << "could not get bucket info for bucket=" << _b << " r=" << r << dendl; return r; @@ -613,7 +613,7 @@ int RGWUserStatsCache::sync_bucket(const rgw_user& _u, rgw_bucket& _b, optional_ std::unique_ptr user = driver->get_user(_u); std::unique_ptr bucket; - int r = driver->load_bucket(dpp, user.get(), _b, &bucket, y); + int r = driver->load_bucket(dpp, _b, &bucket, y); if (r < 0) { ldpp_dout(dpp, 0) << "could not get bucket info for bucket=" << _b << " r=" << r << dendl; return r; diff --git a/src/rgw/rgw_rest_pubsub.cc b/src/rgw/rgw_rest_pubsub.cc index d2a1c72f3aa75..04f21d9b87d90 100644 --- a/src/rgw/rgw_rest_pubsub.cc +++ b/src/rgw/rgw_rest_pubsub.cc @@ -960,10 +960,8 @@ void RGWPSCreateNotifOp::execute(optional_yield y) { return; } - std::unique_ptr user = driver->get_user(s->owner.get_id()); std::unique_ptr bucket; - op_ret = driver->load_bucket(this, user.get(), - rgw_bucket(s->bucket_tenant, s->bucket_name), + op_ret = driver->load_bucket(this, rgw_bucket(s->bucket_tenant, s->bucket_name), &bucket, y); if (op_ret < 0) { ldpp_dout(this, 1) << "failed to get bucket '" << @@ -1110,10 +1108,8 @@ void RGWPSDeleteNotifOp::execute(optional_yield y) { return; } - std::unique_ptr user = driver->get_user(s->owner.get_id()); std::unique_ptr bucket; - op_ret = driver->load_bucket(this, user.get(), - rgw_bucket(s->bucket_tenant, s->bucket_name), + op_ret = driver->load_bucket(this, rgw_bucket(s->bucket_tenant, s->bucket_name), &bucket, y); if (op_ret < 0) { ldpp_dout(this, 1) << "failed to get bucket '" << @@ -1209,10 +1205,8 @@ void RGWPSListNotifsOp::execute(optional_yield y) { return; } - std::unique_ptr user = driver->get_user(s->owner.get_id()); std::unique_ptr bucket; - op_ret = driver->load_bucket(this, user.get(), - rgw_bucket(s->bucket_tenant, s->bucket_name), + op_ret = driver->load_bucket(this, rgw_bucket(s->bucket_tenant, s->bucket_name), &bucket, y); if (op_ret < 0) { ldpp_dout(this, 1) << "failed to get bucket '" << diff --git a/src/rgw/rgw_rest_ratelimit.cc b/src/rgw/rgw_rest_ratelimit.cc index e5d1aabb1503d..3de8ca2618dc8 100644 --- a/src/rgw/rgw_rest_ratelimit.cc +++ b/src/rgw/rgw_rest_ratelimit.cc @@ -36,8 +36,7 @@ void RGWOp_Ratelimit_Info::execute(optional_yield y) if (ratelimit_scope == "bucket" && !bucket_name.empty() && !global) { std::unique_ptr bucket; - int r = driver->load_bucket(s, nullptr, - rgw_bucket(tenant_name, bucket_name), + int r = driver->load_bucket(s, rgw_bucket(tenant_name, bucket_name), &bucket, y); if (r != 0) { op_ret = r; @@ -275,8 +274,7 @@ void RGWOp_Ratelimit_Set::execute(optional_yield y) if (ratelimit_scope == "bucket" && !bucket_name.empty() && !global) { ldpp_dout(this, 0) << "getting bucket info" << dendl; std::unique_ptr bucket; - op_ret = driver->load_bucket(this, nullptr, - rgw_bucket(tenant_name, bucket_name), + op_ret = driver->load_bucket(this, rgw_bucket(tenant_name, bucket_name), &bucket, y); if (op_ret) { ldpp_dout(this, 0) << "Error on getting bucket info" << dendl; diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 971b63e85d799..6d56766d10eb7 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -2343,7 +2343,7 @@ static void dump_bucket_metadata(req_state *s, rgw::sal::Bucket* bucket, dump_header(s, "X-RGW-Bytes-Used", static_cast(stats.size)); // only bucket's owner is allowed to get the quota settings of the account - if (bucket->is_owner(s->user.get())) { + if (bucket->get_owner() == s->user->get_id()) { auto user_info = s->user->get_info(); auto bucket_quota = s->bucket->get_info().quota; // bucket quota dump_header(s, "X-RGW-Quota-User-Size", static_cast(user_info.quota.user_quota.max_size)); diff --git a/src/rgw/rgw_rest_swift.cc b/src/rgw/rgw_rest_swift.cc index b941d4bb09925..53815e11d1f2c 100644 --- a/src/rgw/rgw_rest_swift.cc +++ b/src/rgw/rgw_rest_swift.cc @@ -858,8 +858,7 @@ int RGWPutObj_ObjStore_SWIFT::update_slo_segment_size(rgw_slo_entry& entry) { std::unique_ptr bucket; if (bucket_name.compare(s->bucket->get_name()) != 0) { - r = driver->load_bucket(s, s->user.get(), - rgw_bucket(s->user->get_id().tenant, bucket_name), + r = driver->load_bucket(s, rgw_bucket(s->user->get_tenant(), bucket_name), &bucket, s->yield); if (r < 0) { ldpp_dout(this, 0) << "could not get bucket info for bucket=" @@ -2123,8 +2122,7 @@ void RGWFormPost::get_owner_info(const req_state* const s, /* Need to get user info of bucket owner. */ std::unique_ptr bucket; - int ret = driver->load_bucket(s, user.get(), - rgw_bucket(bucket_tenant, bucket_name), + int ret = driver->load_bucket(s, rgw_bucket(bucket_tenant, bucket_name), &bucket, s->yield); if (ret < 0) { throw ret; diff --git a/src/rgw/rgw_rest_usage.cc b/src/rgw/rgw_rest_usage.cc index 65b035c00727b..806affa6f8835 100644 --- a/src/rgw/rgw_rest_usage.cc +++ b/src/rgw/rgw_rest_usage.cc @@ -30,18 +30,19 @@ void RGWOp_Usage_Get::execute(optional_yield y) { string uid_str; string bucket_name; + string tenant; uint64_t start, end; bool show_entries; bool show_summary; RESTArgs::get_string(s, "uid", uid_str, &uid_str); RESTArgs::get_string(s, "bucket", bucket_name, &bucket_name); + RESTArgs::get_string(s, "tenant", "", &tenant); std::unique_ptr user = driver->get_user(rgw_user(uid_str)); std::unique_ptr bucket; if (!bucket_name.empty()) { - op_ret = driver->load_bucket(nullptr, user.get(), - rgw_bucket(std::string(), bucket_name), + op_ret = driver->load_bucket(this, rgw_bucket(tenant, bucket_name), &bucket, null_yield); if (op_ret < 0) { return; @@ -84,16 +85,17 @@ public: void RGWOp_Usage_Delete::execute(optional_yield y) { string uid_str; string bucket_name; + string tenant; uint64_t start, end; RESTArgs::get_string(s, "uid", uid_str, &uid_str); RESTArgs::get_string(s, "bucket", bucket_name, &bucket_name); + RESTArgs::get_string(s, "tenant", "", &tenant); std::unique_ptr user = driver->get_user(rgw_user(uid_str)); std::unique_ptr bucket; if (!bucket_name.empty()) { - op_ret = driver->load_bucket(nullptr, user.get(), - rgw_bucket(std::string(), bucket_name), + op_ret = driver->load_bucket(this, rgw_bucket(tenant, bucket_name), &bucket, null_yield); if (op_ret < 0) { return; diff --git a/src/rgw/rgw_sal.h b/src/rgw/rgw_sal.h index 2fb2ec98a06e2..fc93fa10431f8 100644 --- a/src/rgw/rgw_sal.h +++ b/src/rgw/rgw_sal.h @@ -291,10 +291,10 @@ class Driver { * there is a Bucket, otherwise use the get_object() in the Bucket class. */ virtual std::unique_ptr get_object(const rgw_obj_key& k) = 0; /** Get a Bucket by info. Does not query the driver, just uses the give bucket info. */ - virtual std::unique_ptr get_bucket(User* u, const RGWBucketInfo& i) = 0; + virtual std::unique_ptr get_bucket(const RGWBucketInfo& i) = 0; /** Load a Bucket by key. Queries driver for bucket info. On -ENOENT, the * bucket must still be allocated to support bucket->create(). */ - virtual int load_bucket(const DoutPrefixProvider* dpp, User* u, const rgw_bucket& b, + virtual int load_bucket(const DoutPrefixProvider* dpp, const rgw_bucket& b, std::unique_ptr* bucket, optional_yield y) = 0; /** For multisite, this driver is the zone's master */ virtual bool is_meta_master() = 0; @@ -647,11 +647,9 @@ class Bucket { /** Set the ACL for this bucket */ virtual int set_acl(const DoutPrefixProvider* dpp, RGWAccessControlPolicy& acl, optional_yield y) = 0; - // XXXX hack - virtual void set_owner(rgw::sal::User* _owner) = 0; - /// Input parameters for create(). struct CreateParams { + rgw_user owner; std::string zonegroup_id; rgw_placement_rule placement_rule; // zone placement is optional on buckets created for another zonegroup @@ -692,13 +690,11 @@ class Bucket { uint64_t num_objs, optional_yield y) = 0; /** Change the owner of this bucket in the backing store. Current owner must be set. Does not * change ownership of the objects in the bucket. */ - virtual int chown(const DoutPrefixProvider* dpp, User& new_user, optional_yield y) = 0; + virtual int chown(const DoutPrefixProvider* dpp, const rgw_user& new_owner, optional_yield y) = 0; /** Store the cached bucket info into the backing store */ virtual int put_info(const DoutPrefixProvider* dpp, bool exclusive, ceph::real_time mtime, optional_yield y) = 0; - /** Check to see if the given user is the owner of this bucket */ - virtual bool is_owner(User* user) = 0; /** Get the owner of this bucket */ - virtual User* get_owner(void) = 0; + virtual const rgw_user& get_owner() const = 0; /** Check in the backing store if this bucket is empty */ virtual int check_empty(const DoutPrefixProvider* dpp, optional_yield y) = 0; /** Chec k if the given size fits within the quota */ diff --git a/src/rgw/rgw_sal_dbstore.cc b/src/rgw/rgw_sal_dbstore.cc index d406289f04888..6c8778b872383 100644 --- a/src/rgw/rgw_sal_dbstore.cc +++ b/src/rgw/rgw_sal_dbstore.cc @@ -62,15 +62,12 @@ namespace rgw::sal { const CreateParams& params, optional_yield y) { - ceph_assert(owner); - const rgw_user& owner_id = owner->get_id(); - rgw_bucket key = get_key(); key.marker = params.marker; key.bucket_id = params.bucket_id; /* XXX: We may not need to send all these params. Cleanup the unused ones */ - return store->getDB()->create_bucket(dpp, owner_id, key, + return store->getDB()->create_bucket(dpp, params.owner, key, params.zonegroup_id, params.placement_rule, params.attrs, params.swift_ver_location, params.quota, params.creation_time, &bucket_version, info, y); @@ -241,11 +238,11 @@ namespace rgw::sal { return 0; } - int DBBucket::chown(const DoutPrefixProvider *dpp, User& new_user, optional_yield y) + int DBBucket::chown(const DoutPrefixProvider *dpp, const rgw_user& new_owner, optional_yield y) { int ret; - ret = store->getDB()->update_bucket(dpp, "owner", info, false, &(new_user.get_id()), nullptr, nullptr, nullptr); + ret = store->getDB()->update_bucket(dpp, "owner", info, false, &new_owner, nullptr, nullptr, nullptr); return ret; } @@ -1552,16 +1549,16 @@ namespace rgw::sal { } - std::unique_ptr DBStore::get_bucket(User* u, const RGWBucketInfo& i) + std::unique_ptr DBStore::get_bucket(const RGWBucketInfo& i) { /* Don't need to fetch the bucket info, use the provided one */ - return std::make_unique(this, i, u); + return std::make_unique(this, i); } - int DBStore::load_bucket(const DoutPrefixProvider *dpp, User* u, const rgw_bucket& b, + int DBStore::load_bucket(const DoutPrefixProvider *dpp, const rgw_bucket& b, std::unique_ptr* bucket, optional_yield y) { - *bucket = std::make_unique(this, b, u); + *bucket = std::make_unique(this, b); return (*bucket)->load_bucket(dpp, y); } diff --git a/src/rgw/rgw_sal_dbstore.h b/src/rgw/rgw_sal_dbstore.h index 26a8dfbcafddf..646ee23f88750 100644 --- a/src/rgw/rgw_sal_dbstore.h +++ b/src/rgw/rgw_sal_dbstore.h @@ -121,12 +121,6 @@ protected: acls() { } - DBBucket(DBStore *_st, User* _u) - : StoreBucket(_u), - store(_st), - acls() { - } - DBBucket(DBStore *_st, const rgw_bucket& _b) : StoreBucket(_b), store(_st), @@ -139,18 +133,6 @@ protected: acls() { } - DBBucket(DBStore *_st, const rgw_bucket& _b, User* _u) - : StoreBucket(_b, _u), - store(_st), - acls() { - } - - DBBucket(DBStore *_st, const RGWBucketInfo& _i, User* _u) - : StoreBucket(_i, _u), - store(_st), - acls() { - } - ~DBBucket() { } virtual std::unique_ptr get_object(const rgw_obj_key& k) override; @@ -178,7 +160,7 @@ protected: RGWBucketEnt* ent) override; int check_bucket_shards(const DoutPrefixProvider *dpp, uint64_t num_objs, optional_yield y) override; - virtual int chown(const DoutPrefixProvider *dpp, User& new_user, optional_yield y) override; + virtual int chown(const DoutPrefixProvider *dpp, const rgw_user& new_owner, optional_yield y) override; virtual int put_info(const DoutPrefixProvider *dpp, bool exclusive, ceph::real_time mtime, optional_yield y) override; virtual int check_empty(const DoutPrefixProvider *dpp, optional_yield y) override; virtual int check_quota(const DoutPrefixProvider *dpp, RGWQuota& quota, uint64_t obj_size, optional_yield y, bool check_size_only = false) override; @@ -763,8 +745,8 @@ public: virtual int get_user_by_swift(const DoutPrefixProvider *dpp, const std::string& user_str, optional_yield y, std::unique_ptr* user) override; virtual std::unique_ptr get_object(const rgw_obj_key& k) override; virtual std::string get_cluster_id(const DoutPrefixProvider* dpp, optional_yield y); - std::unique_ptr get_bucket(User* u, const RGWBucketInfo& i) override; - int load_bucket(const DoutPrefixProvider *dpp, User* u, const rgw_bucket& b, + std::unique_ptr get_bucket(const RGWBucketInfo& i) override; + int load_bucket(const DoutPrefixProvider *dpp, const rgw_bucket& b, std::unique_ptr* bucket, optional_yield y) override; virtual bool is_meta_master() override; virtual Zone* get_zone() { return &zone; } diff --git a/src/rgw/rgw_sal_filter.cc b/src/rgw/rgw_sal_filter.cc index f3ee09fe0c988..b49c6887b62ec 100644 --- a/src/rgw/rgw_sal_filter.cc +++ b/src/rgw/rgw_sal_filter.cc @@ -161,16 +161,17 @@ std::unique_ptr FilterDriver::get_object(const rgw_obj_key& k) return std::make_unique(std::move(o)); } -std::unique_ptr FilterDriver::get_bucket(User* u, const RGWBucketInfo& i) +std::unique_ptr FilterDriver::get_bucket(const RGWBucketInfo& i) { - return std::make_unique(next->get_bucket(nextUser(u), i), u); + return std::make_unique(next->get_bucket(i)); } -int FilterDriver::load_bucket(const DoutPrefixProvider* dpp, User* u, const rgw_bucket& b, std::unique_ptr* bucket, optional_yield y) +int FilterDriver::load_bucket(const DoutPrefixProvider* dpp, const rgw_bucket& b, + std::unique_ptr* bucket, optional_yield y) { std::unique_ptr nb; - const int ret = next->load_bucket(dpp, nextUser(u), b, &nb, y); - *bucket = std::make_unique(std::move(nb), u); + const int ret = next->load_bucket(dpp, b, &nb, y); + *bucket = std::make_unique(std::move(nb)); return ret; } @@ -629,9 +630,9 @@ int FilterBucket::check_bucket_shards(const DoutPrefixProvider* dpp, return next->check_bucket_shards(dpp, num_objs, y); } -int FilterBucket::chown(const DoutPrefixProvider* dpp, User& new_user, optional_yield y) +int FilterBucket::chown(const DoutPrefixProvider* dpp, const rgw_user& new_owner, optional_yield y) { - return next->chown(dpp, new_user, y); + return next->chown(dpp, new_owner, y); } int FilterBucket::put_info(const DoutPrefixProvider* dpp, bool exclusive, @@ -640,9 +641,9 @@ int FilterBucket::put_info(const DoutPrefixProvider* dpp, bool exclusive, return next->put_info(dpp, exclusive, _mtime, y); } -bool FilterBucket::is_owner(User* user) +const rgw_user& FilterBucket::get_owner() const { - return next->is_owner(nextUser(user)); + return next->get_owner(); } int FilterBucket::check_empty(const DoutPrefixProvider* dpp, optional_yield y) diff --git a/src/rgw/rgw_sal_filter.h b/src/rgw/rgw_sal_filter.h index 943170dd0820b..239a80a646531 100644 --- a/src/rgw/rgw_sal_filter.h +++ b/src/rgw/rgw_sal_filter.h @@ -157,10 +157,9 @@ public: std::string& user_str, optional_yield y, std::unique_ptr* user) override; virtual std::unique_ptr get_object(const rgw_obj_key& k) override; - std::unique_ptr get_bucket(User* u, const RGWBucketInfo& i) override; - int load_bucket(const DoutPrefixProvider* dpp, User* u, - const rgw_bucket& b, std::unique_ptr* bucket, - optional_yield y) override; + std::unique_ptr get_bucket(const RGWBucketInfo& i) override; + int load_bucket(const DoutPrefixProvider* dpp, const rgw_bucket& b, + std::unique_ptr* bucket, optional_yield y) override; virtual bool is_meta_master() override; virtual Zone* get_zone() override { return zone.get(); } virtual std::string zone_unique_id(uint64_t unique_num) override; @@ -365,13 +364,10 @@ public: class FilterBucket : public Bucket { protected: std::unique_ptr next; -private: - User* user; public: - FilterBucket(std::unique_ptr _next, User* _user) : - next(std::move(_next)), user(_user) {} + FilterBucket(std::unique_ptr _next) : next(std::move(_next)) {} virtual ~FilterBucket() = default; virtual std::unique_ptr get_object(const rgw_obj_key& key) override; @@ -389,7 +385,6 @@ public: virtual int set_acl(const DoutPrefixProvider* dpp, RGWAccessControlPolicy& acl, optional_yield y) override; - virtual void set_owner(rgw::sal::User* _owner) override { next->set_owner(_owner); } virtual int create(const DoutPrefixProvider* dpp, const CreateParams& params, optional_yield y) override; @@ -407,12 +402,11 @@ public: RGWBucketEnt* ent) override; int check_bucket_shards(const DoutPrefixProvider* dpp, uint64_t num_objs, optional_yield y) override; - virtual int chown(const DoutPrefixProvider* dpp, User& new_user, + virtual int chown(const DoutPrefixProvider* dpp, const rgw_user& new_owner, optional_yield y) override; virtual int put_info(const DoutPrefixProvider* dpp, bool exclusive, ceph::real_time mtime, optional_yield y) override; - virtual bool is_owner(User* user) override; - virtual User* get_owner(void) override { return user; } + virtual const rgw_user& get_owner() const override; virtual int check_empty(const DoutPrefixProvider* dpp, optional_yield y) override; virtual int check_quota(const DoutPrefixProvider *dpp, RGWQuota& quota, uint64_t obj_size, optional_yield y, @@ -453,8 +447,7 @@ public: virtual bool versioning_enabled() override { return next->versioning_enabled(); } virtual std::unique_ptr clone() override { - std::unique_ptr nb = next->clone(); - return std::make_unique(std::move(nb), user); + return std::make_unique(next->clone()); } virtual std::unique_ptr get_multipart_upload( diff --git a/src/rgw/rgw_sal_store.h b/src/rgw/rgw_sal_store.h index 943830c77fe4d..b1592413d782f 100644 --- a/src/rgw/rgw_sal_store.h +++ b/src/rgw/rgw_sal_store.h @@ -80,7 +80,6 @@ class StoreUser : public User { class StoreBucket : public Bucket { protected: RGWBucketInfo info; - User* owner = nullptr; Attrs attrs; obj_version bucket_version; ceph::real_time mtime; @@ -88,22 +87,13 @@ class StoreBucket : public Bucket { public: StoreBucket() = default; - StoreBucket(User* u) : owner(u) { } StoreBucket(const rgw_bucket& b) { info.bucket = b; } StoreBucket(const RGWBucketInfo& i) : info(i) {} - StoreBucket(const rgw_bucket& b, User* u) : owner(u) { info.bucket = b; } - StoreBucket(const RGWBucketInfo& i, User* u) : info(i), owner(u) {} virtual ~StoreBucket() = default; virtual Attrs& get_attrs(void) override { return attrs; } virtual int set_attrs(Attrs a) override { attrs = a; return 0; } - virtual void set_owner(rgw::sal::User* _owner) override { - owner = _owner; - info.owner = owner->get_id(); - } - virtual User* get_owner(void) override { return owner; }; - /* Make sure to call get_bucket_info() if you need it first */ - virtual bool is_owner(User* user) override { return (info.owner.compare(user->get_id()) == 0); } + virtual const rgw_user& get_owner() const override { return info.owner; }; virtual bool empty() const override { return info.bucket.name.empty(); } virtual const std::string& get_name() const override { return info.bucket.name; } virtual const std::string& get_tenant() const override { return info.bucket.tenant; } diff --git a/src/rgw/rgw_swift_auth.cc b/src/rgw/rgw_swift_auth.cc index 852449ad20f6d..b58f0b45d8e7b 100644 --- a/src/rgw/rgw_swift_auth.cc +++ b/src/rgw/rgw_swift_auth.cc @@ -119,7 +119,7 @@ void TempURLEngine::get_owner_info(const DoutPrefixProvider* dpp, const req_stat b.tenant = std::move(bucket_tenant); b.name = std::move(bucket_name); std::unique_ptr bucket; - int ret = driver->load_bucket(dpp, nullptr, b, &bucket, s->yield); + int ret = driver->load_bucket(dpp, b, &bucket, s->yield); if (ret < 0) { throw ret; } diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc index 1f88779d935d5..02403e5f342e4 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -30,7 +30,7 @@ int rgw_user_sync_all_stats(const DoutPrefixProvider *dpp, rgw::sal::Driver* dri for (auto& ent : listing.buckets) { std::unique_ptr bucket; - ret = driver->load_bucket(dpp, user, ent.bucket, &bucket, y); + ret = driver->load_bucket(dpp, ent.bucket, &bucket, y); if (ret < 0) { ldpp_dout(dpp, 0) << "ERROR: could not read bucket info: bucket=" << bucket << " ret=" << ret << dendl; continue; diff --git a/src/test/rgw/test_d4n_filter.cc b/src/test/rgw/test_d4n_filter.cc index 2d39981806c8e..4f54d9b86bb03 100644 --- a/src/test/rgw/test_d4n_filter.cc +++ b/src/test/rgw/test_d4n_filter.cc @@ -117,7 +117,7 @@ class D4NFilterFixture : public ::testing::Test { RGWBucketInfo info; info.bucket.name = "test_bucket"; - testBucket = driver->get_bucket(testUser.get(), info); + testBucket = driver->get_bucket(info); rgw::sal::Bucket::CreateParams params; params.zonegroup_id = "test_id"; @@ -1699,9 +1699,6 @@ TEST_F(D4NFilterFixture, StoreGetMetadata) { value.push_back(make_pair("source_zone_short_id", "300")); value.push_back(make_pair("bucket_count", "10")); value.push_back(make_pair("bucket_size", "20")); - value.push_back(make_pair("user_quota.max_size", "0")); - value.push_back(make_pair("user_quota.max_objects", "0")); - value.push_back(make_pair("max_buckets", "2000")); client.hmset("rgw-object:test_object_StoreGetMetadata:cache", value, [](cpp_redis::reply& reply) { if (!reply.is_null()) { @@ -1730,7 +1727,6 @@ TEST_F(D4NFilterFixture, StoreGetMetadata) { ASSERT_EQ(testROp->prepare(null_yield, dpp), 0); /* Check updated metadata values */ - RGWUserInfo info = testObject_StoreGetMetadata->get_bucket()->get_owner()->get_info(); static StoreObject* storeObject = static_cast(dynamic_cast(testObject_StoreGetMetadata.get())->get_next()); EXPECT_EQ(to_iso_8601(storeObject->state.mtime), "2021-11-08T21:13:38.334696731Z"); @@ -1738,9 +1734,6 @@ TEST_F(D4NFilterFixture, StoreGetMetadata) { EXPECT_EQ(storeObject->state.accounted_size, (uint64_t)200); EXPECT_EQ(storeObject->state.epoch, (uint64_t)3); EXPECT_EQ(storeObject->state.zone_short_id, (uint32_t)300); - EXPECT_EQ(info.quota.user_quota.max_size, (int64_t)0); - EXPECT_EQ(info.quota.user_quota.max_objects, (int64_t)0); - EXPECT_EQ(testObject_StoreGetMetadata->get_bucket()->get_owner()->get_max_buckets(), (int32_t)2000); } TEST_F(D4NFilterFixture, StoreModifyAttr) { diff --git a/src/test/rgw/test_rgw_lua.cc b/src/test/rgw/test_rgw_lua.cc index 8502ce81ef5ac..be9fa6aed1622 100644 --- a/src/test/rgw/test_rgw_lua.cc +++ b/src/test/rgw/test_rgw_lua.cc @@ -338,13 +338,14 @@ TEST(TestRGWLua, Bucket) DEFINE_REQ_STATE; - rgw_bucket b; - b.tenant = "mytenant"; - b.name = "myname"; - b.marker = "mymarker"; - b.bucket_id = "myid"; - s.bucket.reset(new sal::RadosBucket(nullptr, b)); - s.bucket->set_owner(new sal::RadosUser(nullptr, rgw_user("mytenant", "myuser"))); + RGWBucketInfo info; + info.bucket.tenant = "mytenant"; + info.bucket.name = "myname"; + info.bucket.marker = "mymarker"; + info.bucket.bucket_id = "myid"; + info.owner.id = "myuser"; + info.owner.tenant = "mytenant"; + s.bucket.reset(new sal::RadosBucket(nullptr, info)); const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script); ASSERT_EQ(rc, 0); @@ -1558,10 +1559,11 @@ TEST(TestRGWLua, DifferentContextUser) DEFINE_REQ_STATE; s.user.reset(new sal::RadosUser(nullptr, rgw_user("tenant1", "user1"))); - rgw_bucket b; - b.name = "bucket1"; - s.bucket.reset(new sal::RadosBucket(nullptr, b)); - s.bucket->set_owner(new sal::RadosUser(nullptr, rgw_user("tenant2", "user2"))); + RGWBucketInfo info; + info.bucket.name = "bucket1"; + info.owner.id = "user2"; + info.owner.tenant = "tenant2"; + s.bucket.reset(new sal::RadosBucket(nullptr, info)); const auto rc = lua::request::execute(nullptr, nullptr, nullptr, &s, nullptr, script); ASSERT_EQ(rc, 0);