summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-06-14 21:56:34 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-06-14 21:56:34 -0700
commit17d65716c82150b7a872cdd06df90b62503a745c (patch)
tree989c7bc419b01bc4e893855b291cbe6d70f3a0d9
parentd5679d045d5bcb33486bf57ed298d7fe58b021b5 (diff)
downloadceph-17d65716c82150b7a872cdd06df90b62503a745c.tar.gz
rgw: when setting bucket metadata key, don't override placement
Bucket placement also contains data and index pools locations in the source zone. However, we might be applying it on a different zone, so we need to be careful not to use the source location here. We generate a new placement if a new bucket is detected, otherwise we keep the old one. Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r--src/rgw/rgw_bucket.cc20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc
index 52c7b6ebdc2..8b4d29c3270 100644
--- a/src/rgw/rgw_bucket.cc
+++ b/src/rgw/rgw_bucket.cc
@@ -1328,10 +1328,30 @@ public:
if (ret < 0 && ret != -ENOENT)
return ret;
+ if (ret == -ENOENT || old_bci.info.bucket.bucket_id != bci.info.bucket.bucket_id) {
+ /* a new bucket, we need to select a new bucket placement for it */
+ rgw_bucket bucket;
+ ret = store->select_bucket_placement(entry, bucket);
+ if (ret < 0) {
+ ldout(store->ctx(), 0) << "ERROR: select_bucket_placement() returned " << ret << dendl;
+ return ret;
+ }
+ bci.info.bucket.data_pool = bucket.data_pool;
+ bci.info.bucket.index_pool = bucket.index_pool;
+ } else {
+ /* existing bucket, keep its placement pools */
+ bci.info.bucket.data_pool = old_bci.info.bucket.data_pool;
+ bci.info.bucket.index_pool = old_bci.info.bucket.index_pool;
+ }
+
ret = store->put_bucket_info(entry, bci.info, false, &objv_tracker, &bci.attrs);
if (ret < 0)
return ret;
+ ret = store->init_bucket_index(bci.info.bucket);
+ if (ret < 0)
+ return ret;
+
ret = rgw_add_bucket(store, bci.info.owner, bci.info.bucket);
if (ret < 0)
return ret;