]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: when setting bucket metadata key, don't override placement
authorYehuda Sadeh <yehuda@inktank.com>
Sat, 15 Jun 2013 04:56:34 +0000 (21:56 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Sat, 15 Jun 2013 04:56:34 +0000 (21:56 -0700)
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>
src/rgw/rgw_bucket.cc

index 52c7b6ebdc2c57c6c05ba04db34813776a72ff32..8b4d29c32709abdfa6f4b099d6b357e54deb6ecb 100644 (file)
@@ -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;