CLS_LOG(20, "storing entry for key=%s size=%lld count=%lld",
key.c_str(), (long long)update_entry.size, (long long)update_entry.count);
+ // Update bucket's placement rule info only when linking bucket, not on
+ // usage stats change. */
+ if (op.add) {
+ entry.placement_rule = update_entry.placement_rule;
+ }
+
// sync entry stats when not an op.add, as when the case is op.add if its a
// new entry we already have copied update_entry earlier, OTOH, for an existing entry
// we end up clobbering the existing stats for the bucket
if (!op.add){
apply_entry_stats(update_entry, &entry);
}
-
entry.user_stats_sync = true;
ret = write_entry(hctx, key, entry);
return 0;
}
-int rgw_link_bucket(RGWRados *store, const rgw_user& user_id, rgw_bucket& bucket, real_time creation_time, bool update_entrypoint)
+int rgw_link_bucket(RGWRados* const store,
+ const rgw_user& user_id,
+ rgw_bucket& bucket,
+ ceph::real_time creation_time,
+ std::string placement_rule,
+ bool update_entrypoint)
{
int ret;
string& tenant_name = bucket.tenant;
string& bucket_name = bucket.name;
cls_user_bucket_entry new_bucket;
+ new_bucket.placement_rule = placement_rule;
RGWBucketEntryPoint ep;
RGWObjVersionTracker ot;
cout << "bucket info mismatch: expected " << actual_bucket << " got " << bucket << std::endl;
if (fix) {
cout << "fixing" << std::endl;
- r = rgw_link_bucket(store, user_id, actual_bucket, bucket_info.creation_time);
+ r = rgw_link_bucket(store, user_id, actual_bucket,
+ bucket_info.creation_time,
+ bucket_info.placement_rule);
if (r < 0) {
cerr << "failed to fix bucket: " << cpp_strerror(-r) << std::endl;
}
return r;
}
- r = rgw_link_bucket(store, user_info.user_id, bucket_info.bucket, real_time());
+ r = rgw_link_bucket(store, user_info.user_id, bucket_info.bucket,
+ ceph::real_time(), bucket_info.placement_rule);
if (r < 0) {
return r;
}
/* link bucket */
if (be.linked) {
- ret = rgw_link_bucket(store, be.owner, be.bucket, be.creation_time, false);
+ RGWBucketInfo bucket_info;
+ ret = store->get_bucket_info(obj_ctx, tenant_name, bucket_name,
+ bucket_info, nullptr, nullptr);
+ if (ret < 0) {
+ return ret;
+ }
+ ret = rgw_link_bucket(store, be.owner, be.bucket, be.creation_time,
+ bucket_info.placement_rule, false);
} else {
- ret = rgw_unlink_bucket(store, be.owner, be.bucket.tenant, be.bucket.name, false);
+ ret = rgw_unlink_bucket(store, be.owner, be.bucket.tenant,
+ be.bucket.name, false);
}
return ret;
bool* is_truncated,
uint64_t default_amount = 1000);
-extern int rgw_link_bucket(RGWRados *store, const rgw_user& user_id, rgw_bucket& bucket, real_time creation_time, bool update_entrypoint = true);
+extern int rgw_link_bucket(RGWRados* store,
+ const rgw_user& user_id,
+ rgw_bucket& bucket,
+ ceph::real_time creation_time,
+ std::string placement_rule,
+ bool update_entrypoint = true);
extern int rgw_unlink_bucket(RGWRados *store, const rgw_user& user_id,
const string& tenant_name, const string& bucket_name, bool update_entrypoint = true);
}
op_ret = rgw_link_bucket(store, s->user->user_id, s->bucket,
- info.creation_time, false);
+ info.creation_time, info.placement_rule, false);
if (op_ret && !existed && op_ret != -EEXIST) {
/* if it exists (or previously existed), don't remove it! */
op_ret = rgw_unlink_bucket(store, s->user->user_id, s->bucket.tenant,
bucket = out_info.bucket;
}
- op_ret = rgw_link_bucket(store, s->user->user_id, bucket,
- out_info.creation_time, false);
+ op_ret = rgw_link_bucket(store, s->user->user_id,bucket, out_info.creation_time,
+ out_info.placement_rule, false);
if (op_ret && !existed && op_ret != -EEXIST) {
/* if it exists (or previously existed), don't remove it! */
op_ret = rgw_unlink_bucket(store, s->user->user_id,