]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: stop blocking for asio threads for create_bucket() 49769/head
authorAli Maredia <amaredia@redhat.com>
Tue, 17 Jan 2023 20:28:05 +0000 (15:28 -0500)
committerAli Maredia <amaredia@redhat.com>
Tue, 24 Jan 2023 19:04:01 +0000 (14:04 -0500)
Asio thread for create_bucket operation are no
longer blocked because optional yield is passed
down in previous instances where asio threads for
op were blocked.

Signed-off-by: Ali Maredia <amaredia@redhat.com>
src/rgw/driver/rados/rgw_bucket.cc
src/rgw/driver/rados/rgw_cr_rados.cc
src/rgw/driver/rados/rgw_data_sync.cc
src/rgw/driver/rados/rgw_rados.cc
src/rgw/driver/rados/rgw_rados.h
src/rgw/driver/rados/rgw_reshard.cc
src/rgw/driver/rados/rgw_sal_rados.cc
src/rgw/services/svc_user_rados.cc

index e404037bce691d49280b5fbf8587139472b7e0c8..90f5c21c4ef67410e343e286750f63bc780355e8 100644 (file)
@@ -110,7 +110,7 @@ void check_bad_user_bucket_mapping(rgw::sal::Driver* driver, rgw::sal::User& use
       auto& bucket = i->second;
 
       std::unique_ptr<rgw::sal::Bucket> actual_bucket;
-      int r = driver->get_bucket(dpp, &user, user.get_tenant(), bucket->get_name(), &actual_bucket, null_yield);
+      int r = driver->get_bucket(dpp, &user, user.get_tenant(), bucket->get_name(), &actual_bucket, y);
       if (r < 0) {
         ldout(driver->ctx(), 0) << "could not get bucket info for bucket=" << bucket << dendl;
         continue;
@@ -123,7 +123,7 @@ void check_bad_user_bucket_mapping(rgw::sal::Driver* driver, rgw::sal::User& use
         cout << "bucket info mismatch: expected " << actual_bucket << " got " << bucket << std::endl;
         if (fix) {
           cout << "fixing" << std::endl;
-         r = actual_bucket->chown(dpp, user, null_yield);
+         r = actual_bucket->chown(dpp, user, y);
           if (r < 0) {
             cerr << "failed to fix bucket: " << cpp_strerror(-r) << std::endl;
           }
@@ -984,7 +984,7 @@ int RGWBucketAdminOp::limit_check(rgw::sal::Driver* driver,
                                     * as we may now not reach the end of
                                     * the loop body */
 
-       ret = bucket->load_bucket(dpp, null_yield);
+       ret = bucket->load_bucket(dpp, y);
        if (ret < 0)
          continue;
 
@@ -1060,7 +1060,7 @@ int RGWBucketAdminOp::info(rgw::sal::Driver* driver,
   int ret = 0;
   const std::string& bucket_name = op_state.get_bucket_name();
   if (!bucket_name.empty()) {
-    ret = bucket.init(driver, op_state, null_yield, dpp);
+    ret = bucket.init(driver, op_state, y, dpp);
     if (-ENOENT == ret)
       return -ERR_NO_SUCH_BUCKET;
     else if (ret < 0)
@@ -2770,7 +2770,7 @@ int RGWBucketCtl::sync_user_stats(const DoutPrefixProvider *dpp,
   if (!pent) {
     pent = &ent;
   }
-  int r = svc.bi->read_stats(dpp, bucket_info, pent, null_yield);
+  int r = svc.bi->read_stats(dpp, bucket_info, pent, y);
   if (r < 0) {
     ldpp_dout(dpp, 20) << __func__ << "(): failed to read bucket stats (r=" << r << ")" << dendl;
     return r;
index 7d9f3957dcbcd14b8d29165236aee0d7f8d298b8..aac0b76e1e684550ccffe72e12d36f6933d76115 100644 (file)
@@ -675,7 +675,7 @@ int RGWAsyncGetBucketInstanceInfo::_send_request(const DoutPrefixProvider *dpp)
 int RGWAsyncPutBucketInstanceInfo::_send_request(const DoutPrefixProvider *dpp)
 {
   auto r = store->getRados()->put_bucket_instance_info(bucket_info, exclusive,
-                                                      mtime, attrs, dpp);
+                                                      mtime, attrs, dpp, null_yield);
   if (r < 0) {
     ldpp_dout(dpp, 0) << "ERROR: failed to put bucket instance info for "
                      << bucket_info.bucket << dendl;
index 2ecfffa0e3865e269f4d86bab68c365032c30160..cae231965a30aeeab196e48bcedfe07ee807c8e3 100644 (file)
@@ -3011,7 +3011,7 @@ RGWCoroutine *RGWArchiveDataSyncModule::sync_object(const DoutPrefixProvider *dp
      (sync_pipe.dest_bucket_info.flags & BUCKET_VERSIONS_SUSPENDED)) {
       ldout(sc->cct, 0) << "SYNC_ARCHIVE: sync_object: enabling object versioning for archive bucket" << dendl;
       sync_pipe.dest_bucket_info.flags = (sync_pipe.dest_bucket_info.flags & ~BUCKET_VERSIONS_SUSPENDED) | BUCKET_VERSIONED;
-      int op_ret = sync_env->driver->getRados()->put_bucket_instance_info(sync_pipe.dest_bucket_info, false, real_time(), NULL, sync_env->dpp);
+      int op_ret = sync_env->driver->getRados()->put_bucket_instance_info(sync_pipe.dest_bucket_info, false, real_time(), NULL, sync_env->dpp, null_yield);
       if (op_ret < 0) {
          ldpp_dout(sync_env->dpp, 0) << "SYNC_ARCHIVE: sync_object: error versioning archive bucket" << dendl;
          return NULL;
index 6779e519c466db41c6d30903be997f6272c45de1..d7c36eeadbcca85ab5f6a2a59964b5de06c2e1d6 100644 (file)
@@ -2300,7 +2300,7 @@ int RGWRados::create_bucket(const RGWUserInfo& owner, rgw_bucket& bucket,
       return r;
     }
 
-    ret = put_linked_bucket_info(info, exclusive, ceph::real_time(), pep_objv, &attrs, true, dpp);
+    ret = put_linked_bucket_info(info, exclusive, ceph::real_time(), pep_objv, &attrs, true, dpp, y);
     if (ret == -ECANCELED) {
       ret = -EEXIST;
     }
@@ -4814,7 +4814,7 @@ int RGWRados::set_bucket_owner(rgw_bucket& bucket, ACLOwner& owner, const DoutPr
 
   info.owner = owner.get_id();
 
-  r = put_bucket_instance_info(info, false, real_time(), &attrs, dpp);
+  r = put_bucket_instance_info(info, false, real_time(), &attrs, dpp, null_yield);
   if (r < 0) {
     ldpp_dout(dpp, 0) << "NOTICE: put_bucket_info on bucket=" << bucket.name << " returned err=" << r << dendl;
     return r;
@@ -4852,7 +4852,7 @@ int RGWRados::set_buckets_enabled(vector<rgw_bucket>& buckets, bool enabled, con
       info.flags |= BUCKET_SUSPENDED;
     }
 
-    r = put_bucket_instance_info(info, false, real_time(), &attrs, dpp);
+    r = put_bucket_instance_info(info, false, real_time(), &attrs, dpp, null_yield);
     if (r < 0) {
       ldpp_dout(dpp, 0) << "NOTICE: put_bucket_info on bucket=" << bucket.name << " returned err=" << r << ", skipping bucket" << dendl;
       ret = r;
@@ -7950,9 +7950,9 @@ int RGWRados::try_refresh_bucket_info(RGWBucketInfo& info,
 
 int RGWRados::put_bucket_instance_info(RGWBucketInfo& info, bool exclusive,
                               real_time mtime, map<string, bufferlist> *pattrs,
-                              const DoutPrefixProvider *dpp)
+                              const DoutPrefixProvider *dpp, optional_yield y)
 {
-  return ctl.bucket->store_bucket_instance_info(info.bucket, info, null_yield, dpp,
+  return ctl.bucket->store_bucket_instance_info(info.bucket, info, y, dpp,
                                                RGWBucketCtl::BucketInstance::PutParams()
                                                .set_exclusive(exclusive)
                                                .set_mtime(mtime)
@@ -7961,11 +7961,11 @@ int RGWRados::put_bucket_instance_info(RGWBucketInfo& info, bool exclusive,
 
 int RGWRados::put_linked_bucket_info(RGWBucketInfo& info, bool exclusive, real_time mtime, obj_version *pep_objv,
                                      map<string, bufferlist> *pattrs, bool create_entry_point,
-                                     const DoutPrefixProvider *dpp)
+                                     const DoutPrefixProvider *dpp, optional_yield y)
 {
   bool create_head = !info.has_instance_obj || create_entry_point;
 
-  int ret = put_bucket_instance_info(info, exclusive, mtime, pattrs, dpp);
+  int ret = put_bucket_instance_info(info, exclusive, mtime, pattrs, dpp, y);
   if (ret < 0) {
     return ret;
   }
@@ -7987,7 +7987,7 @@ int RGWRados::put_linked_bucket_info(RGWBucketInfo& info, bool exclusive, real_t
       *pep_objv = ot.write_version;
     }
   }
-  ret = ctl.bucket->store_bucket_entrypoint_info(info.bucket, entry_point, null_yield, dpp, RGWBucketCtl::Bucket::PutParams()
+  ret = ctl.bucket->store_bucket_entrypoint_info(info.bucket, entry_point, y, dpp, RGWBucketCtl::Bucket::PutParams()
                                                                          .set_exclusive(exclusive)
                                                                          .set_objv_tracker(&ot)
                                                                          .set_mtime(mtime));
index eb161d72bce4ec7a2923a9804a2ad44851f4b54f..f73b1088eba9478479fb88a322dda1dcf354e63a 100644 (file)
@@ -1356,7 +1356,7 @@ public:
       std::map<RGWObjCategory, RGWStorageStats>& stats, std::string *max_marker, bool* syncstopped = NULL);
   int get_bucket_stats_async(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info, const rgw::bucket_index_layout_generation& idx_layout, int shard_id, RGWGetBucketStats_CB *cb);
 
-  int put_bucket_instance_info(RGWBucketInfo& info, bool exclusive, ceph::real_time mtime, std::map<std::string, bufferlist> *pattrs, const DoutPrefixProvider *dpp);
+  int put_bucket_instance_info(RGWBucketInfo& info, bool exclusive, ceph::real_time mtime, std::map<std::string, bufferlist> *pattrs, const DoutPrefixProvider *dpp, optional_yield y);
   /* xxx dang obj_ctx -> svc */
   int get_bucket_instance_info(const std::string& meta_key, RGWBucketInfo& info, ceph::real_time *pmtime, std::map<std::string, bufferlist> *pattrs, optional_yield y, const DoutPrefixProvider *dpp);
   int get_bucket_instance_info(const rgw_bucket& bucket, RGWBucketInfo& info, ceph::real_time *pmtime, std::map<std::string, bufferlist> *pattrs, optional_yield y, const DoutPrefixProvider *dpp);
@@ -1380,7 +1380,7 @@ public:
 
   int put_linked_bucket_info(RGWBucketInfo& info, bool exclusive, ceph::real_time mtime, obj_version *pep_objv,
                             std::map<std::string, bufferlist> *pattrs, bool create_entry_point,
-                             const DoutPrefixProvider *dpp);
+                             const DoutPrefixProvider *dpp, optional_yield y);
 
   int cls_obj_prepare_op(const DoutPrefixProvider *dpp, BucketShard& bs, RGWModifyOp op, std::string& tag, rgw_obj& obj, uint16_t bilog_flags, optional_yield y, rgw_zone_set *zones_trace = nullptr);
   int cls_obj_complete_op(BucketShard& bs, const rgw_obj& obj, RGWModifyOp op, std::string& tag, int64_t pool, uint64_t epoch,
index b2dec7af1c86e1645e8092b8d3df837f6cb4a94d..4e38221722d6d322da7c7e577cc680fbe952f24d 100644 (file)
@@ -379,7 +379,7 @@ static int init_target_layout(rgw::sal::RadosStore* store,
     if (ret = fault.check("set_target_layout");
         ret == 0) { // no fault injected, write the bucket instance metadata
       ret = store->getRados()->put_bucket_instance_info(bucket_info, false,
-                                                        real_time(), &bucket_attrs, dpp);
+                                                        real_time(), &bucket_attrs, dpp, null_yield);
     } else if (ret == -ECANCELED) {
       fault.clear(); // clear the fault so a retry can succeed
     }
@@ -452,7 +452,7 @@ static int revert_target_layout(rgw::sal::RadosStore* store,
         ret == 0) { // no fault injected, revert the bucket instance metadata
       ret = store->getRados()->put_bucket_instance_info(bucket_info, false,
                                                         real_time(),
-                                                        &bucket_attrs, dpp);
+                                                        &bucket_attrs, dpp, null_yield);
     } else if (ret == -ECANCELED) {
       fault.clear(); // clear the fault so a retry can succeed
     }
@@ -573,7 +573,7 @@ static int commit_target_layout(rgw::sal::RadosStore* store,
   int ret = fault.check("commit_target_layout");
   if (ret == 0) { // no fault injected, write the bucket instance metadata
     ret = store->getRados()->put_bucket_instance_info(
-        bucket_info, false, real_time(), &bucket_attrs, dpp);
+        bucket_info, false, real_time(), &bucket_attrs, dpp, null_yield);
   } else if (ret == -ECANCELED) {
     fault.clear(); // clear the fault so a retry can succeed
   }
index 548090f23f6476ea9c59fa4aba1c4c70f2ce81f8..53d5d2464009c5a49062bfe84d59ee97d2d1a4b7 100644 (file)
@@ -511,7 +511,7 @@ int RadosBucket::remove_bucket_bypass_gc(int concurrent_max, bool
 
   string bucket_ver, master_ver;
 
-  ret = load_bucket(dpp, null_yield);
+  ret = load_bucket(dpp, y);
   if (ret < 0)
     return ret;
 
@@ -537,7 +537,7 @@ int RadosBucket::remove_bucket_bypass_gc(int concurrent_max, bool
   results.is_truncated = true;
 
   while (results.is_truncated) {
-    ret = list(dpp, params, listing_max_entries, results, null_yield);
+    ret = list(dpp, params, listing_max_entries, results, y);
     if (ret < 0)
       return ret;
 
@@ -589,7 +589,7 @@ int RadosBucket::remove_bucket_bypass_gc(int concurrent_max, bool
           }
         } // for all shadow objs
 
-       ret = head_obj->delete_obj_aio(dpp, astate, handles.get(), keep_index_consistent, null_yield);
+       ret = head_obj->delete_obj_aio(dpp, astate, handles.get(), keep_index_consistent, y);
         if (ret < 0) {
           ldpp_dout(dpp, -1) << "ERROR: delete obj aio failed with " << ret << dendl;
           return ret;
@@ -768,7 +768,7 @@ int RadosBucket::chown(const DoutPrefixProvider* dpp, User& new_user, optional_y
 int RadosBucket::put_info(const DoutPrefixProvider* dpp, bool exclusive, ceph::real_time _mtime)
 {
   mtime = _mtime;
-  return store->getRados()->put_bucket_instance_info(info, exclusive, mtime, &attrs, dpp);
+  return store->getRados()->put_bucket_instance_info(info, exclusive, mtime, &attrs, dpp, null_yield);
 }
 
 /* Make sure to call get_bucket_info() if you need it first */
@@ -1924,7 +1924,7 @@ int RadosObject::transition_to_cloud(Bucket* bucket,
     std::unique_ptr<rgw::sal::Object::ReadOp> read_op(get_read_op());
     read_op->params.lastmod = &read_mtime;
 
-    ret = read_op->prepare(null_yield, dpp);
+    ret = read_op->prepare(y, dpp);
     if (ret < 0) {
       ldpp_dout(dpp, 0) << "ERROR: Updating tier object(" << o.key << ") failed ret=" << ret << dendl;
       return ret;
@@ -1940,7 +1940,7 @@ int RadosObject::transition_to_cloud(Bucket* bucket,
     target_placement.inherit_from(tier_ctx.bucket_info.placement_rule);
     target_placement.storage_class = tier->get_storage_class();
 
-    ret = write_cloud_tier(dpp, null_yield, tier_ctx.o.versioned_epoch,
+    ret = write_cloud_tier(dpp, y, tier_ctx.o.versioned_epoch,
                           tier, tier_ctx.is_multipart_upload,
                           target_placement, tier_ctx.obj);
 
@@ -3438,7 +3438,7 @@ int RadosRole::read_id(const DoutPrefixProvider *dpp, const std::string& role_na
   std::string oid = info.tenant + get_names_oid_prefix() + role_name;
   bufferlist bl;
 
-  int ret = rgw_get_system_obj(sysobj, store->svc()->zone->get_zone_params().roles_pool, oid, bl, nullptr, nullptr, null_yield, dpp);
+  int ret = rgw_get_system_obj(sysobj, store->svc()->zone->get_zone_params().roles_pool, oid, bl, nullptr, nullptr, y, dpp);
   if (ret < 0) {
     return ret;
   }
@@ -3462,7 +3462,7 @@ int RadosRole::read_name(const DoutPrefixProvider *dpp, optional_yield y)
   std::string oid = info.tenant + get_names_oid_prefix() + info.name;
   bufferlist bl;
 
-  int ret = rgw_get_system_obj(sysobj, store->svc()->zone->get_zone_params().roles_pool, oid, bl, nullptr, nullptr, null_yield, dpp);
+  int ret = rgw_get_system_obj(sysobj, store->svc()->zone->get_zone_params().roles_pool, oid, bl, nullptr, nullptr, y, dpp);
   if (ret < 0) {
     ldpp_dout(dpp, 0) << "ERROR: failed reading role name from Role pool: " << info.name <<
       ": " << cpp_strerror(-ret) << dendl;
index 3226e435e51b8a10b635aae3dcc7a70658d2c8cb..c99af935415dde7640e01fe001fbbf37a50b4f02 100644 (file)
@@ -898,7 +898,7 @@ int RGWSI_User_RADOS::read_stats(const DoutPrefixProvider *dpp,
 
   RGWUserInfo info;
   real_time mtime;
-  int ret = read_user_info(ctx, user, &info, nullptr, &mtime, nullptr, nullptr, null_yield, dpp);
+  int ret = read_user_info(ctx, user, &info, nullptr, &mtime, nullptr, nullptr, y, dpp);
   if (ret < 0)
   {
     return ret;