]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: lc: check for valid placement target before processing transitions 28256/head
authorAbhishek Lekshmanan <abhishek@suse.com>
Mon, 27 May 2019 13:14:18 +0000 (15:14 +0200)
committerAbhishek Lekshmanan <abhishek@suse.com>
Tue, 11 Jun 2019 11:38:18 +0000 (13:38 +0200)
Check that we transition to another placement target only if such a placement
target is valid in the zone. Also log the bucket and rule id in this case to
identify the LCRule causing the issue.

This still doesn't error the API at a put bucket lifecycle call

Fixes: https://tracker.ceph.com/issues/39632
Signed-off-by: Abhishek Lekshmanan <abhishek@suse.com>
src/rgw/rgw_lc.cc

index 9ce833e743818e2a3ccfe47808bd3f5ab008318f..6ba492f28ff5bf2e455985ae20acef25fc0a6ccc 100644 (file)
@@ -16,6 +16,7 @@
 #include "rgw_common.h"
 #include "rgw_bucket.h"
 #include "rgw_lc.h"
+#include "rgw_zone.h"
 #include "rgw_string.h"
 
 #include "services/svc_sys_obj.h"
@@ -816,6 +817,13 @@ public:
     target_placement.inherit_from(oc.bucket_info.placement_rule);
     target_placement.storage_class = transition.storage_class;
 
+    if (!oc.store->svc.zone->get_zone_params().valid_placement(target_placement)) {
+      ldpp_dout(oc.dpp, 0) << "ERROR: non existent dest placement: " << target_placement
+                           << " bucket="<< oc.bucket_info.bucket
+                           << " rule_id=" << oc.op.id << dendl;
+      return -EINVAL;
+    }
+
     int r = oc.store->transition_obj(oc.rctx, oc.bucket_info, oc.obj,
                                      target_placement, o.meta.mtime, o.versioned_epoch, oc.dpp);
     if (r < 0) {