From: Yehuda Sadeh Date: Sat, 15 Jun 2013 04:56:34 +0000 (-0700) Subject: rgw: when setting bucket metadata key, don't override placement X-Git-Tag: v0.67-rc1~128^2~25^2~25 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=17d65716c82150b7a872cdd06df90b62503a745c;p=ceph.git 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 --- diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 52c7b6ebdc2c..8b4d29c32709 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;