From 25e4d1e454219cd31e2c1359f20175eff20b71f4 Mon Sep 17 00:00:00 2001 From: Jiaying Ren Date: Thu, 25 May 2017 20:17:46 +0800 Subject: [PATCH] rgw/multisite: check location constraint existness to match the behavior of AWS S3 Signed-off-by: Jiaying Ren --- src/rgw/rgw_op.cc | 9 +++++++++ src/rgw/rgw_rados.h | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index 3a2fbdfee3b..5b98e50fdb6 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -2394,6 +2394,15 @@ void RGWCreateBucket::execute() if (op_ret < 0) return; + if (!location_constraint.empty() && + !store->has_zonegroup_api(location_constraint)) { + ldout(s->cct, 0) << "location constraint (" << location_constraint << ")" + << " can't be found." << dendl; + op_ret = -ERR_INVALID_LOCATION_CONSTRAINT; + s->err.message = "The specified location-constraint is not valid"; + return; + } + if (!store->get_zonegroup().is_master_zonegroup() && store->get_zonegroup().api_name != location_constraint) { ldout(s->cct, 0) << "location constraint (" << location_constraint << ")" diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 24bb8bb3cb1..4e81cbe4fcf 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -2465,6 +2465,16 @@ public: const string& get_current_period_id() { return current_period.get_id(); } + + bool has_zonegroup_api(const std::string& api) const { + if (!current_period.get_id().empty()) { + const auto& zonegroups_by_api = current_period.get_map().zonegroups_by_api; + if (zonegroups_by_api.find(api) != zonegroups_by_api.end()) + return true; + } + return false; + } + // pulls missing periods for period_history std::unique_ptr period_puller; // maintains a connected history of periods -- 2.39.5