From aa158ad7a39da7b0ff156b598f94f51811d64d86 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 13 Dec 2012 18:09:37 -0800 Subject: rgw: allow setting preferred placement for new buckets 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 --- src/rgw/rgw_admin.cc | 4 +++- src/rgw/rgw_op.cc | 2 +- src/rgw/rgw_op.h | 1 + src/rgw/rgw_rados.cc | 12 ++++++++++-- src/rgw/rgw_rados.h | 3 ++- 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& 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 *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 m; @@ -876,6 +877,12 @@ read_omap: } map::iterator miter; + + if (requested_placement.size() && m.find(requested_placement) != m.end()) { + pool_name = requested_placement; + goto done; + } + if (m.size() > 1) { vector 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 *pattrs, bool exclusive); protected: @@ -455,6 +455,7 @@ public: */ virtual int create_bucket(string& owner, rgw_bucket& bucket, map& 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; -- cgit v1.2.1