From 2912bbf591ae1624007b3efabfa1dbfd5a137ca6 Mon Sep 17 00:00:00 2001 From: Abhishek Lekshmanan Date: Mon, 27 May 2019 15:14:18 +0200 Subject: [PATCH] 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 --- src/rgw/rgw_lc.cc | 8 ++++++++ 1 file changed, 8 insertions(+) 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) { -- 2.47.3