RGWBucketInfo& bucket_info,
const DoutPrefixProvider *dpp)
{
- assert(!bucket_info.layout.target_index);
+ bucket_info.layout.target_index = std::nullopt; // to ensure empty target_index in case of an abruptly interrupted reshard process
+ ceph_assert(!bucket_info.layout.target_index);
bucket_info.layout.target_index.emplace();
bucket_info.layout.target_index->layout.normal.num_shards = new_num_shards;
bucket_info.layout.target_index->gen = bucket_info.layout.current_index.gen;
bucket_info.layout.target_index->gen++;
- bucket_info.layout.resharding = rgw::BucketReshardState::InProgress;
-
- int ret = store->getRados()->put_bucket_instance_info(bucket_info, true, real_time(), nullptr, dpp);
- if (ret < 0) {
- cerr << "ERROR: failed to store updated bucket instance info: " << cpp_strerror(-ret) << std::endl;
- return ret;
- }
-
- ret = store->svc()->bi->init_index(bucket_info, *(bucket_info.layout.target_index));
+ int ret = store->svc()->bi->init_index(bucket_info, *(bucket_info.layout.target_index));
if (ret < 0) {
return ret;
}
int RGWBucketReshard::set_target_layout(int new_num_shards, const DoutPrefixProvider *dpp)
{
+ int ret = RGWBucketReshard::set_reshard_status(rgw::BucketReshardState::InProgress, dpp);
+ if (ret < 0) {
+ cerr << "ERROR: failed to store updated bucket instance info: " << cpp_strerror(-ret) << std::endl;
+ return ret;
+ }
return ::set_target_layout(store, new_num_shards, bucket_info, dpp);
}
//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
- bucket_info.layout.resharding = rgw::BucketReshardState::None;
- ret = store->getRados()->put_bucket_instance_info(bucket_info, false, real_time(), nullptr, dpp);
+ ret = RGWBucketReshard::set_reshard_status(rgw::BucketReshardState::None, dpp);
if (ret < 0) {
lderr(store->ctx()) << "ERROR: failed writing bucket instance info: " << dendl;
return ret;
return store->svc()->bi_rados->get_reshard_status(bucket_info, status);
}
+int RGWBucketReshard::set_reshard_status(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) {
+ ldout(store->ctx(), 0) << "ERROR: failed to write bucket info, ret=" << ret << dendl;
+ return ret;
+ }
+ return 0;
+}
int RGWBucketReshard::execute(int num_shards, int max_op_entries,
const DoutPrefixProvider *dpp,
// 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(bucket_info, bucket_info.layout.current_index);
if (ret2 < 0) {
lderr(store->ctx()) << "Error: " << __func__ <<
return ret;
}
- ret = store->svc()->bi->init_index(bucket_info, bucket_info.layout.current_index);
+ ret = RGWBucketReshard::set_reshard_status(rgw::BucketReshardState::None, dpp);
if (ret < 0) {
- return ret;
+ cerr << "ERROR: failed to store updated bucket instance info: " << cpp_strerror(-ret) << std::endl;
+ return ret;
}
return ret;