From cacddbb83d23fe6ba2d42e1497d0ff49fb880154 Mon Sep 17 00:00:00 2001 From: "J. Eric Ivancich" Date: Tue, 30 Nov 2021 14:26:15 -0500 Subject: [PATCH] rgw: "reshard cancel" errors with "invalid argument" When `radosgw-admin reshard cancel ...` was used on a bucket that is not currently undergoing resharding, it would error out. Now it will then try to unschedule any reshards for the bucket in the so-called "reshard log". It will error out if there is neither an underway resharding nor a scheduled resharding. Signed-off-by: J. Eric Ivancich --- src/rgw/rgw_admin.cc | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index d734e4960a8..144dc6793ad 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -7305,6 +7305,8 @@ next: } } + bool resharding_underway = true; + if (bucket_initable) { // we did not encounter an error, so let's work with the bucket RGWBucketReshard br(static_cast(store), bucket->get_info(), bucket->get_attrs(), @@ -7313,14 +7315,17 @@ next: if (ret < 0) { if (ret == -EBUSY) { cerr << "There is ongoing resharding, please retry after " << - store->ctx()->_conf.get_val( - "rgw_reshard_bucket_lock_duration") << - " seconds " << std::endl; + store->ctx()->_conf.get_val("rgw_reshard_bucket_lock_duration") << + " seconds." << std::endl; + return -ret; + } else if (ret == -EINVAL) { + resharding_underway = false; + // we can continue and try to unschedule } else { - cerr << "Error canceling bucket " << bucket_name << - " resharding: " << cpp_strerror(-ret) << std::endl; + cerr << "Error cancelling bucket \"" << bucket_name << + "\" resharding: " << cpp_strerror(-ret) << std::endl; + return -ret; } - return ret; } } @@ -7329,13 +7334,22 @@ next: cls_rgw_reshard_entry entry; entry.tenant = tenant; entry.bucket_name = bucket_name; - //entry.bucket_id = bucket_id; ret = reshard.remove(dpp(), entry); - if (ret < 0 && ret != -ENOENT) { - cerr << "Error in updating reshard log with bucket " << - bucket_name << ": " << cpp_strerror(-ret) << std::endl; - return ret; + if (ret == -ENOENT) { + if (!resharding_underway) { + cerr << "Error, bucket \"" << bucket_name << + "\" is neither undergoing resharding nor scheduled to undergo " + "resharding." << std::endl; + return EINVAL; + } else { + // we cancelled underway resharding above, so we're good + return 0; + } + } else if (ret < 0) { + cerr << "Error in updating reshard log with bucket \"" << + bucket_name << "\": " << cpp_strerror(-ret) << std::endl; + return -ret; } } // OPT_RESHARD_CANCEL -- 2.39.5