From: Soumya Koduri Date: Wed, 5 Jul 2023 12:15:39 +0000 (+0530) Subject: rgw: Read `sync status` from only the zones allowed to sync from X-Git-Tag: v16.2.15~129^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=097d574ab3e0cf288118759cb8575655452fbb94;p=ceph.git rgw: Read `sync status` from only the zones allowed to sync from Using multisite sync policy, zones within a zonegroup can be configured not to sync from certain zones. Filter such zones while reading sync status. Fixes: https://tracker.ceph.com/issues/62014 Signed-off-by: Soumya Koduri (cherry picked from commit 094460c26b8fdd9a72667800b54a0cfaa5409c88) Conflicts: src/rgw/rgw_admin.cc (store vs driver, no static cast) src/rgw/services/svc_zone.cc (trivial) src/rgw/services/svc_zone.h (trivial) --- diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 3299f549b8d..423dcee62ac 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -2057,7 +2057,7 @@ static void get_data_sync_status(const rgw_zone_id& source_zone, list& s return; } - if (!store->svc()->zone->zone_syncs_from(store->svc()->zone->get_zone(), *sz)) { + if (!store->svc()->zone->zone_syncs_from(*sz)) { push_ss(ss, status, tab) << string("not syncing from zone"); flush_ss(ss, status); return; diff --git a/src/rgw/services/svc_zone.cc b/src/rgw/services/svc_zone.cc index c12db48004d..1e2feeabe69 100644 --- a/src/rgw/services/svc_zone.cc +++ b/src/rgw/services/svc_zone.cc @@ -64,6 +64,21 @@ bool RGWSI_Zone::zone_syncs_from(const RGWZone& target_zone, const RGWZone& sour sync_modules_svc->get_manager()->supports_data_export(source_zone.tier_type); } +bool RGWSI_Zone::zone_syncs_from(const RGWZone& source_zone) const +{ + auto target_zone = get_zone(); + bool found = false; + + for (auto s : data_sync_source_zones) { + if (s->id == source_zone.id) { + found = true; + break; + } + } + return found && target_zone.syncs_from(source_zone.name) && + sync_modules_svc->get_manager()->supports_data_export(source_zone.tier_type); +} + int RGWSI_Zone::do_start(optional_yield y, const DoutPrefixProvider *dpp) { int ret = sysobj_svc->start(y, dpp); diff --git a/src/rgw/services/svc_zone.h b/src/rgw/services/svc_zone.h index 9f503df5e41..bddc0e20467 100644 --- a/src/rgw/services/svc_zone.h +++ b/src/rgw/services/svc_zone.h @@ -94,6 +94,7 @@ public: bool zone_is_writeable(); bool zone_syncs_from(const RGWZone& target_zone, const RGWZone& source_zone) const; + bool zone_syncs_from(const RGWZone& source_zone) const; bool get_redirect_zone_endpoint(string *endpoint); bool sync_module_supports_writes() const { return writeable_zone; } bool sync_module_exports_data() const { return exports_data; }