summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2012-12-13 18:09:37 -0800
committerYehuda Sadeh <yehuda@inktank.com>2012-12-13 18:09:37 -0800
commitaa158ad7a39da7b0ff156b598f94f51811d64d86 (patch)
treee4c640dd1ec41be39062d8cd9975e4cdf02a1b1d
parent24523913e3a1fa710e04f63716638418c3640c30 (diff)
downloadceph-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.cc4
-rw-r--r--src/rgw/rgw_op.cc2
-rw-r--r--src/rgw/rgw_op.h1
-rw-r--r--src/rgw/rgw_rados.cc12
-rw-r--r--src/rgw/rgw_rados.h3
-rw-r--r--src/rgw/rgw_rest_s3.cc4
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;