return 0;
}
-static int convert_old_bucket_info(RGWRados *store,
- RGWSysObjectCtx& obj_ctx,
- const string& tenant_name,
- const string& bucket_name)
-{
- RGWBucketEntryPoint entry_point;
- real_time ep_mtime;
- RGWObjVersionTracker ot;
- map<string, bufferlist> attrs;
- RGWBucketInfo info;
- auto cct = store->ctx();
-
- ldout(cct, 10) << "RGWRados::convert_old_bucket_info(): bucket=" << bucket_name << dendl;
-
- int ret = store->get_bucket_entrypoint_info(obj_ctx, tenant_name, bucket_name, entry_point, &ot, &ep_mtime, &attrs);
- if (ret < 0) {
- ldout(cct, 0) << "ERROR: get_bucket_entrypoint_info() returned " << ret << " bucket=" << bucket_name << dendl;
- return ret;
- }
-
- if (!entry_point.has_bucket_info) {
- /* already converted! */
- return 0;
- }
-
- info = entry_point.old_bucket_info;
- info.bucket.oid = bucket_name;
- info.ep_objv = ot.read_version;
-
- ot.generate_new_write_ver(cct);
-
- ret = store->put_linked_bucket_info(info, false, ep_mtime, &ot.write_version, &attrs, true);
- if (ret < 0) {
- ldout(cct, 0) << "ERROR: failed to put_linked_bucket_info(): " << ret << dendl;
- return ret;
- }
-
- return 0;
-}
-
static void dump_mulipart_index_results(list<rgw_obj_index_key>& objs_to_unlink,
Formatter *f)
{
lderr(svc.bucket->ctx()) << "could not unlink bucket=" << entry << " owner=" << be.owner << dendl;
}
- ret = svc.bucket->remove_bucket_entrypoint_info(op->ctx(), entry, objv_tracker);
+ ret = svc.bucket->remove_bucket_entrypoint_info(op->ctx(), entry, &objv_tracker);
if (ret < 0) {
lderr(svc.bucket->ctx()) << "could not delete bucket=" << entry << dendl;
}
int list_keys_init(const string& marker, void **phandle) override {
auto info = std::make_unique<list_keys_info>();
- info->store = store;
-
int ret = store->list_raw_objects_init(store->svc.zone->get_zone_params().domain_root, marker,
&info->ctx);
if (ret < 0) {
if (be.linked) {
ret = handler->ctl.bucket->link_bucket(be.owner, be.bucket, be.creation_time, false);
} else {
- ret = handler->ctl.bucket->unlink_bucket(store, be.owner, be.bucket.tenant,
- be.bucket.name, false);
+ ret = handler->ctl.bucket->unlink_bucket(be.owner, be.bucket, false);
}
return ret;
string tenant_name, bucket_name;
parse_bucket(entry, &tenant_name, &bucket_name);
+ rgw_bucket entry_bucket;
+ entry_bucket.tenant = tenant_name;
+ entry_bucket.name = bucket_name;
real_time mtime;
/* clean up old stuff */
- ret = ctl.bucket->unlink_bucket(be.owner, tenant_name, bucket_name, false, y);
+ ret = ctl.bucket->unlink_bucket(be.owner, entry_bucket, false, y);
if (ret < 0) {
lderr(cct) << "could not unlink bucket=" << entry << " owner=" << be.owner << dendl;
}
}
}
- return RGWBucketMetadataHandler::do_put(op, entry, objv_tracker,
- obj->get_mtime(), obj, y, sync_type);
+ return RGWBucketMetadataHandler::do_put(op, entry, obj,
+ objv_tracker, y, type);
}
};
RGWMDLogSyncType sync_type) override;
struct list_keys_info {
- RGWRados *store;
RGWListRawObjsCtx ctx;
};
int list_keys_init(const string& marker, void **phandle) override {
auto info = std::make_unique<list_keys_info>();
- info->store = store;
-
int ret = store->list_raw_objects_init(store->svc.zone->get_zone_params().domain_root, marker,
&info->ctx);
if (ret < 0) {
keys.clear();
- RGWRados *store = info->store;
-
list<string> unfiltered_keys;
int ret = store->list_raw_objects_next(no_filter, max, info->ctx,
int put_post() override;
};
-int RGWBucketInstanceMetadataHandler::do_put(RGWSI_MetaBackend::Context *ctx, string& entry,
+int RGWBucketInstanceMetadataHandler::do_put(RGWSI_MetaBackend_Handler::Op *op,
+ string& entry,
RGWMetadataObject *obj,
RGWObjVersionTracker& objv_tracker,
optional_yield y,
RGWMDLogSyncType type)
{
- RGWMetadataHandlerPut_BucketInstance put_op(svc.bucket->ctx(), this, ctx, entry, obj,
+ RGWMetadataHandlerPut_BucketInstance put_op(svc.bucket->ctx(), this, op, entry, obj,
objv_tracker, y, type);
- return do_put_operate(&op);
+ return do_put_operate(&put_op);
}
int RGWMetadataHandlerPut_BucketInstance::put_pre()
bci.info.bucket.name = bucket_name;
bci.info.bucket.bucket_id = bucket_instance;
bci.info.bucket.tenant = tenant_name;
- ret = svc.zone->select_bucket_location_by_rule(bci.info.placement_rule, &rule_info);
+ ret = handler->svc.zone->select_bucket_location_by_rule(bci.info.placement_rule, &rule_info);
if (ret < 0) {
ldout(cct, 0) << "ERROR: select_bucket_placement() returned " << ret << dendl;
return ret;
int RGWMetadataHandlerPut_BucketInstance::put_post()
{
+ RGWBucketCompleteInfo& bci = obj->get_bci();
+
objv_tracker = bci.info.objv_tracker;
int ret = store->init_bucket_index(bci.info, bci.info.num_shards);
return 0;
}
-int RGWBucketCtl::store_bucket_instance_info(const rgw_bucket& bucket,
- RGWBucketInfo& info,
- ceph::optional_ref_default<RGWBucketCtl::BucketInstance::PutParams> _params)
+int RGWBucketCtl::do_store_bucket_instance_info(RGWSI_MetaBackend_Handler::Op *op,
+ const rgw_bucket& bucket,
+ RGWBucketInfo& info,
+ ceph::optional_ref_default<RGWBucketCtl::BucketInstance::PutParams> _params)
{
auto& params = *_params;
if (params.objv_tracker) {
info.objv_tracker = *params.objv_tracker;
}
+ return svc.bucket->store_bucket_instance_info(op->ctx(),
+ RGWSI_Bucket::get_bi_meta_key(bucket),
+ info,
+ params.exclusive,
+ params.mtime,
+ params.attrs);
+}
+
+int RGWBucketCtl::store_bucket_instance_info(const rgw_bucket& bucket,
+ RGWBucketInfo& info,
+ ceph::optional_ref_default<RGWBucketCtl::BucketInstance::PutParams> _params)
+{
return bi_be_handler->call([&](RGWSI_MetaBackend_Handler::Op *op) {
- return svc.bucket->store_bucket_instance_info(op->ctx(),
- RGWSI_Bucket::get_bi_meta_key(bucket),
- info,
- params.exclusive,
- params.mtime,
- params.attrs);
+ return do_store_bucket_instance_info(op, bucket, info, _params);
});
}
return bi_be_handler->call([&](RGWSI_MetaBackend_Handler::Op *op) {
return svc.bucket->remove_bucket_instance_info(op->ctx(),
- RGWBucketCtl::get_bi_meta_key(bucket),
- &info.objv_tracker));
+ RGWSI_Bucket::get_bi_meta_key(bucket),
+ &info.objv_tracker);
});
}
+int RGWBucketCtl::convert_old_bucket_info(RGWSI_MetaBackend_Handler::Op *op,
+ const rgw_bucket& bucket)
+{
+ RGWBucketEntryPoint entry_point;
+ real_time ep_mtime;
+ RGWObjVersionTracker ot;
+ map<string, bufferlist> attrs;
+ RGWBucketInfo info;
+ auto cct = svc.bucket->ctx();
+
+ ldout(cct, 10) << "RGWRados::convert_old_bucket_info(): bucket=" << bucket << dendl;
+
+ int ret = svc.bucket->read_bucket_entrypoint_info(op->ctx(),
+ RGWSI_Bucket::get_entrypoint_meta_key(bucket),
+ &entry_point, &ot, &ep_mtime, &attrs);
+ if (ret < 0) {
+ ldout(cct, 0) << "ERROR: get_bucket_entrypoint_info() returned " << ret << " bucket=" << bucket << dendl;
+ return ret;
+ }
+
+ if (!entry_point.has_bucket_info) {
+ /* already converted! */
+ return 0;
+ }
+
+ info = entry_point.old_bucket_info;
+ info.bucket.oid = bucket.name;
+ info.ep_objv = ot.read_version;
+
+ ot.generate_new_write_ver(cct);
+
+ ret = svc.bucket->store_linked_bucket_info(op->ctx(), info, false, ep_mtime, &ot.write_version, &attrs, true);
+ if (ret < 0) {
+ ldout(cct, 0) << "ERROR: failed to put_linked_bucket_info(): " << ret << dendl;
+ return ret;
+ }
+
+ return 0;
+}
+
int RGWBucketCtl::set_bucket_instance_attrs(RGWBucketInfo& bucket_info,
map<string, bufferlist>& attrs,
RGWObjVersionTracker *objv_tracker)
{
- rgw_bucket& bucket = bucket_info.bucket;
+ return bi_be_handler->call([&](RGWSI_MetaBackend_Handler::Op *op) {
+ rgw_bucket& bucket = bucket_info.bucket;
- if (!bucket_info.has_instance_obj) {
- /* an old bucket object, need to convert it */
- RGWSysObjectCtx obj_ctx = store->svc.sysobj->init_obj_ctx();
- int ret = convert_old_bucket_info(store, obj_ctx, bucket.tenant, bucket.name);
- if (ret < 0) {
- ldout(store->ctx(), 0) << "ERROR: failed converting old bucket info: " << ret << dendl;
- return ret;
+ if (!bucket_info.has_instance_obj) {
+ /* an old bucket object, need to convert it */
+ int ret = convert_old_bucket_info(op, bucket);
+ if (ret < 0) {
+ ldout(svc.bucket->ctx(), 0) << "ERROR: failed converting old bucket info: " << ret << dendl;
+ return ret;
+ }
}
- }
- return store_bucket_instance_info(bucket,
- bucket_info,
- PutParams().set_attrs(&attrs)
- .set_objv_tracker(objv_tracker));
+ return do_store_bucket_instance_info(op,
+ bucket,
+ bucket_info,
+ BucketInstance::PutParams().set_attrs(&attrs)
+ .set_objv_tracker(objv_tracker));
+ });
}
{
return bucket_be_handler->call([&](RGWSI_MetaBackend_Handler::Op *op) {
return do_link_bucket(op, user_id, bucket, creation_time, update_entrypoint);
- }
+ });
}
int RGWBucketCtl::do_link_bucket(RGWSI_MetaBackend_Handler::Op *op,
bool update_entrypoint)
{
int ret;
- string& tenant_name = bucket.tenant;
- string& bucket_name = bucket.name;
cls_user_bucket_entry new_bucket;
new_bucket.creation_time = creation_time;
map<string, bufferlist> attrs;
- RGWSysObjectCtx obj_ctx = store->svc.sysobj->init_obj_ctx();
if (update_entrypoint) {
ret = svc.bucket->read_bucket_entrypoint_info(op->ctx(),
bucket, &ep, &ot,
nullptr, &attrs);
if (ret < 0 && ret != -ENOENT) {
- ldout(store->ctx(), 0) << "ERROR: store->get_bucket_entrypoint_info() returned: "
+ ldout(svc.bucket->ctx(), 0) << "ERROR: store->get_bucket_entrypoint_info() returned: "
<< cpp_strerror(-ret) << dendl;
}
}
return ret;
}
-int RGWBucketCtl::unlink_bucket(const rgw_user& user_id, const rgw_bucket, bool update_entrypoint)
+int RGWBucketCtl::unlink_bucket(const rgw_user& user_id, const rgw_bucket& bucket, bool update_entrypoint)
{
return bucket_be_handler->call([&](RGWSI_MetaBackend_Handler::Op *op) {
return do_unlink_bucket(op, user_id, bucket, update_entrypoint);
int RGWBucketCtl::do_unlink_bucket(RGWSI_MetaBackend_Handler::Op *op,
const rgw_user& user_id,
- const rgw_bucket,
+ const rgw_bucket& bucket,
bool update_entrypoint)
{
int ret;
RGWBucketEntryPoint ep;
RGWObjVersionTracker ot;
map<string, bufferlist> attrs;
- RGWSysObjectCtx obj_ctx = store->svc.sysobj->init_obj_ctx();
- ret = svc.bucket->read_bucket_entrypoint_info(op->ctx(), bucket, ep, &ot, NULL, &attrs);
+ ret = svc.bucket->read_bucket_entrypoint_info(op->ctx(), bucket, ep, &ot, nullptr, &attrs);
if (ret == -ENOENT)
return 0;
if (ret < 0)
return svc.bucket->store_bucket_entrypoint_info(op->ctx(), bucket, ep, false, ot, real_time(), &attrs);
}
-RGWMetadataHandler *RGWBucketMetaHandlerAllocator::alloc() {
- return new RGWBucketMetadataHandler;
+RGWMetadataHandler *RGWBucketMetaHandlerAllocator::alloc(RGWSI_Bucket *bucket_svc,
+ RGWBucketCtl *bucket_ctl) {
+ return new RGWBucketMetadataHandler(bucket_svc, bucket_ctl);
}
RGWMetadataHandler *RGWBucketInstanceMetaHandlerAllocator::alloc() {
class RGWBucketMetaHandlerAllocator {
public:
- static RGWMetadataHandler *alloc();
+ static RGWMetadataHandler *alloc(RGWSI_Bucket *bucket_svc,
+ RGWBucketCtl *bucket_ctl);
};
class RGWBucketInstanceMetaHandlerAllocator {
RGWSI_MetaBackend_Handler *bucket_be_handler; /* bucket backend handler */
RGWSI_MetaBackend_Handler *bi_be_handler; /* bucket instance backend handler */
- int do_link_bucket(RGWSI_MetaBackend_Handler::Op *op,
- const rgw_bucket& bucket,
- ceph::real_time creation_time,
- bool update_entrypoint);
-
- int do_unlink_bucket(RGWSI_MetaBackend_Handler::Op *op,
- const rgw_user& user_id,
- const rgw_bucket& bucket,
- bool update_entrypoint);
public:
RGWBucketCtl(RGWSI_Zone *zone_svc,
RGWSI_Bucket *bucket_svc,
RGWBucketInfo& info,
ceph::optional_ref_default<RGWBucketCtl::BucketInstance::RemoveParams> params);
+ int set_bucket_instance_attrs(RGWBucketInfo& bucket_info,
+ map<string, bufferlist>& attrs,
+ RGWObjVersionTracker *objv_tracker);
+
/* user/bucket */
int link_bucket(const rgw_user& user_id,
const rgw_bucket& bucket,
int unlink_bucket(const rgw_user& user_id,
const rgw_bucket& bucket,
bool update_entrypoint = true);
+
+private:
+ int convert_old_bucket_info(RGWSI_MetaBackend_Handler::Op *op,
+ const rgw_bucket& bucket);
+
+ int do_store_bucket_instance_info(RGWSI_MetaBackend_Handler::Op *op,
+ const rgw_bucket& bucket,
+ RGWBucketInfo& info,
+ ceph::optional_ref_default<RGWBucketCtl::BucketInstance::PutParams> params);
+
+ int do_link_bucket(RGWSI_MetaBackend_Handler::Op *op,
+ const rgw_user& user,
+ const rgw_bucket& bucket,
+ ceph::real_time creation_time,
+ bool update_entrypoint);
+
+ int do_unlink_bucket(RGWSI_MetaBackend_Handler::Op *op,
+ const rgw_user& user_id,
+ const rgw_bucket& bucket,
+ bool update_entrypoint);
};