From: Abhishek Lekshmanan Date: Mon, 27 May 2019 13:14:18 +0000 (+0200) Subject: rgw: lc: check for valid placement target before processing transitions X-Git-Tag: v15.1.0~2279^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2912bbf591ae1624007b3efabfa1dbfd5a137ca6;p=ceph.git rgw: lc: check for valid placement target before processing transitions 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 --- diff --git a/src/rgw/rgw_lc.cc b/src/rgw/rgw_lc.cc index 9ce833e7438..6ba492f28ff 100644 --- a/src/rgw/rgw_lc.cc +++ b/src/rgw/rgw_lc.cc @@ -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) {