diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-14 21:56:34 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-06-14 21:56:34 -0700 |
commit | 17d65716c82150b7a872cdd06df90b62503a745c (patch) | |
tree | 989c7bc419b01bc4e893855b291cbe6d70f3a0d9 | |
parent | d5679d045d5bcb33486bf57ed298d7fe58b021b5 (diff) | |
download | ceph-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.cc | 20 |
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; |