summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-05-24 19:54:26 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-05-24 19:54:26 -0700
commit52b23b5ed7c085130356f125642499441b18d3a2 (patch)
treea9b9e96b61ccca7bb321556fe71013d05bae122f
parent3044fa8b88d87c74c20ba0a61547b17b8a978edb (diff)
downloadceph-52b23b5ed7c085130356f125642499441b18d3a2.tar.gz
rgw: propagate region on bucket creation
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r--src/rgw/rgw_bucket.cc6
-rw-r--r--src/rgw/rgw_bucket.h2
-rw-r--r--src/rgw/rgw_op.cc13
-rw-r--r--src/rgw/rgw_rados.cc5
-rw-r--r--src/rgw/rgw_rados.h1
-rw-r--r--src/rgw/rgw_rest_conn.cc2
-rw-r--r--src/rgw/rgw_rest_conn.h1
-rw-r--r--src/rgw/rgw_rest_s3.cc1
8 files changed, 24 insertions, 7 deletions
diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc
index 4cc5ca33e81..257bf960d1d 100644
--- a/src/rgw/rgw_bucket.cc
+++ b/src/rgw/rgw_bucket.cc
@@ -123,7 +123,7 @@ int rgw_bucket_store_info(RGWRados *store, string& bucket_name, bufferlist& bl,
}
-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;
@@ -146,7 +146,7 @@ int RGWBucket::create_bucket(string bucket_str, string& user_id, string& display
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;
@@ -445,7 +445,7 @@ int RGWBucket::link(RGWBucketAdminOpState& op_state, std::string *err_msg)
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));
}
diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h
index 7f5fa317244..04f0fe71859 100644
--- a/src/rgw/rgw_bucket.h
+++ b/src/rgw/rgw_bucket.h
@@ -183,7 +183,7 @@ public:
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);
diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc
index 74a4b99b134..0e313ecbb33 100644
--- a/src/rgw/rgw_op.cc
+++ b/src/rgw/rgw_op.cc
@@ -880,13 +880,24 @@ void RGWCreateBucket::execute()
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;
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc
index 74ff3a4b14a..88b4f4fc1c2 100644
--- a/src/rgw/rgw_rados.cc
+++ b/src/rgw/rgw_rados.cc
@@ -1342,7 +1342,8 @@ int RGWRados::create_pool(rgw_bucket& bucket)
* 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)
@@ -1389,7 +1390,7 @@ int RGWRados::create_bucket(string& owner, rgw_bucket& bucket,
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);
diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h
index 148695f3183..2997c3c0d5e 100644
--- a/src/rgw/rgw_rados.h
+++ b/src/rgw/rgw_rados.h
@@ -643,6 +643,7 @@ public:
* 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);
diff --git a/src/rgw/rgw_rest_conn.cc b/src/rgw/rgw_rest_conn.cc
index fd2a5e568df..cbbabe5e475 100644
--- a/src/rgw/rgw_rest_conn.cc
+++ b/src/rgw/rgw_rest_conn.cc
@@ -11,6 +11,7 @@ RGWRegionConnection::RGWRegionConnection(CephContext *_cct, RGWRados *store, RGW
endpoints[i] = *iter;
}
key = store->zone.system_key;
+ region = store->region.name;
}
int RGWRegionConnection::get_url(string& endpoint)
@@ -34,6 +35,7 @@ int RGWRegionConnection::forward(const string& uid, req_info& info, bufferlist *
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, &params);
return client.forward_request(key, info, inbl);
}
diff --git a/src/rgw/rgw_rest_conn.h b/src/rgw/rgw_rest_conn.h
index af0e74964b9..2ad9c8f659f 100644
--- a/src/rgw/rgw_rest_conn.h
+++ b/src/rgw/rgw_rest_conn.h
@@ -12,6 +12,7 @@ class RGWRegionConnection
CephContext *cct;
map<int, string> endpoints;
RGWAccessKey key;
+ string region;
atomic_t counter;
public:
diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc
index 6448b65fff0..c82dd17aa4f 100644
--- a/src/rgw/rgw_rest_s3.cc
+++ b/src/rgw/rgw_rest_s3.cc
@@ -2001,6 +2001,7 @@ int RGW_Auth_S3::authorize(RGWRados *store, struct req_state *s)
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");