From 7e7c3f56142865e39321d7c1994aa04188670001 Mon Sep 17 00:00:00 2001 From: "Adam C. Emerson" Date: Wed, 11 Nov 2020 11:25:38 -0500 Subject: [PATCH] rgw: No null_yield in rgw_user Signed-off-by: Adam C. Emerson --- src/rgw/rgw_admin.cc | 18 +-- src/rgw/rgw_auth_keystone.cc | 3 +- src/rgw/rgw_auth_keystone.h | 3 +- src/rgw/rgw_cr_tools.cc | 2 +- src/rgw/rgw_rest_s3.cc | 17 +- src/rgw/rgw_rest_s3.h | 12 +- src/rgw/rgw_rest_sts.cc | 2 +- src/rgw/rgw_rest_user.cc | 20 +-- src/rgw/rgw_sts.cc | 11 +- src/rgw/rgw_sts.h | 9 +- src/rgw/rgw_user.cc | 293 ++++++++++++++++++++--------------- src/rgw/rgw_user.h | 96 ++++++++---- 12 files changed, 284 insertions(+), 202 deletions(-) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 36445e86aacde..fd5837bf65261 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -5526,7 +5526,7 @@ int main(int argc, const char **argv) RGWUser user; int ret = 0; if (!(user_id.empty() && access_key.empty()) || !subuser.empty()) { - ret = user.init(store, user_op); + ret = user.init(store, user_op, null_yield); if (ret < 0) { cerr << "user.init failed: " << cpp_strerror(-ret) << std::endl; return -ret; @@ -5557,7 +5557,7 @@ int main(int argc, const char **argv) if (!user_op.has_existing_user()) { user_op.set_generate_key(); // generate a new key by default } - ret = user.add(user_op, &err_msg); + ret = user.add(user_op, null_yield, &err_msg); if (ret < 0) { cerr << "could not create user: " << err_msg << std::endl; if (ret == -ERR_INVALID_TENANT_NAME) @@ -5566,7 +5566,7 @@ int main(int argc, const char **argv) return -ret; } if (!subuser.empty()) { - ret = user.subusers.add(user_op, &err_msg); + ret = user.subusers.add(user_op, null_yield, &err_msg); if (ret < 0) { cerr << "could not create subuser: " << err_msg << std::endl; return -ret; @@ -5607,7 +5607,7 @@ int main(int argc, const char **argv) break; case OPT::SUBUSER_CREATE: - ret = user.subusers.add(user_op, &err_msg); + ret = user.subusers.add(user_op, null_yield, &err_msg); if (ret < 0) { cerr << "could not create subuser: " << err_msg << std::endl; return -ret; @@ -5623,7 +5623,7 @@ int main(int argc, const char **argv) break; case OPT::SUBUSER_RM: - ret = user.subusers.remove(user_op, &err_msg); + ret = user.subusers.remove(user_op, null_yield, &err_msg); if (ret < 0) { cerr << "could not remove subuser: " << err_msg << std::endl; return -ret; @@ -5631,7 +5631,7 @@ int main(int argc, const char **argv) break; case OPT::CAPS_ADD: - ret = user.caps.add(user_op, &err_msg); + ret = user.caps.add(user_op, null_yield, &err_msg); if (ret < 0) { cerr << "could not add caps: " << err_msg << std::endl; return -ret; @@ -5639,7 +5639,7 @@ int main(int argc, const char **argv) break; case OPT::CAPS_RM: - ret = user.caps.remove(user_op, &err_msg); + ret = user.caps.remove(user_op, null_yield, &err_msg); if (ret < 0) { cerr << "could not remove caps: " << err_msg << std::endl; return -ret; @@ -5647,7 +5647,7 @@ int main(int argc, const char **argv) break; case OPT::KEY_CREATE: - ret = user.keys.add(user_op, &err_msg); + ret = user.keys.add(user_op, null_yield, &err_msg); if (ret < 0) { cerr << "could not create key: " << err_msg << std::endl; return -ret; @@ -5655,7 +5655,7 @@ int main(int argc, const char **argv) break; case OPT::KEY_RM: - ret = user.keys.remove(user_op, &err_msg); + ret = user.keys.remove(user_op, null_yield, &err_msg); if (ret < 0) { cerr << "could not remove key: " << err_msg << std::endl; return -ret; diff --git a/src/rgw/rgw_auth_keystone.cc b/src/rgw/rgw_auth_keystone.cc index c0eeb02fa57a9..124b50793e4da 100644 --- a/src/rgw/rgw_auth_keystone.cc +++ b/src/rgw/rgw_auth_keystone.cc @@ -534,7 +534,8 @@ rgw::auth::Engine::result_t EC2Engine::authenticate( const signature_factory_t& signature_factory, const completer_factory_t& completer_factory, /* Passthorugh only! */ - const req_state* s) const + const req_state* s, + optional_yield y) const { /* This will be initialized on the first call to this method. In C++11 it's * also thread-safe. */ diff --git a/src/rgw/rgw_auth_keystone.h b/src/rgw/rgw_auth_keystone.h index 2152afa877987..4ad20442b96be 100644 --- a/src/rgw/rgw_auth_keystone.h +++ b/src/rgw/rgw_auth_keystone.h @@ -158,7 +158,8 @@ class EC2Engine : public rgw::auth::s3::AWSEngine { const string_to_sign_t& string_to_sign, const signature_factory_t& signature_factory, const completer_factory_t& completer_factory, - const req_state* s) const override; + const req_state* s, + optional_yield y) const override; std::pair, int> get_secret_from_keystone(const DoutPrefixProvider* dpp, const std::string& user_id, const std::string_view& access_key_id) const; diff --git a/src/rgw/rgw_cr_tools.cc b/src/rgw/rgw_cr_tools.cc index 46aa617c5a44e..74497d5fc05e4 100644 --- a/src/rgw/rgw_cr_tools.cc +++ b/src/rgw/rgw_cr_tools.cc @@ -87,7 +87,7 @@ int RGWUserCreateCR::Request::_send_request() } RGWNullFlusher flusher; - return RGWUserAdminOp_User::create(store, op_state, flusher); + return RGWUserAdminOp_User::create(store, op_state, flusher, null_yield); } template<> diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index 4888d297324a5..4a6660a87e00a 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -5565,11 +5565,11 @@ AWSEngine::authenticate(const DoutPrefixProvider* dpp, const req_state* const s, return authenticate(dpp, auth_data.access_key_id, auth_data.client_signature, - auth_data.session_token, + auth_data.session_token, auth_data.string_to_sign, auth_data.signature_factory, auth_data.completer_factory, - s); + s, y); } } @@ -5643,7 +5643,8 @@ rgw::auth::s3::LDAPEngine::authenticate( const string_to_sign_t& string_to_sign, const signature_factory_t&, const completer_factory_t& completer_factory, - const req_state* const s) const + const req_state* const s, + optional_yield y) const { /* boost filters and/or string_ref may throw on invalid input */ rgw::RGWToken base64_token; @@ -5695,13 +5696,14 @@ rgw::auth::s3::LocalEngine::authenticate( const string_to_sign_t& string_to_sign, const signature_factory_t& signature_factory, const completer_factory_t& completer_factory, - const req_state* const s) const + const req_state* const s, + optional_yield y) const { /* get the user info */ RGWUserInfo user_info; /* TODO(rzarzynski): we need to have string-view taking variant. */ const std::string access_key_id(_access_key_id); - if (rgw_get_user_info_by_access_key(ctl->user, access_key_id, user_info) < 0) { + if (rgw_get_user_info_by_access_key(ctl->user, access_key_id, user_info, y) < 0) { ldpp_dout(dpp, 5) << "error reading user info, uid=" << access_key_id << " can't authenticate" << dendl; return result_t::deny(-ERR_INVALID_ACCESS_KEY); @@ -5816,7 +5818,8 @@ rgw::auth::s3::STSEngine::authenticate( const string_to_sign_t& string_to_sign, const signature_factory_t& signature_factory, const completer_factory_t& completer_factory, - const req_state* const s) const + const req_state* const s, + optional_yield y) const { if (! s->info.args.exists("x-amz-security-token") && ! s->info.env->exists("HTTP_X_AMZ_SECURITY_TOKEN") && @@ -5894,7 +5897,7 @@ rgw::auth::s3::STSEngine::authenticate( if (! token.user.empty() && token.acct_type != TYPE_ROLE) { // get user info - int ret = rgw_get_user_info_by_uid(ctl->user, token.user, user_info, NULL); + int ret = rgw_get_user_info_by_uid(ctl->user, token.user, user_info, y, NULL); if (ret < 0) { ldpp_dout(dpp, 5) << "ERROR: failed reading user info: uid=" << token.user << dendl; return result_t::reject(-EPERM); diff --git a/src/rgw/rgw_rest_s3.h b/src/rgw/rgw_rest_s3.h index 8657d4c084bca..7f83d26f69034 100644 --- a/src/rgw/rgw_rest_s3.h +++ b/src/rgw/rgw_rest_s3.h @@ -1025,7 +1025,8 @@ protected: const string_to_sign_t& string_to_sign, const signature_factory_t& signature_factory, const completer_factory_t& completer_factory, - const req_state* s) const = 0; + const req_state* s, + optional_yield y) const = 0; public: result_t authenticate(const DoutPrefixProvider* dpp, const req_state* const s, @@ -1103,7 +1104,8 @@ protected: const string_to_sign_t& string_to_sign, const signature_factory_t&, const completer_factory_t& completer_factory, - const req_state* s) const override; + const req_state* s, + optional_yield y) const override; public: LDAPEngine(CephContext* const cct, RGWCtl* const ctl, @@ -1136,7 +1138,8 @@ class LocalEngine : public AWSEngine { const string_to_sign_t& string_to_sign, const signature_factory_t& signature_factory, const completer_factory_t& completer_factory, - const req_state* s) const override; + const req_state* s, + optional_yield y) const override; public: LocalEngine(CephContext* const cct, RGWCtl* const ctl, @@ -1176,7 +1179,8 @@ class STSEngine : public AWSEngine { const string_to_sign_t& string_to_sign, const signature_factory_t& signature_factory, const completer_factory_t& completer_factory, - const req_state* s) const override; + const req_state* s, + optional_yield y) const override; public: STSEngine(CephContext* const cct, RGWCtl* const ctl, diff --git a/src/rgw/rgw_rest_sts.cc b/src/rgw/rgw_rest_sts.cc index b0de5ddc447bf..d980eab26148e 100644 --- a/src/rgw/rgw_rest_sts.cc +++ b/src/rgw/rgw_rest_sts.cc @@ -561,7 +561,7 @@ void RGWSTSAssumeRole::execute(optional_yield y) STS::AssumeRoleRequest req(s->cct, duration, externalId, policy, roleArn, roleSessionName, serialNumber, tokenCode); - STS::AssumeRoleResponse response = sts.assumeRole(req); + STS::AssumeRoleResponse response = sts.assumeRole(req, y); op_ret = std::move(response.retCode); //Dump the output if (op_ret == 0) { diff --git a/src/rgw/rgw_rest_user.cc b/src/rgw/rgw_rest_user.cc index 215efcfce1b0f..2d3e8e9d82170 100644 --- a/src/rgw/rgw_rest_user.cc +++ b/src/rgw/rgw_rest_user.cc @@ -230,7 +230,7 @@ void RGWOp_User_Create::execute(optional_yield y) ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl; return; } - op_ret = RGWUserAdminOp_User::create(store, op_state, flusher); + op_ret = RGWUserAdminOp_User::create(store, op_state, flusher, y); } class RGWOp_User_Modify : public RGWRESTOp { @@ -489,7 +489,7 @@ void RGWOp_Subuser_Create::execute(optional_yield y) ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl; return; } - op_ret = RGWUserAdminOp_Subuser::create(store, op_state, flusher); + op_ret = RGWUserAdminOp_Subuser::create(store, op_state, flusher, y); } class RGWOp_Subuser_Modify : public RGWRESTOp { @@ -599,7 +599,7 @@ void RGWOp_Subuser_Remove::execute(optional_yield y) ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl; return; } - op_ret = RGWUserAdminOp_Subuser::remove(store, op_state, flusher); + op_ret = RGWUserAdminOp_Subuser::remove(store, op_state, flusher, y); } class RGWOp_Key_Create : public RGWRESTOp { @@ -655,7 +655,7 @@ void RGWOp_Key_Create::execute(optional_yield y) op_state.set_key_type(key_type); } - op_ret = RGWUserAdminOp_Key::create(store, op_state, flusher); + op_ret = RGWUserAdminOp_Key::create(store, op_state, flusher, y); } class RGWOp_Key_Remove : public RGWRESTOp { @@ -702,7 +702,7 @@ void RGWOp_Key_Remove::execute(optional_yield y) op_state.set_key_type(key_type); } - op_ret = RGWUserAdminOp_Key::remove(store, op_state, flusher); + op_ret = RGWUserAdminOp_Key::remove(store, op_state, flusher, y); } class RGWOp_Caps_Add : public RGWRESTOp { @@ -740,7 +740,7 @@ void RGWOp_Caps_Add::execute(optional_yield y) ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl; return; } - op_ret = RGWUserAdminOp_Caps::add(store, op_state, flusher); + op_ret = RGWUserAdminOp_Caps::add(store, op_state, flusher, y); } class RGWOp_Caps_Remove : public RGWRESTOp { @@ -778,7 +778,7 @@ void RGWOp_Caps_Remove::execute(optional_yield y) ldpp_dout(this, 0) << "forward_request_to_master returned ret=" << op_ret << dendl; return; } - op_ret = RGWUserAdminOp_Caps::remove(store, op_state, flusher); + op_ret = RGWUserAdminOp_Caps::remove(store, op_state, flusher, y); } struct UserQuotas { @@ -787,7 +787,7 @@ struct UserQuotas { UserQuotas() {} - explicit UserQuotas(RGWUserInfo& info) : bucket_quota(info.bucket_quota), + explicit UserQuotas(RGWUserInfo& info) : bucket_quota(info.bucket_quota), user_quota(info.user_quota) {} void dump(Formatter *f) const { @@ -844,7 +844,7 @@ void RGWOp_Quota_Info::execute(optional_yield y) op_state.set_user_id(uid); RGWUser user; - op_ret = user.init(store, op_state); + op_ret = user.init(store, op_state, y); if (op_ret < 0) return; @@ -979,7 +979,7 @@ void RGWOp_Quota_Set::execute(optional_yield y) op_state.set_user_id(uid); RGWUser user; - op_ret = user.init(store, op_state); + op_ret = user.init(store, op_state, y); if (op_ret < 0) { ldout(store->ctx(), 20) << "failed initializing user info: " << op_ret << dendl; return; diff --git a/src/rgw/rgw_sts.cc b/src/rgw/rgw_sts.cc index 3c1b4612fd2f4..a6feb2b23c7fc 100644 --- a/src/rgw/rgw_sts.cc +++ b/src/rgw/rgw_sts.cc @@ -310,11 +310,11 @@ std::tuple STSService::getRoleInfo(const string& arn) } } -int STSService::storeARN(string& arn) +int STSService::storeARN(string& arn, optional_yield y) { int ret = 0; RGWUserInfo info; - if (ret = rgw_get_user_info_by_uid(store->ctl()->user, user_id, info); ret < 0) { + if (ret = rgw_get_user_info_by_uid(store->ctl()->user, user_id, info, y); ret < 0) { return -ERR_NO_SUCH_ENTITY; } @@ -322,7 +322,7 @@ int STSService::storeARN(string& arn) RGWObjVersionTracker objv_tracker; if (ret = rgw_store_user_info(store->ctl()->user, info, &info, &objv_tracker, real_time(), - false); ret < 0) { + false, y); ret < 0) { return -ERR_INTERNAL_ERROR; } return ret; @@ -391,7 +391,8 @@ AssumeRoleWithWebIdentityResponse STSService::assumeRoleWithWebIdentity(AssumeRo return response; } -AssumeRoleResponse STSService::assumeRole(AssumeRoleRequest& req) +AssumeRoleResponse STSService::assumeRole(AssumeRoleRequest& req, + optional_yield y) { AssumeRoleResponse response; response.packedPolicySize = 0; @@ -437,7 +438,7 @@ AssumeRoleResponse STSService::assumeRole(AssumeRoleRequest& req) //Save ARN with the user string arn = response.user.getARN(); - response.retCode = storeARN(arn); + response.retCode = storeARN(arn, y); if (response.retCode < 0) { return response; } diff --git a/src/rgw/rgw_sts.h b/src/rgw/rgw_sts.h index e64a9320d4b5f..a721bdc9873c1 100644 --- a/src/rgw/rgw_sts.h +++ b/src/rgw/rgw_sts.h @@ -229,15 +229,16 @@ class STSService { rgw_user user_id; RGWRole role; rgw::auth::Identity* identity; - int storeARN(string& arn); + int storeARN(string& arn, optional_yield y); public: STSService() = default; - STSService(CephContext* cct, rgw::sal::RGWRadosStore *store, rgw_user user_id, rgw::auth::Identity* identity) : cct(cct), store(store), user_id(user_id), identity(identity) {} + STSService(CephContext* cct, rgw::sal::RGWRadosStore *store, rgw_user user_id, + rgw::auth::Identity* identity) + : cct(cct), store(store), user_id(user_id), identity(identity) {} std::tuple getRoleInfo(const string& arn); - AssumeRoleResponse assumeRole(AssumeRoleRequest& req); + AssumeRoleResponse assumeRole(AssumeRoleRequest& req, optional_yield y); GetSessionTokenResponse getSessionToken(GetSessionTokenRequest& req); AssumeRoleWithWebIdentityResponse assumeRoleWithWebIdentity(AssumeRoleWithWebIdentityRequest& req); }; } #endif /* CEPH_RGW_STS_H */ - diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc index 3a2b70088fb68..7e22b4dde5426 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -71,7 +71,7 @@ int rgw_user_sync_all_stats(rgw::sal::RGWRadosStore *store, auto& bucket = i->second; - ret = bucket->get_bucket_info(null_yield); + ret = bucket->get_bucket_info(y); if (ret < 0) { ldout(cct, 0) << "ERROR: could not read bucket info: bucket=" << bucket << " ret=" << ret << dendl; continue; @@ -121,7 +121,7 @@ int rgw_user_get_all_buckets_stats(rgw::sal::RGWRadosStore *store, marker = i.first; auto& bucket_ent = i.second; - ret = bucket_ent->read_bucket_stats(null_yield); + ret = bucket_ent->read_bucket_stats(y); if (ret < 0) { ldout(cct, 0) << "ERROR: could not get bucket stats: ret=" << ret << dendl; return ret; @@ -146,9 +146,10 @@ int rgw_store_user_info(RGWUserCtl *user_ctl, RGWObjVersionTracker *objv_tracker, real_time mtime, bool exclusive, + optional_yield y, map *pattrs) { - return user_ctl->store_info(info, null_yield, + return user_ctl->store_info(info, y, RGWUserCtl::PutParams() .set_old_info(old_info) .set_objv_tracker(objv_tracker) @@ -164,12 +165,13 @@ int rgw_store_user_info(RGWUserCtl *user_ctl, int rgw_get_user_info_by_uid(RGWUserCtl *user_ctl, const rgw_user& uid, RGWUserInfo& info, + optional_yield y, RGWObjVersionTracker * const objv_tracker, real_time * const pmtime, rgw_cache_entry_info * const cache_info, map * const pattrs) { - return user_ctl->get_info_by_uid(uid, &info, null_yield, + return user_ctl->get_info_by_uid(uid, &info, y, RGWUserCtl::GetParams() .set_objv_tracker(objv_tracker) .set_mtime(pmtime) @@ -181,10 +183,12 @@ int rgw_get_user_info_by_uid(RGWUserCtl *user_ctl, * Given an email, finds the user info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ -int rgw_get_user_info_by_email(RGWUserCtl *user_ctl, string& email, RGWUserInfo& info, - RGWObjVersionTracker *objv_tracker, real_time *pmtime) +int rgw_get_user_info_by_email(RGWUserCtl *user_ctl, string& email, + RGWUserInfo& info, optional_yield y, + RGWObjVersionTracker *objv_tracker, + real_time *pmtime) { - return user_ctl->get_info_by_email(email, &info, null_yield, + return user_ctl->get_info_by_email(email, &info, y, RGWUserCtl::GetParams() .set_objv_tracker(objv_tracker) .set_mtime(pmtime)); @@ -194,13 +198,14 @@ int rgw_get_user_info_by_email(RGWUserCtl *user_ctl, string& email, RGWUserInfo& * Given an swift username, finds the user_info associated with it. * returns: 0 on success, -ERR# on failure (including nonexistence) */ -extern int rgw_get_user_info_by_swift(RGWUserCtl *user_ctl, - const string& swift_name, - RGWUserInfo& info, /* out */ - RGWObjVersionTracker * const objv_tracker, - real_time * const pmtime) -{ - return user_ctl->get_info_by_swift(swift_name, &info, null_yield, +int rgw_get_user_info_by_swift(RGWUserCtl *user_ctl, + const string& swift_name, + RGWUserInfo& info, /* out */ + optional_yield y, + RGWObjVersionTracker * const objv_tracker, + real_time * const pmtime) +{ + return user_ctl->get_info_by_swift(swift_name, &info, y, RGWUserCtl::GetParams() .set_objv_tracker(objv_tracker) .set_mtime(pmtime)); @@ -213,10 +218,11 @@ extern int rgw_get_user_info_by_swift(RGWUserCtl *user_ctl, extern int rgw_get_user_info_by_access_key(RGWUserCtl *user_ctl, const std::string& access_key, RGWUserInfo& info, - RGWObjVersionTracker* objv_tracker, + optional_yield y, + RGWObjVersionTracker* objv_tracker, real_time *pmtime) { - return user_ctl->get_info_by_access_key(access_key, &info, null_yield, + return user_ctl->get_info_by_access_key(access_key, &info, y, RGWUserCtl::GetParams() .set_objv_tracker(objv_tracker) .set_mtime(pmtime)); @@ -589,7 +595,8 @@ int RGWAccessKeyPool::check_op(RGWUserAdminOpState& op_state, } // Generate a new random key -int RGWAccessKeyPool::generate_key(RGWUserAdminOpState& op_state, std::string *err_msg) +int RGWAccessKeyPool::generate_key(RGWUserAdminOpState& op_state, + optional_yield y, std::string *err_msg) { std::string id; std::string key; @@ -619,13 +626,13 @@ int RGWAccessKeyPool::generate_key(RGWUserAdminOpState& op_state, std::string *e if (!id.empty()) { switch (key_type) { case KEY_TYPE_SWIFT: - if (rgw_get_user_info_by_swift(user_ctl, id, duplicate_check) >= 0) { + if (rgw_get_user_info_by_swift(user_ctl, id, duplicate_check, y) >= 0) { set_err_msg(err_msg, "existing swift key in RGW system:" + id); return -ERR_KEY_EXIST; } break; case KEY_TYPE_S3: - if (rgw_get_user_info_by_access_key(user_ctl, id, duplicate_check) >= 0) { + if (rgw_get_user_info_by_access_key(user_ctl, id, duplicate_check, y) >= 0) { set_err_msg(err_msg, "existing S3 key in RGW system:" + id); return -ERR_KEY_EXIST; } @@ -646,7 +653,7 @@ int RGWAccessKeyPool::generate_key(RGWUserAdminOpState& op_state, std::string *e set_err_msg(err_msg, "empty secret key"); return -ERR_INVALID_SECRET_KEY; } - + key = op_state.get_secret_key(); } else { char secret_key_buf[SECRET_KEY_LEN + 1]; @@ -665,7 +672,7 @@ int RGWAccessKeyPool::generate_key(RGWUserAdminOpState& op_state, std::string *e if (!validate_access_key(id)) continue; - } while (!rgw_get_user_info_by_access_key(user_ctl, id, duplicate_check)); + } while (!rgw_get_user_info_by_access_key(user_ctl, id, duplicate_check, y)); } if (key_type == KEY_TYPE_SWIFT) { @@ -676,7 +683,7 @@ int RGWAccessKeyPool::generate_key(RGWUserAdminOpState& op_state, std::string *e } // check that the access key doesn't exist - if (rgw_get_user_info_by_swift(user_ctl, id, duplicate_check) >= 0) { + if (rgw_get_user_info_by_swift(user_ctl, id, duplicate_check, y) >= 0) { set_err_msg(err_msg, "cannot create existing swift key"); return -ERR_KEY_EXIST; } @@ -775,7 +782,8 @@ int RGWAccessKeyPool::modify_key(RGWUserAdminOpState& op_state, std::string *err } int RGWAccessKeyPool::execute_add(RGWUserAdminOpState& op_state, - std::string *err_msg, bool defer_user_update) + std::string *err_msg, bool defer_user_update, + optional_yield y) { int ret = 0; @@ -788,7 +796,7 @@ int RGWAccessKeyPool::execute_add(RGWUserAdminOpState& op_state, switch (key_op) { case GENERATE_KEY: - ret = generate_key(op_state, &subprocess_msg); + ret = generate_key(op_state, y, &subprocess_msg); break; case MODIFY_KEY: ret = modify_key(op_state, &subprocess_msg); @@ -802,7 +810,7 @@ int RGWAccessKeyPool::execute_add(RGWUserAdminOpState& op_state, // store the updated info if (!defer_user_update) - ret = user->update(op_state, err_msg); + ret = user->update(op_state, err_msg, y); if (ret < 0) return ret; @@ -810,14 +818,16 @@ int RGWAccessKeyPool::execute_add(RGWUserAdminOpState& op_state, return 0; } -int RGWAccessKeyPool::add(RGWUserAdminOpState& op_state, std::string *err_msg) +int RGWAccessKeyPool::add(RGWUserAdminOpState& op_state, optional_yield y, + std::string *err_msg) { - return add(op_state, err_msg, false); + return add(op_state, err_msg, false, y); } -int RGWAccessKeyPool::add(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_user_update) +int RGWAccessKeyPool::add(RGWUserAdminOpState& op_state, std::string *err_msg, + bool defer_user_update, optional_yield y) { - int ret; + int ret; std::string subprocess_msg; ret = check_op(op_state, &subprocess_msg); @@ -826,7 +836,7 @@ int RGWAccessKeyPool::add(RGWUserAdminOpState& op_state, std::string *err_msg, b return ret; } - ret = execute_add(op_state, &subprocess_msg, defer_user_update); + ret = execute_add(op_state, &subprocess_msg, defer_user_update, y); if (ret < 0) { set_err_msg(err_msg, "unable to add access key, " + subprocess_msg); return ret; @@ -835,7 +845,10 @@ int RGWAccessKeyPool::add(RGWUserAdminOpState& op_state, std::string *err_msg, b return 0; } -int RGWAccessKeyPool::execute_remove(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_user_update) +int RGWAccessKeyPool::execute_remove(RGWUserAdminOpState& op_state, + std::string *err_msg, + bool defer_user_update, + optional_yield y) { int ret = 0; @@ -868,7 +881,7 @@ int RGWAccessKeyPool::execute_remove(RGWUserAdminOpState& op_state, std::string keys_map->erase(kiter); if (!defer_user_update) - ret = user->update(op_state, err_msg); + ret = user->update(op_state, err_msg, y); if (ret < 0) return ret; @@ -876,12 +889,15 @@ int RGWAccessKeyPool::execute_remove(RGWUserAdminOpState& op_state, std::string return 0; } -int RGWAccessKeyPool::remove(RGWUserAdminOpState& op_state, std::string *err_msg) +int RGWAccessKeyPool::remove(RGWUserAdminOpState& op_state, optional_yield y, + std::string *err_msg) { - return remove(op_state, err_msg, false); + return remove(op_state, err_msg, false, y); } -int RGWAccessKeyPool::remove(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_user_update) +int RGWAccessKeyPool::remove(RGWUserAdminOpState& op_state, + std::string *err_msg, bool defer_user_update, + optional_yield y) { int ret; @@ -893,7 +909,7 @@ int RGWAccessKeyPool::remove(RGWUserAdminOpState& op_state, std::string *err_msg return ret; } - ret = execute_remove(op_state, &subprocess_msg, defer_user_update); + ret = execute_remove(op_state, &subprocess_msg, defer_user_update, y); if (ret < 0) { set_err_msg(err_msg, "unable to remove access key, " + subprocess_msg); return ret; @@ -904,7 +920,9 @@ int RGWAccessKeyPool::remove(RGWUserAdminOpState& op_state, std::string *err_msg // remove all keys associated with a subuser int RGWAccessKeyPool::remove_subuser_keys(RGWUserAdminOpState& op_state, - std::string *err_msg, bool defer_user_update) + std::string *err_msg, + bool defer_user_update, + optional_yield y) { int ret = 0; @@ -949,7 +967,7 @@ int RGWAccessKeyPool::remove_subuser_keys(RGWUserAdminOpState& op_state, } if (!defer_user_update) - ret = user->update(op_state, err_msg); + ret = user->update(op_state, err_msg, y); if (ret < 0) return ret; @@ -1050,7 +1068,8 @@ int RGWSubUserPool::check_op(RGWUserAdminOpState& op_state, } int RGWSubUserPool::execute_add(RGWUserAdminOpState& op_state, - std::string *err_msg, bool defer_user_update) + std::string *err_msg, bool defer_user_update, + optional_yield y) { int ret = 0; std::string subprocess_msg; @@ -1063,7 +1082,7 @@ int RGWSubUserPool::execute_add(RGWUserAdminOpState& op_state, // assumes key should be created if (op_state.has_key_op()) { - ret = user->keys.add(op_state, &subprocess_msg, true); + ret = user->keys.add(op_state, &subprocess_msg, true, y); if (ret < 0) { set_err_msg(err_msg, "unable to create subuser key, " + subprocess_msg); return ret; @@ -1082,7 +1101,7 @@ int RGWSubUserPool::execute_add(RGWUserAdminOpState& op_state, // attempt to save the subuser if (!defer_user_update) - ret = user->update(op_state, err_msg); + ret = user->update(op_state, err_msg, y); if (ret < 0) return ret; @@ -1090,12 +1109,13 @@ int RGWSubUserPool::execute_add(RGWUserAdminOpState& op_state, return 0; } -int RGWSubUserPool::add(RGWUserAdminOpState& op_state, std::string *err_msg) +int RGWSubUserPool::add(RGWUserAdminOpState& op_state, optional_yield y, + std::string *err_msg) { - return add(op_state, err_msg, false); + return add(op_state, err_msg, false, y); } -int RGWSubUserPool::add(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_user_update) +int RGWSubUserPool::add(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_user_update, optional_yield y) { std::string subprocess_msg; int ret; @@ -1110,12 +1130,12 @@ int RGWSubUserPool::add(RGWUserAdminOpState& op_state, std::string *err_msg, boo if (key_type == KEY_TYPE_S3 && op_state.get_access_key().empty()) { op_state.set_gen_access(); } - + if (op_state.get_secret_key().empty()) { op_state.set_gen_secret(); } - ret = execute_add(op_state, &subprocess_msg, defer_user_update); + ret = execute_add(op_state, &subprocess_msg, defer_user_update, y); if (ret < 0) { set_err_msg(err_msg, "unable to create subuser, " + subprocess_msg); return ret; @@ -1125,7 +1145,8 @@ int RGWSubUserPool::add(RGWUserAdminOpState& op_state, std::string *err_msg, boo } int RGWSubUserPool::execute_remove(RGWUserAdminOpState& op_state, - std::string *err_msg, bool defer_user_update) + std::string *err_msg, bool defer_user_update, + optional_yield y) { int ret = 0; std::string subprocess_msg; @@ -1144,14 +1165,14 @@ int RGWSubUserPool::execute_remove(RGWUserAdminOpState& op_state, } // always purge all associate keys - user->keys.remove_subuser_keys(op_state, &subprocess_msg, true); + user->keys.remove_subuser_keys(op_state, &subprocess_msg, true, y); // remove the subuser from the user info subuser_map->erase(siter); // attempt to save the subuser if (!defer_user_update) - ret = user->update(op_state, err_msg); + ret = user->update(op_state, err_msg, y); if (ret < 0) return ret; @@ -1159,12 +1180,14 @@ int RGWSubUserPool::execute_remove(RGWUserAdminOpState& op_state, return 0; } -int RGWSubUserPool::remove(RGWUserAdminOpState& op_state, std::string *err_msg) +int RGWSubUserPool::remove(RGWUserAdminOpState& op_state, optional_yield y, + std::string *err_msg) { - return remove(op_state, err_msg, false); + return remove(op_state, err_msg, false, y); } -int RGWSubUserPool::remove(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_user_update) +int RGWSubUserPool::remove(RGWUserAdminOpState& op_state, std::string *err_msg, + bool defer_user_update, optional_yield y) { std::string subprocess_msg; int ret; @@ -1175,7 +1198,7 @@ int RGWSubUserPool::remove(RGWUserAdminOpState& op_state, std::string *err_msg, return ret; } - ret = execute_remove(op_state, &subprocess_msg, defer_user_update); + ret = execute_remove(op_state, &subprocess_msg, defer_user_update, y); if (ret < 0) { set_err_msg(err_msg, "unable to remove subuser, " + subprocess_msg); return ret; @@ -1205,7 +1228,7 @@ int RGWSubUserPool::execute_modify(RGWUserAdminOpState& op_state, std::string *e subuser = siter->second; if (op_state.has_key_op()) { - ret = user->keys.add(op_state, &subprocess_msg, true); + ret = user->keys.add(op_state, &subprocess_msg, true, y); if (ret < 0) { set_err_msg(err_msg, "unable to create subuser keys, " + subprocess_msg); return ret; @@ -1222,7 +1245,7 @@ int RGWSubUserPool::execute_modify(RGWUserAdminOpState& op_state, std::string *e // attempt to save the subuser if (!defer_user_update) - ret = user->update(op_state, err_msg); + ret = user->update(op_state, err_msg, y); if (ret < 0) return ret; @@ -1290,12 +1313,14 @@ int RGWUserCapPool::init(RGWUserAdminOpState& op_state) return 0; } -int RGWUserCapPool::add(RGWUserAdminOpState& op_state, std::string *err_msg) +int RGWUserCapPool::add(RGWUserAdminOpState& op_state, optional_yield y, + std::string *err_msg) { - return add(op_state, err_msg, false); + return add(op_state, err_msg, false, y); } -int RGWUserCapPool::add(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save) +int RGWUserCapPool::add(RGWUserAdminOpState& op_state, std::string *err_msg, + bool defer_save, optional_yield y) { int ret = 0; std::string caps_str = op_state.get_caps(); @@ -1322,7 +1347,7 @@ int RGWUserCapPool::add(RGWUserAdminOpState& op_state, std::string *err_msg, boo } if (!defer_save) - ret = user->update(op_state, err_msg); + ret = user->update(op_state, err_msg, y); if (ret < 0) return ret; @@ -1330,12 +1355,14 @@ int RGWUserCapPool::add(RGWUserAdminOpState& op_state, std::string *err_msg, boo return 0; } -int RGWUserCapPool::remove(RGWUserAdminOpState& op_state, std::string *err_msg) +int RGWUserCapPool::remove(RGWUserAdminOpState& op_state, optional_yield y, + std::string *err_msg) { - return remove(op_state, err_msg, false); + return remove(op_state, err_msg, false, y); } -int RGWUserCapPool::remove(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save) +int RGWUserCapPool::remove(RGWUserAdminOpState& op_state, std::string *err_msg, + bool defer_save, optional_yield y) { int ret = 0; @@ -1363,7 +1390,7 @@ int RGWUserCapPool::remove(RGWUserAdminOpState& op_state, std::string *err_msg, } if (!defer_save) - ret = user->update(op_state, err_msg); + ret = user->update(op_state, err_msg, y); if (ret < 0) return ret; @@ -1376,14 +1403,15 @@ RGWUser::RGWUser() : caps(this), keys(this), subusers(this) init_default(); } -int RGWUser::init(rgw::sal::RGWRadosStore *storage, RGWUserAdminOpState& op_state) +int RGWUser::init(rgw::sal::RGWRadosStore *storage, + RGWUserAdminOpState& op_state, optional_yield y) { init_default(); int ret = init_storage(storage); if (ret < 0) return ret; - ret = init(op_state); + ret = init(op_state, y); if (ret < 0) return ret; @@ -1418,7 +1446,7 @@ int RGWUser::init_storage(rgw::sal::RGWRadosStore *storage) return 0; } -int RGWUser::init(RGWUserAdminOpState& op_state) +int RGWUser::init(RGWUserAdminOpState& op_state, optional_yield y) { bool found = false; std::string swift_user; @@ -1446,21 +1474,21 @@ int RGWUser::init(RGWUserAdminOpState& op_state) } if (!user_id.empty() && (user_id.compare(RGW_USER_ANON_ID) != 0)) { - found = (rgw_get_user_info_by_uid(user_ctl, user_id, user_info, &op_state.objv) >= 0); + found = (rgw_get_user_info_by_uid(user_ctl, user_id, user_info, y, &op_state.objv) >= 0); op_state.found_by_uid = found; } if (store->ctx()->_conf.get_val("rgw_user_unique_email")) { if (!user_email.empty() && !found) { - found = (rgw_get_user_info_by_email(user_ctl, user_email, user_info, &op_state.objv) >= 0); + found = (rgw_get_user_info_by_email(user_ctl, user_email, user_info, y, &op_state.objv) >= 0); op_state.found_by_email = found; } } if (!swift_user.empty() && !found) { - found = (rgw_get_user_info_by_swift(user_ctl, swift_user, user_info, &op_state.objv) >= 0); + found = (rgw_get_user_info_by_swift(user_ctl, swift_user, user_info, y, &op_state.objv) >= 0); op_state.found_by_key = found; } if (!access_key.empty() && !found) { - found = (rgw_get_user_info_by_access_key(user_ctl, access_key, user_info, &op_state.objv) >= 0); + found = (rgw_get_user_info_by_access_key(user_ctl, access_key, user_info, y, &op_state.objv) >= 0); op_state.found_by_key = found; } @@ -1505,7 +1533,8 @@ int RGWUser::init_members(RGWUserAdminOpState& op_state) return 0; } -int RGWUser::update(RGWUserAdminOpState& op_state, std::string *err_msg) +int RGWUser::update(RGWUserAdminOpState& op_state, std::string *err_msg, + optional_yield y) { int ret; std::string subprocess_msg; @@ -1518,7 +1547,8 @@ int RGWUser::update(RGWUserAdminOpState& op_state, std::string *err_msg) RGWUserInfo *pold_info = (is_populated() ? &old_info : nullptr); - ret = rgw_store_user_info(user_ctl, user_info, pold_info, &op_state.objv, real_time(), false); + ret = rgw_store_user_info(user_ctl, user_info, pold_info, &op_state.objv, + real_time(), false, y); if (ret < 0) { set_err_msg(err_msg, "unable to store user info"); return ret; @@ -1595,7 +1625,7 @@ int RGWUser::execute_rename(RGWUserAdminOpState& op_state, std::string *err_msg, } if (!populated) { - ret = init(op_state); + ret = init(op_state, y); if (ret < 0) { set_err_msg(err_msg, "unable to retrieve user info"); return ret; @@ -1617,7 +1647,7 @@ int RGWUser::execute_rename(RGWUserAdminOpState& op_state, std::string *err_msg, RGWObjVersionTracker objv; const bool exclusive = !op_state.get_overwrite_new_user(); // overwrite if requested - ret = user_ctl->store_info(stub_user_info, null_yield, + ret = user_ctl->store_info(stub_user_info, y, RGWUserCtl::PutParams() .set_objv_tracker(&objv) .set_exclusive(exclusive)); @@ -1652,25 +1682,25 @@ int RGWUser::execute_rename(RGWUserAdminOpState& op_state, std::string *err_msg, auto& bucket = it->second; marker = it->first; - ret = bucket->get_bucket_info(null_yield); + ret = bucket->get_bucket_info(y); if (ret < 0) { set_err_msg(err_msg, "failed to fetch bucket info for bucket=" + bucket->get_name()); return ret; } - ret = bucket->set_acl(policy_instance, null_yield); + ret = bucket->set_acl(policy_instance, y); if (ret < 0) { set_err_msg(err_msg, "failed to set acl on bucket " + bucket->get_name()); return ret; } - ret = bucket->link(&new_user, null_yield); + ret = bucket->link(&new_user, y); if (ret < 0) { set_err_msg(err_msg, "failed to link bucket " + bucket->get_name()); return ret; } - ret = bucket->chown(&new_user, &old_user, null_yield); + ret = bucket->chown(&new_user, &old_user, y); if (ret < 0) { set_err_msg(err_msg, "failed to run bucket chown" + cpp_strerror(-ret)); return ret; @@ -1687,10 +1717,11 @@ int RGWUser::execute_rename(RGWUserAdminOpState& op_state, std::string *err_msg, rename_swift_keys(new_user.get_user(), user_info.swift_keys); - return update(op_state, err_msg); + return update(op_state, err_msg, y); } -int RGWUser::execute_add(RGWUserAdminOpState& op_state, std::string *err_msg) +int RGWUser::execute_add(RGWUserAdminOpState& op_state, std::string *err_msg, + optional_yield y) { std::string subprocess_msg; int ret = 0; @@ -1796,7 +1827,7 @@ int RGWUser::execute_add(RGWUserAdminOpState& op_state, std::string *err_msg) // see if we need to add an access key if (op_state.has_key_op()) { - ret = keys.add(op_state, &subprocess_msg, defer_user_update); + ret = keys.add(op_state, &subprocess_msg, defer_user_update, y); if (ret < 0) { set_err_msg(err_msg, "unable to create access key, " + subprocess_msg); return ret; @@ -1805,14 +1836,14 @@ int RGWUser::execute_add(RGWUserAdminOpState& op_state, std::string *err_msg) // see if we need to add some caps if (op_state.has_caps_op()) { - ret = caps.add(op_state, &subprocess_msg, defer_user_update); + ret = caps.add(op_state, &subprocess_msg, defer_user_update, y); if (ret < 0) { set_err_msg(err_msg, "unable to add user capabilities, " + subprocess_msg); return ret; } } - ret = update(op_state, err_msg); + ret = update(op_state, err_msg, y); if (ret < 0) return ret; @@ -1820,7 +1851,7 @@ int RGWUser::execute_add(RGWUserAdminOpState& op_state, std::string *err_msg) } -int RGWUser::add(RGWUserAdminOpState& op_state, std::string *err_msg) +int RGWUser::add(RGWUserAdminOpState& op_state, optional_yield y, std::string *err_msg) { std::string subprocess_msg; int ret; @@ -1831,7 +1862,7 @@ int RGWUser::add(RGWUserAdminOpState& op_state, std::string *err_msg) return ret; } - ret = execute_add(op_state, &subprocess_msg); + ret = execute_add(op_state, &subprocess_msg, y); if (ret < 0) { set_err_msg(err_msg, "unable to create user, " + subprocess_msg); return ret; @@ -1956,7 +1987,7 @@ int RGWUser::execute_modify(RGWUserAdminOpState& op_state, std::string *err_msg, // if the user hasn't already been populated...attempt to if (!populated) { - ret = init(op_state); + ret = init(op_state, y); if (ret < 0) { set_err_msg(err_msg, "unable to retrieve user info"); return ret; @@ -1975,7 +2006,7 @@ int RGWUser::execute_modify(RGWUserAdminOpState& op_state, std::string *err_msg, if (!op_email.empty()) { // make sure we are not adding a duplicate email if (old_email != op_email) { - ret = rgw_get_user_info_by_email(user_ctl, op_email, duplicate_check); + ret = rgw_get_user_info_by_email(user_ctl, op_email, duplicate_check,y ); if (ret >= 0 && duplicate_check.user_id.compare(user_id) != 0) { set_err_msg(err_msg, "cannot add duplicate email"); return -ERR_EMAIL_EXIST; @@ -2075,14 +2106,14 @@ int RGWUser::execute_modify(RGWUserAdminOpState& op_state, std::string *err_msg, // if we're supposed to modify keys, do so if (op_state.has_key_op()) { - ret = keys.add(op_state, &subprocess_msg, true); + ret = keys.add(op_state, &subprocess_msg, true, y); if (ret < 0) { set_err_msg(err_msg, "unable to create or modify keys, " + subprocess_msg); return ret; } } - ret = update(op_state, err_msg); + ret = update(op_state, err_msg, y); if (ret < 0) return ret; @@ -2109,9 +2140,10 @@ int RGWUser::modify(RGWUserAdminOpState& op_state, optional_yield y, std::string return 0; } -int RGWUser::info(RGWUserAdminOpState& op_state, RGWUserInfo& fetched_info, std::string *err_msg) +int RGWUser::info(RGWUserAdminOpState& op_state, RGWUserInfo& fetched_info, + optional_yield y, std::string *err_msg) { - int ret = init(op_state); + int ret = init(op_state, y); if (ret < 0) { set_err_msg(err_msg, "unable to fetch user info"); return ret; @@ -2214,7 +2246,7 @@ int RGWUserAdminOp_User::info(rgw::sal::RGWRadosStore *store, RGWUserAdminOpStat RGWUserInfo info; RGWUser user; - int ret = user.init(store, op_state); + int ret = user.init(store, op_state, y); if (ret < 0) return ret; @@ -2255,18 +2287,19 @@ int RGWUserAdminOp_User::info(rgw::sal::RGWRadosStore *store, RGWUserAdminOpStat return 0; } -int RGWUserAdminOp_User::create(rgw::sal::RGWRadosStore *store, RGWUserAdminOpState& op_state, - RGWFormatterFlusher& flusher) +int RGWUserAdminOp_User::create(rgw::sal::RGWRadosStore *store, + RGWUserAdminOpState& op_state, + RGWFormatterFlusher& flusher, optional_yield y) { RGWUserInfo info; RGWUser user; - int ret = user.init(store, op_state); + int ret = user.init(store, op_state, y); if (ret < 0) return ret; Formatter *formatter = flusher.get_formatter(); - ret = user.add(op_state, NULL); + ret = user.add(op_state, y, NULL); if (ret < 0) { if (ret == -EEXIST) ret = -ERR_USER_EXIST; @@ -2287,12 +2320,13 @@ int RGWUserAdminOp_User::create(rgw::sal::RGWRadosStore *store, RGWUserAdminOpSt return 0; } -int RGWUserAdminOp_User::modify(rgw::sal::RGWRadosStore *store, RGWUserAdminOpState& op_state, +int RGWUserAdminOp_User::modify(rgw::sal::RGWRadosStore *store, + RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher, optional_yield y) { RGWUserInfo info; RGWUser user; - int ret = user.init(store, op_state); + int ret = user.init(store, op_state, y); if (ret < 0) return ret; Formatter *formatter = flusher.get_formatter(); @@ -2319,11 +2353,11 @@ int RGWUserAdminOp_User::modify(rgw::sal::RGWRadosStore *store, RGWUserAdminOpSt } int RGWUserAdminOp_User::remove(rgw::sal::RGWRadosStore *store, RGWUserAdminOpState& op_state, - RGWFormatterFlusher& flusher, optional_yield y) + RGWFormatterFlusher& flusher, optional_yield y) { RGWUserInfo info; RGWUser user; - int ret = user.init(store, op_state); + int ret = user.init(store, op_state, y); if (ret < 0) return ret; @@ -2335,12 +2369,14 @@ int RGWUserAdminOp_User::remove(rgw::sal::RGWRadosStore *store, RGWUserAdminOpSt return ret; } -int RGWUserAdminOp_Subuser::create(rgw::sal::RGWRadosStore *store, RGWUserAdminOpState& op_state, - RGWFormatterFlusher& flusher) +int RGWUserAdminOp_Subuser::create(rgw::sal::RGWRadosStore *store, + RGWUserAdminOpState& op_state, + RGWFormatterFlusher& flusher, + optional_yield y) { RGWUserInfo info; RGWUser user; - int ret = user.init(store, op_state); + int ret = user.init(store, op_state, y); if (ret < 0) return ret; @@ -2349,7 +2385,7 @@ int RGWUserAdminOp_Subuser::create(rgw::sal::RGWRadosStore *store, RGWUserAdminO Formatter *formatter = flusher.get_formatter(); - ret = user.subusers.add(op_state, NULL); + ret = user.subusers.add(op_state, y, NULL); if (ret < 0) return ret; @@ -2372,7 +2408,7 @@ int RGWUserAdminOp_Subuser::modify(rgw::sal::RGWRadosStore *store, RGWUserAdminO { RGWUserInfo info; RGWUser user; - int ret = user.init(store, op_state); + int ret = user.init(store, op_state, y); if (ret < 0) return ret; @@ -2399,12 +2435,14 @@ int RGWUserAdminOp_Subuser::modify(rgw::sal::RGWRadosStore *store, RGWUserAdminO return 0; } -int RGWUserAdminOp_Subuser::remove(rgw::sal::RGWRadosStore *store, RGWUserAdminOpState& op_state, - RGWFormatterFlusher& flusher) +int RGWUserAdminOp_Subuser::remove(rgw::sal::RGWRadosStore *store, + RGWUserAdminOpState& op_state, + RGWFormatterFlusher& flusher, + optional_yield y) { RGWUserInfo info; RGWUser user; - int ret = user.init(store, op_state); + int ret = user.init(store, op_state, y); if (ret < 0) return ret; @@ -2412,7 +2450,7 @@ int RGWUserAdminOp_Subuser::remove(rgw::sal::RGWRadosStore *store, RGWUserAdminO if (!op_state.has_existing_user()) return -ERR_NO_SUCH_USER; - ret = user.subusers.remove(op_state, NULL); + ret = user.subusers.remove(op_state, y, NULL); if (ret < 0) return ret; @@ -2420,11 +2458,12 @@ int RGWUserAdminOp_Subuser::remove(rgw::sal::RGWRadosStore *store, RGWUserAdminO } int RGWUserAdminOp_Key::create(rgw::sal::RGWRadosStore *store, RGWUserAdminOpState& op_state, - RGWFormatterFlusher& flusher) + RGWFormatterFlusher& flusher, + optional_yield y) { RGWUserInfo info; RGWUser user; - int ret = user.init(store, op_state); + int ret = user.init(store, op_state, y); if (ret < 0) return ret; @@ -2433,7 +2472,7 @@ int RGWUserAdminOp_Key::create(rgw::sal::RGWRadosStore *store, RGWUserAdminOpSta Formatter *formatter = flusher.get_formatter(); - ret = user.keys.add(op_state, NULL); + ret = user.keys.add(op_state, y, NULL); if (ret < 0) return ret; @@ -2458,12 +2497,14 @@ int RGWUserAdminOp_Key::create(rgw::sal::RGWRadosStore *store, RGWUserAdminOpSta return 0; } -int RGWUserAdminOp_Key::remove(rgw::sal::RGWRadosStore *store, RGWUserAdminOpState& op_state, - RGWFormatterFlusher& flusher) +int RGWUserAdminOp_Key::remove(rgw::sal::RGWRadosStore *store, + RGWUserAdminOpState& op_state, + RGWFormatterFlusher& flusher, + optional_yield y) { RGWUserInfo info; RGWUser user; - int ret = user.init(store, op_state); + int ret = user.init(store, op_state, y); if (ret < 0) return ret; @@ -2471,19 +2512,20 @@ int RGWUserAdminOp_Key::remove(rgw::sal::RGWRadosStore *store, RGWUserAdminOpSta return -ERR_NO_SUCH_USER; - ret = user.keys.remove(op_state, NULL); + ret = user.keys.remove(op_state, y, NULL); if (ret < 0) return ret; return 0; } -int RGWUserAdminOp_Caps::add(rgw::sal::RGWRadosStore *store, RGWUserAdminOpState& op_state, - RGWFormatterFlusher& flusher) +int RGWUserAdminOp_Caps::add(rgw::sal::RGWRadosStore *store, + RGWUserAdminOpState& op_state, + RGWFormatterFlusher& flusher, optional_yield y) { RGWUserInfo info; RGWUser user; - int ret = user.init(store, op_state); + int ret = user.init(store, op_state, y); if (ret < 0) return ret; @@ -2492,7 +2534,7 @@ int RGWUserAdminOp_Caps::add(rgw::sal::RGWRadosStore *store, RGWUserAdminOpState Formatter *formatter = flusher.get_formatter(); - ret = user.caps.add(op_state, NULL); + ret = user.caps.add(op_state, y, NULL); if (ret < 0) return ret; @@ -2511,12 +2553,13 @@ int RGWUserAdminOp_Caps::add(rgw::sal::RGWRadosStore *store, RGWUserAdminOpState } -int RGWUserAdminOp_Caps::remove(rgw::sal::RGWRadosStore *store, RGWUserAdminOpState& op_state, - RGWFormatterFlusher& flusher) +int RGWUserAdminOp_Caps::remove(rgw::sal::RGWRadosStore *store, + RGWUserAdminOpState& op_state, + RGWFormatterFlusher& flusher, optional_yield y) { RGWUserInfo info; RGWUser user; - int ret = user.init(store, op_state); + int ret = user.init(store, op_state, y); if (ret < 0) return ret; @@ -2525,7 +2568,7 @@ int RGWUserAdminOp_Caps::remove(rgw::sal::RGWRadosStore *store, RGWUserAdminOpSt Formatter *formatter = flusher.get_formatter(); - ret = user.caps.remove(op_state, NULL); + ret = user.caps.remove(op_state, y, NULL); if (ret < 0) return ret; @@ -2841,7 +2884,7 @@ int RGWUserCtl::list_buckets(const rgw_user& user, } if (need_stats) { map& m = buckets->get_buckets(); - ret = ctl.bucket->read_buckets_stats(m, null_yield); + ret = ctl.bucket->read_buckets_stats(m, y); if (ret < 0 && ret != -ENOENT) { ldout(svc.user->ctx(), 0) << "ERROR: could not get stats for buckets" << dendl; return ret; diff --git a/src/rgw/rgw_user.h b/src/rgw/rgw_user.h index c038ea873b57c..5063ea3fccbb2 100644 --- a/src/rgw/rgw_user.h +++ b/src/rgw/rgw_user.h @@ -77,6 +77,7 @@ extern int rgw_store_user_info(RGWUserCtl *user_ctl, RGWObjVersionTracker *objv_tracker, real_time mtime, bool exclusive, + optional_yield y, map *pattrs = nullptr); /** @@ -86,6 +87,7 @@ extern int rgw_store_user_info(RGWUserCtl *user_ctl, extern int rgw_get_user_info_by_uid(RGWUserCtl *user_ctl, const rgw_user& user_id, RGWUserInfo& info, + optional_yield y, RGWObjVersionTracker *objv_tracker = nullptr, real_time *pmtime = nullptr, rgw_cache_entry_info *cache_info = nullptr, @@ -96,6 +98,7 @@ extern int rgw_get_user_info_by_uid(RGWUserCtl *user_ctl, */ extern int rgw_get_user_info_by_email(RGWUserCtl *user_ctl, string& email, RGWUserInfo& info, + optional_yield y, RGWObjVersionTracker *objv_tracker = NULL, real_time *pmtime = nullptr); /** @@ -105,6 +108,7 @@ extern int rgw_get_user_info_by_email(RGWUserCtl *user_ctl, extern int rgw_get_user_info_by_swift(RGWUserCtl *user_ctl, const string& swift_name, RGWUserInfo& info, /* out */ + optional_yield y, RGWObjVersionTracker *objv_tracker = nullptr, real_time *pmtime = nullptr); /** @@ -114,7 +118,8 @@ extern int rgw_get_user_info_by_swift(RGWUserCtl *user_ctl, extern int rgw_get_user_info_by_access_key(RGWUserCtl *user_ctl, const std::string& access_key, RGWUserInfo& info, - RGWObjVersionTracker* objv_tracker = nullptr, + optional_yield y, + RGWObjVersionTracker* objv_tracker = nullptr, real_time* pmtime = nullptr); extern void rgw_perm_to_str(uint32_t mask, char *buf, int len); @@ -584,7 +589,8 @@ class RGWAccessKeyPool private: int create_key(RGWUserAdminOpState& op_state, std::string *err_msg = NULL); - int generate_key(RGWUserAdminOpState& op_state, std::string *err_msg = NULL); + int generate_key(RGWUserAdminOpState& op_state, optional_yield y, + std::string *err_msg = NULL); int modify_key(RGWUserAdminOpState& op_state, std::string *err_msg = NULL); int check_key_owner(RGWUserAdminOpState& op_state); @@ -592,20 +598,27 @@ private: int check_op(RGWUserAdminOpState& op_state, std::string *err_msg = NULL); /* API Contract Fulfilment */ - int execute_add(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save); - int execute_remove(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save); - int remove_subuser_keys(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save); - - int add(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save); - int remove(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save); + int execute_add(RGWUserAdminOpState& op_state, std::string *err_msg, + bool defer_save, optional_yield y); + int execute_remove(RGWUserAdminOpState& op_state, std::string *err_msg, + bool defer_save, optional_yield y); + int remove_subuser_keys(RGWUserAdminOpState& op_state, std::string *err_msg, + bool defer_save, optional_yield y); + + int add(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save, + optional_yield y); + int remove(RGWUserAdminOpState& op_state, std::string *err_msg, + bool defer_save, optional_yield y); public: explicit RGWAccessKeyPool(RGWUser* usr); int init(RGWUserAdminOpState& op_state); /* API Contracted Methods */ - int add(RGWUserAdminOpState& op_state, std::string *err_msg = NULL); - int remove(RGWUserAdminOpState& op_state, std::string *err_msg = NULL); + int add(RGWUserAdminOpState& op_state, optional_yield y, + std::string *err_msg = NULL); + int remove(RGWUserAdminOpState& op_state, optional_yield y, + std::string *err_msg = NULL); friend class RGWUser; friend class RGWSubUserPool; @@ -626,12 +639,13 @@ private: int check_op(RGWUserAdminOpState& op_state, std::string *err_msg = NULL); /* API Contract Fulfillment */ - int execute_add(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save); - int execute_remove(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save); + int execute_add(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save, optional_yield y); + int execute_remove(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save, optional_yield y); int execute_modify(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save, optional_yield y); - int add(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save); - int remove(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save); + int add(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save, + optional_yield y); + int remove(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save, optional_yield y); int modify(RGWUserAdminOpState& op_state, optional_yield y, std::string *err_msg, bool defer_save); public: explicit RGWSubUserPool(RGWUser *user); @@ -640,8 +654,9 @@ public: int init(RGWUserAdminOpState& op_state); /* API contracted methods */ - int add(RGWUserAdminOpState& op_state, std::string *err_msg = NULL); - int remove(RGWUserAdminOpState& op_state, std::string *err_msg = NULL); + int add(RGWUserAdminOpState& op_state, optional_yield y, + std::string *err_msg = NULL); + int remove(RGWUserAdminOpState& op_state, optional_yield y, std::string *err_msg = NULL); int modify(RGWUserAdminOpState& op_state, optional_yield y, std::string *err_msg = NULL); friend class RGWUser; @@ -654,8 +669,10 @@ class RGWUserCapPool RGWUser *user{nullptr}; private: - int add(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save); - int remove(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save); + int add(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save, + optional_yield y); + int remove(RGWUserAdminOpState& op_state, std::string *err_msg, bool defer_save, + optional_yield y); public: explicit RGWUserCapPool(RGWUser *user); @@ -663,8 +680,9 @@ public: int init(RGWUserAdminOpState& op_state); /* API contracted methods */ - int add(RGWUserAdminOpState& op_state, std::string *err_msg = NULL); - int remove(RGWUserAdminOpState& op_state, std::string *err_msg = NULL); + int add(RGWUserAdminOpState& op_state, optional_yield y, + std::string *err_msg = NULL); + int remove(RGWUserAdminOpState& op_state, optional_yield y, std::string *err_msg = NULL); friend class RGWUser; }; @@ -685,14 +703,15 @@ private: bool is_populated() { return info_stored; } int check_op(RGWUserAdminOpState& req, std::string *err_msg); - int update(RGWUserAdminOpState& op_state, std::string *err_msg); + int update(RGWUserAdminOpState& op_state, std::string *err_msg, optional_yield y); void clear_members(); void init_default(); /* API Contract Fulfillment */ - int execute_add(RGWUserAdminOpState& op_state, std::string *err_msg); - int execute_remove(RGWUserAdminOpState& op_state, + int execute_add(RGWUserAdminOpState& op_state, std::string *err_msg, + optional_yield y); + int execute_remove(RGWUserAdminOpState& op_state, std::string *err_msg, optional_yield y); int execute_modify(RGWUserAdminOpState& op_state, std::string *err_msg, optional_yield y); int execute_rename(RGWUserAdminOpState& op_state, std::string *err_msg, optional_yield y); @@ -700,10 +719,11 @@ private: public: RGWUser(); - int init(rgw::sal::RGWRadosStore *storage, RGWUserAdminOpState& op_state); + int init(rgw::sal::RGWRadosStore *storage, RGWUserAdminOpState& op_state, + optional_yield y); int init_storage(rgw::sal::RGWRadosStore *storage); - int init(RGWUserAdminOpState& op_state); + int init(RGWUserAdminOpState& op_state, optional_yield y); int init_members(RGWUserAdminOpState& op_state); rgw::sal::RGWRadosStore *get_store() { return store; } @@ -715,7 +735,7 @@ public: RGWSubUserPool subusers; /* API Contracted Methods */ - int add(RGWUserAdminOpState& op_state, std::string *err_msg = NULL); + int add(RGWUserAdminOpState& op_state, optional_yield y, std::string *err_msg = NULL); int remove(RGWUserAdminOpState& op_state, optional_yield y, std::string *err_msg = NULL); @@ -727,7 +747,8 @@ public: int modify(RGWUserAdminOpState& op_state, optional_yield y, std::string *err_msg = NULL); /* retrieve info from an existing user in the RGW system */ - int info(RGWUserAdminOpState& op_state, RGWUserInfo& fetched_info, std::string *err_msg = NULL); + int info(RGWUserAdminOpState& op_state, RGWUserInfo& fetched_info, optional_yield y, + std::string *err_msg = NULL); /* info from an already populated RGWUser */ int info (RGWUserInfo& fetched_info, std::string *err_msg = NULL); @@ -753,7 +774,8 @@ public: optional_yield y); static int create(rgw::sal::RGWRadosStore *store, - RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher); + RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher, + optional_yield y); static int modify(rgw::sal::RGWRadosStore *store, RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher, optional_yield y); @@ -766,34 +788,40 @@ class RGWUserAdminOp_Subuser { public: static int create(rgw::sal::RGWRadosStore *store, - RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher); + RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher, + optional_yield y); static int modify(rgw::sal::RGWRadosStore *store, RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher, optional_yield y); static int remove(rgw::sal::RGWRadosStore *store, - RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher); + RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher, + optional_yield y); }; class RGWUserAdminOp_Key { public: static int create(rgw::sal::RGWRadosStore *store, - RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher); + RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher, + optional_yield y); static int remove(rgw::sal::RGWRadosStore *store, - RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher); + RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher, + optional_yield y); }; class RGWUserAdminOp_Caps { public: static int add(rgw::sal::RGWRadosStore *store, - RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher); + RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher, + optional_yield y); static int remove(rgw::sal::RGWRadosStore *store, - RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher); + RGWUserAdminOpState& op_state, RGWFormatterFlusher& flusher, + optional_yield y); }; struct RGWUserCompleteInfo { -- 2.39.5