}
//overwrite current_index for the next reshard process
- const auto prev_index = bucket_info.layout.current_index;
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;
return ret;
}
- // resharding successful, so remove old bucket index shards; use
- // best effort and don't report out an error; the lock isn't needed
- // at this point since all we're using a best effor to to remove old
- // shard objects
-
- ret = store->svc()->bi->clean_index(dpp, bucket_info, prev_index);
- if (ret < 0) {
- ldpp_dout(dpp, -1) << "Error: " << __func__ <<
- " failed to clean up old shards; " <<
- "RGWRados::clean_bucket_index returned " << ret << dendl;
- }
-
return 0;
// NB: some error clean-up is done by ~BucketInfoReshardUpdate
} // RGWBucketReshard::do_reshard
}
}
+ // keep a copy of old index layout
+ prev_index = bucket_info.layout.current_index;
+
ret = do_reshard(num_shards,
max_op_entries,
verbose, out, formatter, dpp);
reshard_lock.unlock();
+ // resharding successful, so remove old bucket index shards; use
+ // best effort and don't report out an error; the lock isn't needed
+ // at this point since all we're using a best effor to to remove old
+ // shard objects
+
+ ret = store->svc()->bi->clean_index(dpp, bucket_info, prev_index);
+ if (ret < 0) {
+ ldpp_dout(dpp, -1) << __func__ << "Error: " << __func__ <<
+ " failed to clean up old shards; " <<
+ "RGWRados::clean_bucket_index returned " << ret << dendl;
+ }
+
ldpp_dout(dpp, 1) << __func__ <<
" INFO: reshard of bucket \"" << bucket_info.bucket.name << "\" completed successfully" << dendl;
"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(), &bucket_attrs, dpp);
+ if (ret < 0) {
+ lderr(store->ctx()) << "ERROR: failed writing bucket instance info: " << dendl;
+ return ret;
+ }
+
+ ret = store->svc()->bi->init_index(dpp, bucket_info, bucket_info.layout.current_index);
+ if (ret < 0) {
+ return ret;
+ }
+
return ret;
} // execute