}
-int RGWBucket::create_bucket(string bucket_str, string& user_id, string& display_name)
+int RGWBucket::create_bucket(string bucket_str, string& user_id, string& region_name, string& display_name)
{
RGWAccessControlPolicy policy, old_policy;
map<string, bufferlist> attrs;
rgw_bucket& bucket = bucket_info.bucket;
- ret = store->create_bucket(user_id, bucket, attrs, objv_tracker);
+ ret = store->create_bucket(user_id, bucket, region_name, attrs, objv_tracker);
if (ret && ret != -EEXIST)
goto done;
return r;
} else {
// the bucket seems not to exist, so we should probably create it...
- r = create_bucket(bucket_name.c_str(), uid_str, display_name);
+ r = create_bucket(bucket_name.c_str(), uid_str, store->region.name, display_name);
if (r < 0) {
set_err_msg(err_msg, "error linking bucket to user r=" + cpp_strerror(-r));
}
RGWBucket() : store(NULL), failure(false) {}
int init(RGWRados *storage, RGWBucketAdminOpState& op_state);
- int create_bucket(string bucket_str, string& user_id, string& display_name);
+ int create_bucket(string bucket_str, string& user_id, string& region_name, string& display_name);
int check_bad_index_multipart(RGWBucketAdminOpState& op_state,
list<std::string>& objs_to_unlink, std::string *err_msg = NULL);
return;
}
}
+ string region_name;
+
+ if (s->system_request) {
+ region_name = s->info.args.get(RGW_SYS_PARAM_PREFIX "region");
+ if (region_name.empty()) {
+ region_name = store->region.name;
+ }
+ } else {
+ region_name = store->region.name;
+ }
+
policy.encode(aclbl);
attrs[RGW_ATTR_ACL] = aclbl;
s->bucket.name = s->bucket_name_str;
RGWObjVersionTracker objv_tracker;
- ret = store->create_bucket(s->user.user_id, s->bucket, attrs, objv_tracker, true);
+ ret = store->create_bucket(s->user.user_id, s->bucket, region_name, attrs, objv_tracker, true);
/* continue if EEXIST and create_bucket will fail below. this way we can recover
* from a partial create by retrying it. */
ldout(s->cct, 20) << "rgw_create_bucket returned ret=" << ret << " bucket=" << s->bucket << dendl;
* create a bucket with name bucket and the given list of attrs
* returns 0 on success, -ERR# otherwise.
*/
-int RGWRados::create_bucket(string& owner, rgw_bucket& bucket,
+int RGWRados::create_bucket(string& owner, rgw_bucket& bucket,
+ const string& region_name,
map<std::string, bufferlist>& attrs,
RGWObjVersionTracker& objv_tracker,
bool exclusive)
RGWBucketInfo info;
info.bucket = bucket;
info.owner = owner;
- info.region = region.name;
+ info.region = region_name;
ret = put_bucket_info(bucket.name, info, exclusive, &objv_tracker, &attrs);
if (ret == -EEXIST) {
index_ctx.remove(dir_oid);
* returns 0 on success, -ERR# otherwise.
*/
virtual int create_bucket(string& owner, rgw_bucket& bucket,
+ const string& region_name,
map<std::string,bufferlist>& attrs,
RGWObjVersionTracker& objv_tracker,
bool exclusive = true);
endpoints[i] = *iter;
}
key = store->zone.system_key;
+ region = store->region.name;
}
int RGWRegionConnection::get_url(string& endpoint)
return ret;
list<pair<string, string> > params;
params.push_back(make_pair<string, string>(RGW_SYS_PARAM_PREFIX "uid", uid));
+ params.push_back(make_pair<string, string>(RGW_SYS_PARAM_PREFIX "region", region));
RGWRESTClient client(cct, url, NULL, ¶ms);
return client.forward_request(key, info, inbl);
}
CephContext *cct;
map<int, string> endpoints;
RGWAccessKey key;
+ string region;
atomic_t counter;
public:
return -EPERM;
if (s->user.system) {
+ s->system_request = true;
dout(20) << "system request" << dendl;
s->info.args.set_system();
string effective_uid = s->info.args.get(RGW_SYS_PARAM_PREFIX "uid");