diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2012-12-13 18:09:37 -0800 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2012-12-13 18:09:37 -0800 |
commit | aa158ad7a39da7b0ff156b598f94f51811d64d86 (patch) | |
tree | e4c640dd1ec41be39062d8cd9975e4cdf02a1b1d | |
parent | 24523913e3a1fa710e04f63716638418c3640c30 (diff) | |
download | ceph-wip-2169.tar.gz |
rgw: allow setting preferred placement for new bucketswip-2169
Setting HTTP_X_RGW_PLACEMENT with name of preferred pool, will
try to use it for placement, if it has been part of the placement
pool set.
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r-- | src/rgw/rgw_admin.cc | 4 | ||||
-rw-r--r-- | src/rgw/rgw_op.cc | 2 | ||||
-rw-r--r-- | src/rgw/rgw_op.h | 1 | ||||
-rw-r--r-- | src/rgw/rgw_rados.cc | 12 | ||||
-rw-r--r-- | src/rgw/rgw_rados.h | 3 | ||||
-rw-r--r-- | src/rgw/rgw_rest_s3.cc | 4 |
6 files changed, 21 insertions, 5 deletions
diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index fb419d93b4c..ca8870f6285 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -435,7 +435,9 @@ static int create_bucket(string bucket_str, string& user_id, string& display_nam rgw_bucket& bucket = bucket_info.bucket; - ret = store->create_bucket(user_id, bucket, attrs); + string preferred_placement; + + ret = store->create_bucket(user_id, bucket, attrs, preferred_placement); if (ret && ret != -EEXIST) goto done; diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index cfb7d177926..7f63d36cc4d 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -824,7 +824,7 @@ void RGWCreateBucket::execute() attrs[RGW_ATTR_ACL] = aclbl; s->bucket.name = s->bucket_name_str; - ret = store->create_bucket(s->user.user_id, s->bucket, attrs, true); + ret = store->create_bucket(s->user.user_id, s->bucket, attrs, preferred_placement, 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_op.h b/src/rgw/rgw_op.h index b3a78846cda..276690de256 100644 --- a/src/rgw/rgw_op.h +++ b/src/rgw/rgw_op.h @@ -220,6 +220,7 @@ class RGWCreateBucket : public RGWOp { protected: int ret; RGWAccessControlPolicy policy; + string preferred_placement; public: RGWCreateBucket() : ret(0) {} diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 70220b4176d..b148846055d 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -761,11 +761,12 @@ int RGWRados::create_pool(rgw_bucket& bucket) */ int RGWRados::create_bucket(string& owner, rgw_bucket& bucket, map<std::string, bufferlist>& attrs, + const string& preferred_placement, bool exclusive) { int ret = 0; - ret = select_bucket_placement(bucket.name, bucket); + ret = select_bucket_placement(bucket.name, bucket, preferred_placement); if (ret < 0) return ret; librados::IoCtx io_ctx; // context for new bucket @@ -823,7 +824,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& bucket_name, rgw_bucket& bucket, const string& requested_placement) { bufferlist map_bl; map<string, bufferlist> m; @@ -876,6 +877,12 @@ read_omap: } map<string, bufferlist>::iterator miter; + + if (requested_placement.size() && m.find(requested_placement) != m.end()) { + pool_name = requested_placement; + goto done; + } + if (m.size() > 1) { vector<string> v; for (miter = m.begin(); miter != m.end(); ++miter) { @@ -893,6 +900,7 @@ read_omap: miter = m.begin(); pool_name = miter->first; } +done: bucket.pool = pool_name; bucket.name = bucket_name; diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index e2ab4e24499..4e9e4752c57 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -365,7 +365,7 @@ class RGWRados int complete_atomic_overwrite(RGWRadosCtx *rctx, RGWObjState *state, rgw_obj& obj); int update_placement_map(); - int select_bucket_placement(std::string& bucket_name, rgw_bucket& bucket); + int select_bucket_placement(std::string& bucket_name, rgw_bucket& bucket, const string& preferred_placement); int store_bucket_info(RGWBucketInfo& info, map<string, bufferlist> *pattrs, bool exclusive); protected: @@ -455,6 +455,7 @@ public: */ virtual int create_bucket(string& owner, rgw_bucket& bucket, map<std::string,bufferlist>& attrs, + const string& preferred_placement, bool exclusive = true); virtual int add_bucket_placement(std::string& new_pool); virtual int remove_bucket_placement(std::string& new_pool); diff --git a/src/rgw/rgw_rest_s3.cc b/src/rgw/rgw_rest_s3.cc index b2925940f77..8a63900dd3b 100644 --- a/src/rgw/rgw_rest_s3.cc +++ b/src/rgw/rgw_rest_s3.cc @@ -311,6 +311,10 @@ int RGWCreateBucket_ObjStore_S3::get_params() if (r < 0) return r; + const char *loc = s->env->get("HTTP_X_RGW_PLACEMENT"); + if (loc) + preferred_placement = loc; + policy = s3policy; return 0; |