return rgw_get_bucket_info(bucket_string, info);
}
-
-int rgw_create_bucket(std::string& id, string& bucket_name, rgw_bucket& bucket,
- map<std::string, bufferlist>& attrs, bool exclusive, uint64_t auid)
-{
- /* system bucket name? */
- if (bucket_name[0] == '.') {
- bucket.name = bucket_name;
- bucket.pool = bucket_name;
- return rgwstore->create_bucket(id, bucket, attrs, true, exclusive, auid);
- }
-
- int ret = rgwstore->select_bucket_placement(bucket_name, bucket);
- if (ret < 0)
- return ret;
-
- ret = rgwstore->create_bucket(id, bucket, attrs, false, exclusive, auid);
-
- if (ret < 0)
- return ret;
-
- RGWBucketInfo info;
- info.bucket = bucket;
- info.owner = id;
- ret = rgw_store_bucket_info(info);
- if (ret < 0) {
- RGW_LOG(0) << "failed to store bucket info, removing bucket" << dendl;
- rgwstore->delete_bucket(id, bucket, true);
- return ret;
- }
-
- return 0;
-}
if (ret == -ENOENT) {
string id;
map<std::string, bufferlist> attrs;
- ret = rgw_create_bucket(id, log_bucket.name, log_bucket, attrs);
+ ret = rgwstore->create_bucket(id, log_bucket, attrs, true);
if (ret < 0)
goto done;
// retry
if (ret == -ENOENT) {
string id;
map<std::string, bufferlist> attrs;
- ret = rgw_create_bucket(id, intent_log_bucket.name, intent_log_bucket, attrs);
+ ret = rgwstore->create_bucket(id, intent_log_bucket, attrs, true);
if (ret < 0)
goto done;
ret = rgwstore->append_async(log_obj, bl.length(), bl);
attrs[RGW_ATTR_ACL] = aclbl;
- ret = rgwstore->select_bucket_placement(s->bucket_name_str, s->bucket);
- if (ret < 0)
- goto done;
-
- ret = rgw_create_bucket(s->user.user_id, s->bucket_name_str, s->bucket, attrs, true,
- s->user.auid);
+ s->bucket.name = s->bucket_name_str;
+ ret = rgwstore->create_bucket(s->user.user_id, s->bucket, attrs, false,
+ true, s->user.auid);
/* continue if EEXIST and create_bucket will fail below. this way we can recover
* from a partial create by retrying it. */
RGW_LOG(0) << "rgw_create_bucket returned ret=" << ret << " bucket=" << s->bucket << dendl;
ret = rados->pool_create(bucket.pool.c_str(), auid);
if (ret == -EEXIST)
ret = 0;
- if (ret < 0)
+ if (ret < 0) {
root_pool_ctx.remove(bucket.name.c_str());
+ } else {
+ bucket.pool = bucket.name;
+ }
} else {
+ ret = select_bucket_placement(bucket.name, bucket);
+ if (ret < 0)
+ return ret;
librados::IoCtx io_ctx; // context for new bucket
int r = open_bucket_ctx(bucket, io_ctx);
r = cls_rgw_init_index(bucket, dir_oid);
if (r < 0)
return r;
+
+ RGWBucketInfo info;
+ info.bucket = bucket;
+ info.owner = id;
+ ret = rgw_store_bucket_info(info);
+ if (ret < 0) {
+ RGW_LOG(0) << "failed to store bucket info, removing bucket" << dendl;
+ delete_bucket(id, bucket, true);
+ return ret;
+ }
}
}
int ret = rgwstore->put_obj(NULL, uid, obj, data, size, NULL, attrs);
if (ret == -ENOENT) {
- ret = rgw_create_bucket(uid, bucket.name, bucket, attrs);
+ ret = rgwstore->create_bucket(uid, bucket, attrs, true); //all callers are using system buckets
if (ret >= 0)
ret = rgwstore->put_obj(NULL, uid, obj, data, size, NULL, attrs);
}