]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: propagate region on bucket creation
authorYehuda Sadeh <yehuda@inktank.com>
Sat, 25 May 2013 02:54:26 +0000 (19:54 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Sat, 25 May 2013 02:54:26 +0000 (19:54 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_bucket.cc
src/rgw/rgw_bucket.h
src/rgw/rgw_op.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h
src/rgw/rgw_rest_conn.cc
src/rgw/rgw_rest_conn.h
src/rgw/rgw_rest_s3.cc

index 4cc5ca33e81497aba59d4713e97ff4663259f267..257bf960d1ddf8e2fa0eb58474836f84185d05fe 100644 (file)
@@ -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));
     }
index 7f5fa31724497c2ee21831002946813b56490db5..04f0fe718598d197b091e150b5294bf8298ee926 100644 (file)
@@ -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);
index 74a4b99b134084543fab26d3404b9faf51141ad2..0e313ecbb33e009cf709676ba7bb23790f445fb3 100644 (file)
@@ -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;
index 74ff3a4b14a1160dce668aaaf6daf40913683881..88b4f4fc1c25f0c0a12c44fe704d50e1a3d4657a 100644 (file)
@@ -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);
index 148695f3183cb4fcb7feb5c6c8d17afc95b5a156..2997c3c0d5e035b5712bacaf25596dfa6581dd28 100644 (file)
@@ -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);
index fd2a5e568df1c60416e50ffcb70cb691e9da2467..cbbabe5e475eeb6142873219cb154a4abc6ddf8f 100644 (file)
@@ -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);
 }
index af0e74964b9f08685fbb2b968f79078bb5cb93ea..2ad9c8f659f69d5c92e2814076400c9485802457 100644 (file)
@@ -12,6 +12,7 @@ class RGWRegionConnection
   CephContext *cct;
   map<int, string> endpoints;
   RGWAccessKey key;
+  string region;
   atomic_t counter;
 public:
 
index 6448b65fff0b85f58889cc0cf0dc90cd987c023d..c82dd17aa4ff258fa520324c452e0b74ec80f3dc 100644 (file)
@@ -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");