return ret;
}
-int rgw_remove_user_bucket_info(RGWRados *store, string user_id, rgw_bucket& bucket)
+int rgw_remove_user_bucket_info(RGWRados *store, string user_id, const string& bucket_name)
{
int ret;
rgw_get_buckets_obj(user_id, buckets_obj_id);
rgw_obj obj(store->zone.user_uid_pool, buckets_obj_id);
- ret = store->omap_del(obj, bucket.name);
+ ret = store->omap_del(obj, bucket_name);
if (ret < 0) {
ldout(store->ctx(), 0) << "ERROR: error removing bucket from directory: "
<< cpp_strerror(-ret)<< dendl;
return ret;
}
- ret = rgw_remove_user_bucket_info(store, info.owner, bucket);
+ ret = rgw_remove_user_bucket_info(store, info.owner, bucket.name);
if (ret < 0) {
lderr(store->ctx()) << "ERROR: unable to remove user bucket information" << dendl;
}
return -EIO;
}
- r = rgw_remove_user_bucket_info(store, owner.get_id(), bucket);
+ r = rgw_remove_user_bucket_info(store, owner.get_id(), bucket.name);
if (r < 0) {
set_err_msg(err_msg, "could not unlink policy from user " + owner.get_id());
return r;
return -EINVAL;
}
- int r = rgw_remove_user_bucket_info(store, user_info.user_id, bucket);
+ int r = rgw_remove_user_bucket_info(store, user_info.user_id, bucket.name);
if (r < 0) {
set_err_msg(err_msg, "error unlinking bucket" + cpp_strerror(-r));
}
};
int remove(RGWRados *store, string& entry, RGWObjVersionTracker& objv_tracker) {
- rgw_bucket bucket;
- int r = init_bucket(store, entry, bucket, &objv_tracker);
- if (r < 0) {
- cerr << "could not init bucket=" << entry << std::endl;
- return r;
+ RGWBucketEntryPoint be;
+
+ int ret = store->get_bucket_entrypoint_info(NULL, entry, be, &objv_tracker, NULL);
+ if (ret < 0)
+ return ret;
+
+ ret = rgw_remove_user_bucket_info(store, be.owner, entry);
+ if (ret < 0) {
+ lderr(store->ctx()) << "could not unlink bucket=" << entry << " owner=" << be.owner << dendl;
}
- return store->delete_bucket(bucket, objv_tracker);
+ ret = rgw_bucket_delete_bucket_obj(store, entry, objv_tracker);
+ if (ret < 0) {
+ lderr(store->ctx()) << "could not delete bucket=" << entry << dendl;
+ }
+ /* idempotent */
+ return 0;
}
void get_pool_and_oid(RGWRados *store, string& key, rgw_bucket& bucket, string& oid) {
const string& marker, uint64_t max, bool need_stats);
extern int rgw_add_bucket(RGWRados *store, string user_id, rgw_bucket& bucket, time_t creation_time);
-extern int rgw_remove_user_bucket_info(RGWRados *store, string user_id, rgw_bucket& bucket);
+extern int rgw_remove_user_bucket_info(RGWRados *store, string user_id, const string& bucket_name);
extern int rgw_remove_object(RGWRados *store, rgw_bucket& bucket, std::string& object);
extern int rgw_remove_bucket(RGWRados *store, rgw_bucket& bucket, bool delete_children);
ret = rgw_add_bucket(store, s->user.user_id, s->bucket, info.creation_time);
if (ret && !existed && ret != -EEXIST) /* if it exists (or previously existed), don't remove it! */
- rgw_remove_user_bucket_info(store, s->user.user_id, s->bucket);
+ rgw_remove_user_bucket_info(store, s->user.user_id, s->bucket.name);
if (ret == -EEXIST)
ret = -ERR_BUCKET_EXISTS;
ret = store->delete_bucket(s->bucket, objv_tracker);
if (ret == 0) {
- ret = rgw_remove_user_bucket_info(store, s->user.user_id, s->bucket);
+ ret = rgw_remove_user_bucket_info(store, s->user.user_id, s->bucket.name);
if (ret < 0) {
ldout(s->cct, 0) << "WARNING: failed to remove bucket: ret=" << ret << dendl;
}
virtual int omap_get_all(rgw_obj& obj, bufferlist& header, std::map<string, bufferlist>& m);
virtual int omap_set(rgw_obj& obj, std::string& key, bufferlist& bl);
virtual int omap_set(rgw_obj& obj, map<std::string, bufferlist>& m);
- virtual int omap_del(rgw_obj& obj, std::string& key);
+ virtual int omap_del(rgw_obj& obj, const std::string& key);
virtual int update_containers_stats(map<string, RGWBucketEnt>& m);
virtual int append_async(rgw_obj& obj, size_t size, bufferlist& bl);