summaryrefslogtreecommitdiff
path: root/src/rgw/rgw_rados.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/rgw/rgw_rados.cc')
-rw-r--r--src/rgw/rgw_rados.cc73
1 files changed, 56 insertions, 17 deletions
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc
index e03dae532e3..3866d807bd1 100644
--- a/src/rgw/rgw_rados.cc
+++ b/src/rgw/rgw_rados.cc
@@ -61,6 +61,20 @@ static RGWObjCategory main_category = RGW_OBJ_CATEGORY_MAIN;
#define dout_subsys ceph_subsys_rgw
+static void get_bucket_oid(const string& tenant, const string& bucket_name, string& oid)
+{
+ if (!tenant.empty()) {
+ oid = tenant + ':' + bucket_name;
+ } else {
+ oid = bucket_name;
+ }
+}
+
+static void get_bucket_oid(const rgw_bucket& bucket, string& oid)
+{
+ get_bucket_oid(bucket.tenant, bucket.name, oid);
+}
+
void RGWZoneParams::init_default()
{
domain_root = ".rgw";
@@ -183,7 +197,9 @@ RGWObjState *RGWRadosCtx::get_state(rgw_obj& obj) {
if (obj.object.size()) {
return &objs_state[obj];
} else {
- rgw_obj new_obj(store->zone.domain_root, obj.bucket.name);
+ string oid;
+ get_bucket_oid(obj.bucket, oid);
+ rgw_obj new_obj(store->zone.domain_root, oid);
return &objs_state[new_obj];
}
}
@@ -192,7 +208,9 @@ void RGWRadosCtx::set_atomic(rgw_obj& obj) {
if (obj.object.size()) {
objs_state[obj].is_atomic = true;
} else {
- rgw_obj new_obj(store->zone.domain_root, obj.bucket.name);
+ string oid;
+ get_bucket_oid(obj.bucket, oid);
+ rgw_obj new_obj(store->zone.domain_root, oid);
objs_state[new_obj].is_atomic = true;
}
}
@@ -201,7 +219,9 @@ void RGWRadosCtx::set_prefetch_data(rgw_obj& obj) {
if (obj.object.size()) {
objs_state[obj].prefetch_data = true;
} else {
- rgw_obj new_obj(store->zone.domain_root, obj.bucket.name);
+ string oid;
+ get_bucket_oid(obj.bucket, oid);
+ rgw_obj new_obj(store->zone.domain_root, oid);
objs_state[new_obj].prefetch_data = true;
}
}
@@ -389,7 +409,9 @@ int RGWRados::open_bucket_ctx(rgw_bucket& bucket, librados::IoCtx& io_ctx)
the bucket object .. which will trigger update of osdmap
if that is the case */
time_t mtime;
- r = root_pool_ctx.stat(bucket.name, NULL, &mtime);
+ string oid;
+ get_bucket_oid(bucket, oid);
+ r = root_pool_ctx.stat(oid, NULL, &mtime);
if (r < 0)
return -ENOENT;
@@ -822,7 +844,7 @@ int RGWRados::create_bucket(rgw_user& owner, rgw_bucket& bucket,
{
int ret = 0;
- ret = select_bucket_placement(bucket.name, bucket);
+ ret = select_bucket_placement(owner.tenant, bucket.name, bucket);
if (ret < 0)
return ret;
librados::IoCtx io_ctx; // context for new bucket
@@ -874,7 +896,10 @@ int RGWRados::store_bucket_info(RGWBucketInfo& info, map<string, bufferlist> *pa
bufferlist bl;
::encode(info, bl);
- int ret = rgw_put_system_obj(this, zone.domain_root, info.bucket.name, bl.c_str(), bl.length(), exclusive, pattrs);
+ string oid;
+ get_bucket_oid(info.bucket, oid);
+
+ int ret = rgw_put_system_obj(this, zone.domain_root, oid, bl.c_str(), bl.length(), exclusive, pattrs);
if (ret < 0)
return ret;
@@ -883,7 +908,7 @@ int RGWRados::store_bucket_info(RGWBucketInfo& info, map<string, bufferlist> *pa
}
-int RGWRados::select_bucket_placement(string& bucket_name, rgw_bucket& bucket)
+int RGWRados::select_bucket_placement(string& tenant, string& bucket_name, rgw_bucket& bucket)
{
bufferlist map_bl;
map<string, bufferlist> m;
@@ -954,6 +979,7 @@ read_omap:
pool_name = miter->first;
}
bucket.pool = pool_name;
+ bucket.tenant = tenant;
bucket.name = bucket_name;
return 0;
@@ -1553,7 +1579,10 @@ int RGWRados::delete_bucket(rgw_bucket& bucket)
}
} while (is_truncated);
- rgw_obj obj(zone.domain_root, bucket.name);
+ string bucket_oid;
+ get_bucket_oid(bucket, bucket_oid);
+
+ rgw_obj obj(zone.domain_root, bucket_oid);
r = delete_obj(NULL, obj);
if (r < 0)
return r;
@@ -1576,7 +1605,7 @@ int RGWRados::set_bucket_owner(rgw_bucket& bucket, ACLOwner& owner)
{
RGWBucketInfo info;
map<string, bufferlist> attrs;
- int r = get_bucket_info(NULL, bucket.name, info, &attrs);
+ int r = get_bucket_info(NULL, bucket.tenant, bucket.name, info, &attrs);
if (r < 0) {
ldout(cct, 0) << "NOTICE: get_bucket_info on bucket=" << bucket.name << " returned err=" << r << dendl;
return r;
@@ -1584,7 +1613,7 @@ int RGWRados::set_bucket_owner(rgw_bucket& bucket, ACLOwner& owner)
info.owner = owner.get_id();
- r = put_bucket_info(bucket.name, info, false, &attrs);
+ r = put_bucket_info(bucket.tenant, bucket.name, info, false, &attrs);
if (r < 0) {
ldout(cct, 0) << "NOTICE: put_bucket_info on bucket=" << bucket.name << " returned err=" << r << dendl;
return r;
@@ -1609,7 +1638,7 @@ int RGWRados::set_buckets_enabled(vector<rgw_bucket>& buckets, bool enabled)
RGWBucketInfo info;
map<string, bufferlist> attrs;
- int r = get_bucket_info(NULL, bucket.name, info, &attrs);
+ int r = get_bucket_info(NULL, bucket.tenant, bucket.name, info, &attrs);
if (r < 0) {
ldout(cct, 0) << "NOTICE: get_bucket_info on bucket=" << bucket.name << " returned err=" << r << ", skipping bucket" << dendl;
ret = r;
@@ -1621,7 +1650,7 @@ int RGWRados::set_buckets_enabled(vector<rgw_bucket>& buckets, bool enabled)
info.flags |= BUCKET_SUSPENDED;
}
- r = put_bucket_info(bucket.name, info, false, &attrs);
+ r = put_bucket_info(bucket.tenant, bucket.name, info, false, &attrs);
if (r < 0) {
ldout(cct, 0) << "NOTICE: put_bucket_info on bucket=" << bucket.name << " returned err=" << r << ", skipping bucket" << dendl;
ret = r;
@@ -1634,7 +1663,7 @@ int RGWRados::set_buckets_enabled(vector<rgw_bucket>& buckets, bool enabled)
int RGWRados::bucket_suspended(rgw_bucket& bucket, bool *suspended)
{
RGWBucketInfo bucket_info;
- int ret = get_bucket_info(NULL, bucket.name, bucket_info);
+ int ret = get_bucket_info(NULL, bucket.tenant, bucket.name, bucket_info);
if (ret < 0) {
return ret;
}
@@ -3263,15 +3292,20 @@ int RGWRados::get_bucket_stats(rgw_bucket& bucket, map<RGWObjCategory, RGWBucket
return 0;
}
-int RGWRados::get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& info, map<string, bufferlist> *pattrs)
+int RGWRados::get_bucket_info(void *ctx, const string& tenant, const string& bucket_name,
+ RGWBucketInfo& info, map<string, bufferlist> *pattrs)
{
bufferlist bl;
- int ret = rgw_get_obj(this, ctx, zone.domain_root, bucket_name, bl, pattrs);
+ string oid;
+ get_bucket_oid(tenant, bucket_name, oid);
+
+ int ret = rgw_get_obj(this, ctx, zone.domain_root, oid, bl, pattrs);
if (ret < 0) {
if (ret != -ENOENT)
return ret;
+ info.bucket.tenant = tenant;
info.bucket.name = bucket_name;
info.bucket.pool = bucket_name; // for now
return 0;
@@ -3290,13 +3324,18 @@ int RGWRados::get_bucket_info(void *ctx, string& bucket_name, RGWBucketInfo& inf
return 0;
}
-int RGWRados::put_bucket_info(string& bucket_name, RGWBucketInfo& info, bool exclusive, map<string, bufferlist> *pattrs)
+int RGWRados::put_bucket_info(const string& tenant, const string& bucket_name,
+ RGWBucketInfo& info, bool exclusive,
+ map<string, bufferlist> *pattrs)
{
bufferlist bl;
::encode(info, bl);
- int ret = rgw_put_system_obj(this, zone.domain_root, bucket_name, bl.c_str(), bl.length(), exclusive, pattrs);
+ string oid;
+ get_bucket_oid(tenant, bucket_name, oid);
+
+ int ret = rgw_put_system_obj(this, zone.domain_root, oid, bl.c_str(), bl.length(), exclusive, pattrs);
return ret;
}