]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: No null_yield in rgw_user
authorAdam C. Emerson <aemerson@redhat.com>
Wed, 11 Nov 2020 16:25:38 +0000 (11:25 -0500)
committerAdam C. Emerson <aemerson@redhat.com>
Fri, 13 Nov 2020 19:35:15 +0000 (14:35 -0500)
Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
12 files changed:
src/rgw/rgw_admin.cc
src/rgw/rgw_auth_keystone.cc
src/rgw/rgw_auth_keystone.h
src/rgw/rgw_cr_tools.cc
src/rgw/rgw_rest_s3.cc
src/rgw/rgw_rest_s3.h
src/rgw/rgw_rest_sts.cc
src/rgw/rgw_rest_user.cc
src/rgw/rgw_sts.cc
src/rgw/rgw_sts.h
src/rgw/rgw_user.cc
src/rgw/rgw_user.h

index 36445e86aacde4647861fa559d1ec97716791cc7..fd5837bf6526125dd97338478480cd4be148ea0c 100644 (file)
@@ -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;
index c0eeb02fa57a949da7a3cc97d9df7ac16e5752e6..124b50793e4da3b7e63d1f9a8487c0155b5cbe67 100644 (file)
@@ -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. */
index 2152afa87798734d9be898e11e4d88ddfac6e18f..4ad20442b96beb729e25c199461ef9821d2d2a55 100644 (file)
@@ -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<boost::optional<std::string>, int> get_secret_from_keystone(const DoutPrefixProvider* dpp,
                                                                         const std::string& user_id,
                                                                         const std::string_view& access_key_id) const;
index 46aa617c5a44e5171fea2ff9ffe18d4fbcc6b984..74497d5fc05e4495b665c86e27d22d8fc487998d 100644 (file)
@@ -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<>
index 4888d297324a5b9ff0f22302528bfb08afaabc79..4a6660a87e00addd3e3a4177656e5fd631ad97d4 100644 (file)
@@ -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);
index 8657d4c084bca27cd292e1863a5d904ed75d65cb..7f83d26f6903444c3604d5d89ad60aa540d6c9d4 100644 (file)
@@ -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,
index b0de5ddc447bff5cb0243fd42a3c27324b23d900..d980eab26148e3b76c41f177777c6ffe0f26ed64 100644 (file)
@@ -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) {
index 215efcfce1b0ff90ee1e58d7ab2fd58224720ea3..2d3e8e9d82170106771909b2cc35ffee1cc8055a 100644 (file)
@@ -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;
index 3c1b4612fd2f4619072132328f6b0e9355726b85..a6feb2b23c7fced2fcaa7989c89394d100224642 100644 (file)
@@ -310,11 +310,11 @@ std::tuple<int, RGWRole> 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;
   }
index e64a9320d4b5fcfd1478893660f89b8c6ae0ab79..a721bdc9873c1f74ff5646dcd0c141e797d0855f 100644 (file)
@@ -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<int, RGWRole> 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 */
-
index 3a2b70088fb6880e29ca1fc9ec1139ed207b17a0..7e22b4dde5426f696fbc8b5f03a2593c10200086 100644 (file)
@@ -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<string, bufferlist> *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<string, bufferlist> * 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<bool>("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<string, RGWBucketEnt>& 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;
index c038ea873b57cb06bd7c313750b7a4c1d2e15716..5063ea3fccbb2b1da19aa7b5033c7e2bce766e83 100644 (file)
@@ -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<string, bufferlist> *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 {