return -EINVAL;
}
- RGWBucketReshard br(static_cast<rgw::sal::RadosStore*>(store), bucket->get_info(), nullptr /* no callback */);
+ RGWBucketReshard br(static_cast<rgw::sal::RadosStore*>(store),
+ bucket->get_info(), bucket->get_attrs(),
+ nullptr /* no callback */);
#define DEFAULT_RESHARD_MAX_ENTRIES 1000
if (max_entries < 1) {
return -ret;
}
- RGWBucketReshard br(static_cast<rgw::sal::RadosStore*>(store), bucket->get_info(), nullptr /* no callback */);
+ RGWBucketReshard br(static_cast<rgw::sal::RadosStore*>(store),
+ bucket->get_info(), bucket->get_attrs(),
+ nullptr /* no callback */);
list<cls_rgw_bucket_instance_entry> status;
int r = br.get_status(dpp(), &status);
if (r < 0) {
if (bucket_initable) {
// we did not encounter an error, so let's work with the bucket
- RGWBucketReshard br(static_cast<rgw::sal::RadosStore*>(store), bucket->get_info(), nullptr /* no callback */);
+ RGWBucketReshard br(static_cast<rgw::sal::RadosStore*>(store),
+ bucket->get_info(), bucket->get_attrs(),
+ nullptr /* no callback */);
int ret = br.cancel(dpp());
if (ret < 0) {
if (ret == -EBUSY) {
RGWBucketReshard::RGWBucketReshard(rgw::sal::RadosStore* _store,
const RGWBucketInfo& _bucket_info,
+ const std::map<std::string, bufferlist>& _bucket_attrs,
RGWBucketReshardLock* _outer_reshard_lock) :
- store(_store), bucket_info(_bucket_info),
+ store(_store), bucket_info(_bucket_info), bucket_attrs(_bucket_attrs),
reshard_lock(store, bucket_info, true),
outer_reshard_lock(_outer_reshard_lock)
{ }
// write the target layout to the bucket instance metadata
static int init_target_layout(rgw::sal::RadosStore* store,
RGWBucketInfo& bucket_info,
+ std::map<std::string, bufferlist>& bucket_attrs,
const ReshardFaultInjector& fault,
uint32_t new_num_shards,
const DoutPrefixProvider* dpp)
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(), nullptr, dpp);
+ real_time(), &bucket_attrs, dpp);
}
if (ret < 0) {
static int init_reshard(rgw::sal::RadosStore* store,
RGWBucketInfo& bucket_info,
+ std::map<std::string, bufferlist>& bucket_attrs,
const ReshardFaultInjector& fault,
uint32_t new_num_shards,
const DoutPrefixProvider *dpp)
{
- int ret = init_target_layout(store, bucket_info, fault, new_num_shards, dpp);
+ int ret = init_target_layout(store, bucket_info, bucket_attrs, fault, new_num_shards, dpp);
if (ret < 0) {
return ret;
}
static int commit_reshard(rgw::sal::RadosStore* store,
RGWBucketInfo& bucket_info,
+ std::map<std::string, bufferlist>& bucket_attrs,
const ReshardFaultInjector& fault,
const DoutPrefixProvider *dpp)
{
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(), nullptr, dpp);
+ ret =
+ store->getRados()->put_bucket_instance_info(bucket_info, false,
+ real_time(),
+ &bucket_attrs, dpp);
}
if (ret < 0) {
}
// prepare the target index and add its layout the bucket info
- ret = init_reshard(store, bucket_info, fault, num_shards, dpp);
+ ret = init_reshard(store, bucket_info, bucket_attrs, fault, num_shards, dpp);
if (ret < 0) {
return ret;
}
return ret;
}
- ret = commit_reshard(store, bucket_info, fault, dpp);
+ ret = commit_reshard(store, bucket_info, bucket_attrs, fault, dpp);
if (ret < 0) {
return ret;
}
rgw_bucket bucket;
RGWBucketInfo bucket_info;
+ std::map<std::string, bufferlist> bucket_attrs;
int ret = store->getRados()->get_bucket_info(store->svc(),
- entry.tenant, entry.bucket_name,
+ entry.tenant,
+ entry.bucket_name,
bucket_info, nullptr,
- null_yield, dpp, nullptr);
+ null_yield, dpp,
+ &bucket_attrs);
if (ret < 0 || bucket_info.bucket.bucket_id != entry.bucket_id) {
if (ret < 0) {
ldpp_dout(dpp, 0) << __func__ <<
return remove(dpp, entry);
}
- RGWBucketReshard br(store, bucket_info, nullptr);
+ RGWBucketReshard br(store, bucket_info, bucket_attrs, nullptr);
ReshardFaultInjector f; // no fault injected
ret = br.execute(entry.new_num_shards, f, max_entries, dpp,
private:
rgw::sal::RadosStore *store;
RGWBucketInfo bucket_info;
+ std::map<std::string, bufferlist> bucket_attrs;
RGWBucketReshardLock reshard_lock;
RGWBucketReshardLock* outer_reshard_lock;
// manage
RGWBucketReshard(rgw::sal::RadosStore* _store,
const RGWBucketInfo& _bucket_info,
+ const std::map<std::string, bufferlist>& _bucket_attrs,
RGWBucketReshardLock* _outer_reshard_lock);
int execute(int num_shards, const ReshardFaultInjector& f,
int max_op_entries, const DoutPrefixProvider *dpp,
return final_num_shards;
}
+ const std::map<std::string, bufferlist>& get_bucket_attrs() const {
+ return bucket_attrs;
+ }
+
// for multisite, the RGWBucketInfo keeps a history of old log generations
// until all peers are done with them. prevent this log history from growing
// too large by refusing to reshard the bucket until the old logs get trimmed