From 71741cacbae2af2e499e851cd6e2c8e884cc9639 Mon Sep 17 00:00:00 2001 From: Shilpa Jagannath Date: Mon, 21 Sep 2020 13:01:44 +0530 Subject: [PATCH] rgw: Better error handling - function update_bucket() handles updating bucket state Signed-off-by: Shilpa Jagannath --- src/rgw/rgw_reshard.cc | 31 ++++++++++++++----------------- src/rgw/rgw_reshard.h | 2 +- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/rgw/rgw_reshard.cc b/src/rgw/rgw_reshard.cc index 3bd24747394b8..626f4a98b2811 100644 --- a/src/rgw/rgw_reshard.cc +++ b/src/rgw/rgw_reshard.cc @@ -347,7 +347,7 @@ static int set_target_layout(rgw::sal::RadosStore *store, int RGWBucketReshard::set_target_layout(int new_num_shards, const DoutPrefixProvider *dpp) { - int ret = RGWBucketReshard::set_reshard_status(rgw::BucketReshardState::InProgress, dpp); + int ret = update_bucket(rgw::BucketReshardState::InProgress, dpp); if (ret < 0) { lderr(store->ctx()) << "ERROR: failed to store updated bucket instance info: " << dendl; return ret; @@ -660,7 +660,8 @@ int RGWBucketReshard::do_reshard(int num_shards, //overwrite current_index for the next reshard process bucket_info.layout.current_index = *bucket_info.layout.target_index; bucket_info.layout.target_index = std::nullopt; // target_layout doesn't need to exist after reshard - ret = RGWBucketReshard::set_reshard_status(rgw::BucketReshardState::None, dpp); + + ret = update_bucket(rgw::BucketReshardState::None, dpp); if (ret < 0) { ldpp_dout(dpp, -1) << "ERROR: failed writing bucket instance info: " << dendl; return ret; @@ -675,7 +676,7 @@ int RGWBucketReshard::get_status(const DoutPrefixProvider *dpp, listsvc()->bi_rados->get_reshard_status(dpp, bucket_info, status); } -int RGWBucketReshard::set_reshard_status(rgw::BucketReshardState s, const DoutPrefixProvider* dpp) { +int RGWBucketReshard::update_bucket(rgw::BucketReshardState s, const DoutPrefixProvider* dpp) { bucket_info.layout.resharding = s; int ret = store->getRados()->put_bucket_instance_info(bucket_info, false, real_time(), nullptr, dpp); if (ret < 0) { @@ -744,27 +745,23 @@ error_out: reshard_lock.unlock(); - //TODO: Cleanup failed incomplete resharding // since the real problem is the issue that led to this error code // path, we won't touch ret and instead use another variable to // temporarily error codes - int ret2 = store->svc()->bi->clean_index(dpp, bucket_info, bucket_info.layout.current_index); - if (ret2 < 0) { - ldpp_dout(dpp, -1) << "Error: " << __func__ << - " failed to clean up shards from failed incomplete resharding; " << - "RGWRados::clean_bucket_index returned " << ret2 << dendl; - } - // restore old index if reshard fails - bucket_info.layout.current_index = prev_index; - ret = store->getRados()->put_bucket_instance_info(bucket_info, false, real_time(), nullptr, dpp); - if (ret < 0) { - lderr(store->ctx()) << "ERROR: failed writing bucket instance info: " << dendl; - return ret; + if (bucket_info.layout.target_index != std::nullopt) { + int ret2 = store->svc()->bi->clean_index(dpp, bucket_info, *(bucket_info.layout.target_index)); + if (ret2 < 0) { + ldpp_dout(dpp, -1) << "Error: " << __func__ << + " failed to clean up shards from failed incomplete resharding; " << + "RGWRados::clean_bucket_index returned " << ret2 << dendl; + } } + // restore old index + bucket_info.layout.current_index = prev_index; - ret = RGWBucketReshard::set_reshard_status(rgw::BucketReshardState::None, dpp); + ret = update_bucket(rgw::BucketReshardState::None, dpp); if (ret < 0) { lderr(store->ctx()) << "ERROR: failed to store updated bucket instance info: " << dendl; return ret; diff --git a/src/rgw/rgw_reshard.h b/src/rgw/rgw_reshard.h index 29b6b30e6b79e..7a18ddb82b061 100644 --- a/src/rgw/rgw_reshard.h +++ b/src/rgw/rgw_reshard.h @@ -86,7 +86,7 @@ private: static const std::initializer_list reshard_primes; int set_target_layout(int new_num_shards, const DoutPrefixProvider *dpp); - int set_reshard_status(rgw::BucketReshardState s, const DoutPrefixProvider* dpp); + int update_bucket(rgw::BucketReshardState s, const DoutPrefixProvider* dpp); int do_reshard(int num_shards, int max_entries, -- 2.39.5