diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-24 19:54:26 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-24 19:54:26 -0700 |
commit | 52b23b5ed7c085130356f125642499441b18d3a2 (patch) | |
tree | a9b9e96b61ccca7bb321556fe71013d05bae122f | |
parent | 3044fa8b88d87c74c20ba0a61547b17b8a978edb (diff) | |
download | ceph-52b23b5ed7c085130356f125642499441b18d3a2.tar.gz |
rgw: propagate region on bucket creation
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r-- | src/rgw/rgw_bucket.cc | 6 | ||||
-rw-r--r-- | src/rgw/rgw_bucket.h | 2 | ||||
-rw-r--r-- | src/rgw/rgw_op.cc | 13 | ||||
-rw-r--r-- | src/rgw/rgw_rados.cc | 5 | ||||
-rw-r--r-- | src/rgw/rgw_rados.h | 1 | ||||
-rw-r--r-- | src/rgw/rgw_rest_conn.cc | 2 | ||||
-rw-r--r-- | src/rgw/rgw_rest_conn.h | 1 | ||||
-rw-r--r-- | src/rgw/rgw_rest_s3.cc | 1 |
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, ¶ms); 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"); |