diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/rgw/rgw_admin.cc | 201 | ||||
-rw-r--r-- | src/rgw/rgw_bucket.cc | 2 | ||||
-rw-r--r-- | src/rgw/rgw_bucket.h | 2 | ||||
-rw-r--r-- | src/rgw/rgw_bucket_sync.cc | 142 | ||||
-rw-r--r-- | src/rgw/rgw_bucket_sync.h | 82 | ||||
-rw-r--r-- | src/rgw/rgw_common.cc | 10 | ||||
-rw-r--r-- | src/rgw/rgw_common.h | 66 | ||||
-rw-r--r-- | src/rgw/rgw_cr_rados.h | 24 | ||||
-rw-r--r-- | src/rgw/rgw_cr_tools.h | 2 | ||||
-rw-r--r-- | src/rgw/rgw_data_sync.cc | 139 | ||||
-rw-r--r-- | src/rgw/rgw_data_sync.h | 32 | ||||
-rw-r--r-- | src/rgw/rgw_json_enc.cc | 3 | ||||
-rw-r--r-- | src/rgw/rgw_rados.cc | 32 | ||||
-rw-r--r-- | src/rgw/rgw_rados.h | 16 | ||||
-rw-r--r-- | src/rgw/rgw_sync_module_aws.cc | 2 | ||||
-rw-r--r-- | src/rgw/rgw_sync_policy.cc | 12 | ||||
-rw-r--r-- | src/rgw/rgw_sync_policy.h | 40 | ||||
-rw-r--r-- | src/rgw/rgw_trim_mdlog.cc | 10 | ||||
-rw-r--r-- | src/rgw/rgw_zone.cc | 13 | ||||
-rw-r--r-- | src/rgw/rgw_zone.h | 21 | ||||
-rw-r--r-- | src/rgw/services/svc_bucket_sync.h | 2 | ||||
-rw-r--r-- | src/rgw/services/svc_bucket_sync_sobj.cc | 26 | ||||
-rw-r--r-- | src/rgw/services/svc_bucket_sync_sobj.h | 10 | ||||
-rw-r--r-- | src/rgw/services/svc_zone.cc | 59 | ||||
-rw-r--r-- | src/rgw/services/svc_zone.h | 27 |
25 files changed, 524 insertions, 451 deletions
diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index a78b6daf06a..43768e79686 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -1630,13 +1630,13 @@ static int commit_period(RGWRealm& realm, RGWPeriod& period, const string& access, const string& secret, bool force) { - const string& master_zone = period.get_master_zone(); + auto& master_zone = period.get_master_zone(); if (master_zone.empty()) { cerr << "cannot commit period: period does not have a master zone of a master zonegroup" << std::endl; return -EINVAL; } // are we the period's master zone? - if (store->svc()->zone->get_zone_params().get_id() == master_zone) { + if (store->svc()->zone->zone_id() == master_zone) { // read the current period RGWPeriod current_period; int ret = current_period.init(g_ceph_context, store->svc()->sysobj, realm.get_id()); @@ -1655,7 +1655,7 @@ static int commit_period(RGWRealm& realm, RGWPeriod& period, if (remote.empty() && url.empty()) { // use the new master zone's connection - remote = master_zone; + remote = master_zone.id; cout << "Sending period to new master zone " << remote << std::endl; } boost::optional<RGWRESTConn> conn; @@ -1671,7 +1671,7 @@ static int commit_period(RGWRealm& realm, RGWPeriod& period, } // push period to the master with an empty period id - period.set_id(""); + period.set_id(string()); RGWEnv env; req_info info(g_ceph_context, &env); @@ -2007,13 +2007,13 @@ static void get_md_sync_status(list<string>& status) flush_ss(ss, status); } -static void get_data_sync_status(const string& source_zone, list<string>& status, int tab) +static void get_data_sync_status(const rgw_zone_id& source_zone, list<string>& status, int tab) { stringstream ss; RGWZone *sz; - if (!store->svc()->zone->find_zone_by_id(source_zone, &sz)) { + if (!store->svc()->zone->find_zone(source_zone, &sz)) { push_ss(ss, status, tab) << string("zone not found"); flush_ss(ss, status); return; @@ -2205,11 +2205,11 @@ static void sync_status(Formatter *formatter) auto& zone_conn_map = store->svc()->zone->get_zone_conn_map(); for (auto iter : zone_conn_map) { - const string& source_id = iter.first; + const rgw_zone_id& source_id = iter.first; string source_str = "source: "; - string s = source_str + source_id; + string s = source_str + source_id.id; RGWZone *sz; - if (store->svc()->zone->find_zone_by_id(source_id, &sz)) { + if (store->svc()->zone->find_zone(source_id, &sz)) { s += string(" (") + sz->name + ")"; } data_status.push_back(s); @@ -2345,17 +2345,11 @@ static std::vector<string> convert_bucket_set_to_str_vec(const std::set<rgw_buck return std::move(result); } -static void get_hint_entities(const std::set<string>& zone_names, const std::set<rgw_bucket>& buckets, +static void get_hint_entities(const std::set<rgw_zone_id>& zones, const std::set<rgw_bucket>& buckets, std::set<rgw_sync_bucket_entity> *hint_entities) { - for (auto& zone : zone_names) { + for (auto& zone_id : zones) { for (auto& b : buckets) { - string zid; - if (!store->svc()->zone->find_zone_id_by_name(zone, &zid)) { - cerr << "WARNING: cannot find zone id for zone=" << zone << ", skippping" << std::endl; - continue; - } - RGWBucketInfo hint_bucket_info; rgw_bucket hint_bucket; int ret = init_bucket(b, hint_bucket_info, hint_bucket); @@ -2364,27 +2358,33 @@ static void get_hint_entities(const std::set<string>& zone_names, const std::set continue; } - hint_entities->insert(rgw_sync_bucket_entity(zid, hint_bucket)); + hint_entities->insert(rgw_sync_bucket_entity(zone_id, hint_bucket)); } } } -static int sync_info(std::optional<string> opt_target_zone, std::optional<rgw_bucket> opt_bucket, Formatter *formatter) +static rgw_zone_id resolve_zone_id(const string& s) { - string zone_name; - std::optional<string> zone_id; + rgw_zone_id result; - if (opt_target_zone) { - string zid; - if (!store->svc()->zone->find_zone_id_by_name(*opt_target_zone, &zid)) { - cerr << "WARNING: cannot find zone id for zone=" << *opt_target_zone << std::endl; - return -ENOENT; - } - zone_name = *opt_target_zone; - zone_id = zid; - } else { - zone_name = store->svc ()->zone->zone_name(); + RGWZone *zone; + if (store->svc()->zone->find_zone(s, &zone)) { + return rgw_zone_id(s); + } + if (store->svc()->zone->find_zone_id_by_name(s, &result)) { + return result; } + return rgw_zone_id(s); +} + +rgw_zone_id validate_zone_id(const rgw_zone_id& zone_id) +{ + return resolve_zone_id(zone_id.id); +} + +static int sync_info(std::optional<rgw_zone_id> opt_target_zone, std::optional<rgw_bucket> opt_bucket, Formatter *formatter) +{ + rgw_zone_id zone_id = opt_target_zone.value_or(store->svc()->zone->zone_id()); auto zone_policy_handler = store->svc()->zone->get_sync_policy_handler(zone_id); @@ -2431,10 +2431,10 @@ static int sync_info(std::optional<string> opt_target_zone, std::optional<rgw_bu std::set<rgw_sync_bucket_pipe> resolved_sources; std::set<rgw_sync_bucket_pipe> resolved_dests; - rgw_sync_bucket_entity self_entity(zone_name, opt_bucket); + rgw_sync_bucket_entity self_entity(zone_id, opt_bucket); - set<string> source_zones; - set<string> target_zones; + set<rgw_zone_id> source_zones; + set<rgw_zone_id> target_zones; zone_policy_handler->reflect(nullptr, nullptr, nullptr, nullptr, @@ -2453,7 +2453,7 @@ static int sync_info(std::optional<string> opt_target_zone, std::optional<rgw_bu continue; /* shouldn't really happen */ } - auto& zid = *hint_entity.zone; + auto zid = validate_zone_id(*hint_entity.zone); auto& hint_bucket = *hint_entity.bucket; RGWBucketSyncPolicyHandlerRef hint_bucket_handler; @@ -2464,9 +2464,9 @@ static int sync_info(std::optional<string> opt_target_zone, std::optional<rgw_bu } hint_bucket_handler->get_pipes(&resolved_dests, - &resolved_sources, - self_entity); /* flipping resolved dests and sources as these are - relative to the remote entity */ + &resolved_sources, + self_entity); /* flipping resolved dests and sources as these are + relative to the remote entity */ } { @@ -2479,10 +2479,15 @@ static int sync_info(std::optional<string> opt_target_zone, std::optional<rgw_bu encode_json("dests", target_hints_vec, formatter); } { - Formatter::ObjectSection resolved_hints_section(*formatter, "resolved-hints"); + Formatter::ObjectSection resolved_hints_section(*formatter, "resolved-hints-1"); encode_json("sources", resolved_sources, formatter); encode_json("dests", resolved_dests, formatter); } + { + Formatter::ObjectSection resolved_hints_section(*formatter, "resolved-hints"); + encode_json("sources", handler->get_resolved_source_hints(), formatter); + encode_json("dests", handler->get_resolved_dest_hints(), formatter); + } } formatter->flush(cout); @@ -2530,7 +2535,7 @@ static int bucket_sync_info(rgw::sal::RGWRadosStore *store, const RGWBucketInfo& } static int bucket_sync_status(rgw::sal::RGWRadosStore *store, const RGWBucketInfo& info, - const std::string& source_zone_id, + const rgw_zone_id& source_zone_id, std::ostream& out) { const RGWRealm& realm = store->svc()->zone->get_realm(); @@ -2559,7 +2564,7 @@ static int bucket_sync_status(rgw::sal::RGWRadosStore *store, const RGWBucketInf auto& sources = handler->get_sources(); auto& zone_conn_map = store->svc()->zone->get_zone_conn_map(); - set<string> zone_ids; + set<rgw_zone_id> zone_ids; if (!source_zone_id.empty()) { auto z = zonegroup.zones.find(source_zone_id); @@ -2585,7 +2590,7 @@ static int bucket_sync_status(rgw::sal::RGWRadosStore *store, const RGWBucketInf } for (auto& zone_id : zone_ids) { - auto z = zonegroup.zones.find(zone_id); + auto z = zonegroup.zones.find(zone_id.id); if (z == zonegroup.zones.end()) { /* should't happen */ continue; } @@ -2597,7 +2602,7 @@ static int bucket_sync_status(rgw::sal::RGWRadosStore *store, const RGWBucketInf for (auto& m : sources) { for (auto& entry : m.second.pipe_map) { auto& pipe = entry.second; - if (pipe.source.zone.value_or("") == z->second.id) { + if (pipe.source.zone.value_or(rgw_zone_id()) == z->second.id) { bucket_source_sync_status(store, zone, z->second, c->second, info, pipe, @@ -2918,6 +2923,43 @@ public: }; +void resolve_zone_id_opt(std::optional<string>& zone_name, std::optional<rgw_zone_id>& zone_id) +{ + if (!zone_name || zone_id) { + return; + } + zone_id.emplace(); + if (!store->svc()->zone->find_zone_id_by_name(*zone_name, &(*zone_id))) { + cerr << "WARNING: cannot find source zone id for name=" << *zone_name << std::endl; + zone_id = rgw_zone_id(*zone_name); + } +} +void resolve_zone_ids_opt(std::optional<vector<string> >& names, std::optional<vector<rgw_zone_id> >& ids) +{ + if (!names || ids) { + return; + } + ids.emplace(); + for (auto& name : *names) { + rgw_zone_id zid; + if (!store->svc()->zone->find_zone_id_by_name(name, &zid)) { + cerr << "WARNING: cannot find source zone id for name=" << name << std::endl; + zid = rgw_zone_id(name); + } + ids->push_back(zid); + } +} + +static vector<rgw_zone_id> zone_ids_from_str(const string& val) +{ + vector<rgw_zone_id> result; + vector<string> v; + get_str_vec(val, v); + for (auto& z : v) { + result.push_back(rgw_zone_id(z)); + } + return result; +} int main(int argc, const char **argv) { @@ -3066,7 +3108,7 @@ int main(int argc, const char **argv) string err; string source_zone_name; - string source_zone; /* zone id */ + rgw_zone_id source_zone; /* zone id */ string tier_type; bool tier_type_specified = false; @@ -3100,12 +3142,15 @@ int main(int argc, const char **argv) std::optional<string> opt_group_id; std::optional<string> opt_status; std::optional<string> opt_flow_type; - std::optional<vector<string> > opt_zones; + std::optional<vector<string> > opt_zone_names; + std::optional<vector<rgw_zone_id> > opt_zone_ids; std::optional<string> opt_flow_id; std::optional<string> opt_source_zone; std::optional<string> opt_dest_zone; - std::optional<vector<string> > opt_source_zones; - std::optional<vector<string> > opt_dest_zones; + std::optional<vector<string> > opt_source_zone_names; + std::optional<vector<rgw_zone_id> > opt_source_zone_ids; + std::optional<vector<string> > opt_dest_zone_names; + std::optional<vector<rgw_zone_id> > opt_dest_zone_ids; std::optional<string> opt_pipe_id; std::optional<rgw_bucket> opt_bucket; std::optional<string> opt_tenant; @@ -3119,7 +3164,8 @@ int main(int argc, const char **argv) std::optional<string> opt_dest_tenant; std::optional<string> opt_dest_bucket_name; std::optional<string> opt_dest_bucket_id; - std::optional<string> opt_effective_zone; + std::optional<string> opt_effective_zone_name; + std::optional<rgw_zone_id> opt_effective_zone_id; std::optional<string> opt_prefix; std::optional<string> opt_prefix_rm; @@ -3488,18 +3534,24 @@ int main(int argc, const char **argv) opt_status = val; } else if (ceph_argparse_witharg(args, i, &val, "--flow-type", (char*)NULL)) { opt_flow_type = val; - } else if (ceph_argparse_witharg(args, i, &val, "--zones", (char*)NULL)) { + } else if (ceph_argparse_witharg(args, i, &val, "--zones", "--zone-names", (char*)NULL)) { vector<string> v; get_str_vec(val, v); - opt_zones = std::move(v); - } else if (ceph_argparse_witharg(args, i, &val, "--source-zones", (char*)NULL)) { + opt_zone_names = std::move(v); + } else if (ceph_argparse_witharg(args, i, &val, "--zone-ids", (char*)NULL)) { + opt_zone_ids = zone_ids_from_str(val); + } else if (ceph_argparse_witharg(args, i, &val, "--source-zones", "--source-zone-names", (char*)NULL)) { vector<string> v; get_str_vec(val, v); - opt_source_zones = std::move(v); - } else if (ceph_argparse_witharg(args, i, &val, "--dest-zones", (char*)NULL)) { + opt_source_zone_names = std::move(v); + } else if (ceph_argparse_witharg(args, i, &val, "--source-zone-ids", (char*)NULL)) { + opt_source_zone_ids = zone_ids_from_str(val); + } else if (ceph_argparse_witharg(args, i, &val, "--dest-zones", "--dest-zone-names", (char*)NULL)) { vector<string> v; get_str_vec(val, v); - opt_dest_zones = std::move(v); + opt_dest_zone_names = std::move(v); + } else if (ceph_argparse_witharg(args, i, &val, "--dest-zone-ids", (char*)NULL)) { + opt_dest_zone_ids = zone_ids_from_str(val); } else if (ceph_argparse_witharg(args, i, &val, "--flow-id", (char*)NULL)) { opt_flow_id = val; } else if (ceph_argparse_witharg(args, i, &val, "--pipe-id", (char*)NULL)) { @@ -3516,8 +3568,10 @@ int main(int argc, const char **argv) opt_dest_bucket_name = val; } else if (ceph_argparse_witharg(args, i, &val, "--dest-bucket-id", (char*)NULL)) { opt_dest_bucket_id = val; - } else if (ceph_argparse_witharg(args, i, &val, "--effective-zone", (char*)NULL)) { - opt_effective_zone = val; + } else if (ceph_argparse_witharg(args, i, &val, "--effective-zone-name", "--effective-zone", (char*)NULL)) { + opt_effective_zone_name = val; + } else if (ceph_argparse_witharg(args, i, &val, "--effective-zone-id", (char*)NULL)) { + opt_effective_zone_id = rgw_zone_id(val); } else if (ceph_argparse_witharg(args, i, &val, "--prefix", (char*)NULL)) { opt_prefix = val; } else if (ceph_argparse_witharg(args, i, &val, "--prefix-rm", (char*)NULL)) { @@ -3876,7 +3930,7 @@ int main(int argc, const char **argv) } if (remote.empty()) { // use realm master zone as remote - remote = current_period.get_master_zone(); + remote = current_period.get_master_zone().id; } conn = get_remote_conn(store, current_period.get_map(), remote); if (!conn) { @@ -5266,6 +5320,11 @@ int main(int argc, const char **argv) return 0; } + resolve_zone_id_opt(opt_effective_zone_name, opt_effective_zone_id); + resolve_zone_ids_opt(opt_zone_names, opt_zone_ids); + resolve_zone_ids_opt(opt_source_zone_names, opt_source_zone_ids); + resolve_zone_ids_opt(opt_dest_zone_names, opt_dest_zone_ids); + bool non_master_cmd = (!store->svc()->zone->is_meta_master() && !yes_i_really_mean_it); std::set<OPT> non_master_ops_list = {OPT::USER_CREATE, OPT::USER_RM, OPT::USER_MODIFY, OPT::USER_ENABLE, @@ -7489,7 +7548,7 @@ next: } if (opt_cmd == OPT::SYNC_INFO) { - sync_info(opt_effective_zone, opt_bucket, formatter); + sync_info(opt_effective_zone_id, opt_bucket, formatter); } if (opt_cmd == OPT::SYNC_STATUS) { @@ -8075,13 +8134,13 @@ next: auto& group = iter->second; if (symmetrical_flow_opt(*opt_flow_type)) { - CHECK_TRUE(require_non_empty_opt(opt_zones), "ERROR: --zones not provided for symmetrical flow, or is empty", EINVAL); + CHECK_TRUE(require_non_empty_opt(opt_zone_ids), "ERROR: --zones not provided for symmetrical flow, or is empty", EINVAL); rgw_sync_symmetric_group *flow_group; group.data_flow.find_symmetrical(*opt_flow_id, true, &flow_group); - for (auto& z : *opt_zones) { + for (auto& z : *opt_zone_ids) { flow_group->zones.insert(z); } } else { /* directional */ @@ -8125,7 +8184,7 @@ next: auto& group = iter->second; if (symmetrical_flow_opt(*opt_flow_type)) { - group.data_flow.remove_symmetrical(*opt_flow_id, opt_zones); + group.data_flow.remove_symmetrical(*opt_flow_id, opt_zone_ids); } else { /* directional */ CHECK_TRUE(require_non_empty_opt(opt_source_zone), "ERROR: --source-zone not provided for directional flow rule, or is empty", EINVAL); CHECK_TRUE(require_non_empty_opt(opt_dest_zone), "ERROR: --dest-zone not provided for directional flow rule, or is empty", EINVAL); @@ -8146,8 +8205,8 @@ next: CHECK_TRUE(require_opt(opt_group_id), "ERROR: --group-id not specified", EINVAL); CHECK_TRUE(require_opt(opt_pipe_id), "ERROR: --pipe-id not specified", EINVAL); if (opt_cmd == OPT::SYNC_GROUP_PIPE_CREATE) { - CHECK_TRUE(require_non_empty_opt(opt_source_zones), "ERROR: --source-zones not provided or is empty; should be list of zones or '*'", EINVAL); - CHECK_TRUE(require_non_empty_opt(opt_dest_zones), "ERROR: --dest-zones not provided or is empty; should be list of zones or '*'", EINVAL); + CHECK_TRUE(require_non_empty_opt(opt_source_zone_ids), "ERROR: --source-zones not provided or is empty; should be list of zones or '*'", EINVAL); + CHECK_TRUE(require_non_empty_opt(opt_dest_zone_ids), "ERROR: --dest-zones not provided or is empty; should be list of zones or '*'", EINVAL); } SyncPolicyContext sync_policy_ctx(zonegroup_id, zonegroup_name, opt_bucket); @@ -8176,11 +8235,11 @@ next: } } - pipe->source.add_zones(*opt_source_zones); + pipe->source.add_zones(*opt_source_zone_ids); pipe->source.set_bucket(opt_source_tenant, opt_source_bucket_name, opt_source_bucket_id); - pipe->dest.add_zones(*opt_dest_zones); + pipe->dest.add_zones(*opt_dest_zone_ids); pipe->dest.set_bucket(opt_dest_tenant, opt_dest_bucket_name, opt_dest_bucket_id); @@ -8225,25 +8284,25 @@ next: return ENOENT; } - if (opt_source_zones) { - pipe->source.remove_zones(*opt_source_zones); + if (opt_source_zone_ids) { + pipe->source.remove_zones(*opt_source_zone_ids); } pipe->source.remove_bucket(opt_source_tenant, opt_source_bucket_name, opt_source_bucket_id); - if (opt_dest_zones) { - pipe->dest.remove_zones(*opt_dest_zones); + if (opt_dest_zone_ids) { + pipe->dest.remove_zones(*opt_dest_zone_ids); } pipe->dest.remove_bucket(opt_dest_tenant, opt_dest_bucket_name, opt_dest_bucket_id); - if (!(opt_source_zones || + if (!(opt_source_zone_ids || opt_source_tenant || opt_source_bucket || opt_source_bucket_id || - opt_dest_zones || + opt_dest_zone_ids || opt_dest_tenant || opt_dest_bucket || opt_dest_bucket_id)) { diff --git a/src/rgw/rgw_bucket.cc b/src/rgw/rgw_bucket.cc index 4086f0c858b..ac7aa7cf46c 100644 --- a/src/rgw/rgw_bucket.cc +++ b/src/rgw/rgw_bucket.cc @@ -3663,7 +3663,7 @@ int RGWBucketCtl::sync_user_stats(const rgw_user& user_id, return ctl.user->flush_bucket_stats(user_id, *pent); } -int RGWBucketCtl::get_sync_policy_handler(std::optional<string> zone, +int RGWBucketCtl::get_sync_policy_handler(std::optional<rgw_zone_id> zone, std::optional<rgw_bucket> bucket, RGWBucketSyncPolicyHandlerRef *phandler, optional_yield y) diff --git a/src/rgw/rgw_bucket.h b/src/rgw/rgw_bucket.h index 50120cd6ebe..3190a56c482 100644 --- a/src/rgw/rgw_bucket.h +++ b/src/rgw/rgw_bucket.h @@ -869,7 +869,7 @@ public: RGWBucketEnt* pent = nullptr); /* bucket sync */ - int get_sync_policy_handler(std::optional<string> zone, + int get_sync_policy_handler(std::optional<rgw_zone_id> zone, std::optional<rgw_bucket> bucket, RGWBucketSyncPolicyHandlerRef *phandler, optional_yield y); diff --git a/src/rgw/rgw_bucket_sync.cc b/src/rgw/rgw_bucket_sync.cc index 8ec6001bd03..fe0d5eb7e6f 100644 --- a/src/rgw/rgw_bucket_sync.cc +++ b/src/rgw/rgw_bucket_sync.cc @@ -12,7 +12,7 @@ ostream& operator<<(ostream& os, const rgw_sync_bucket_entity& e) { - os << "{b=" << rgw_sync_bucket_entities::bucket_key(e.bucket) << ",z=" << e.zone.value_or("") << ",az=" << (int)e.all_zones << "}"; + os << "{b=" << rgw_sync_bucket_entities::bucket_key(e.bucket) << ",z=" << e.zone.value_or(rgw_zone_id()) << ",az=" << (int)e.all_zones << "}"; return os; } @@ -22,7 +22,7 @@ ostream& operator<<(ostream& os, const rgw_sync_bucket_pipe& pipe) { } ostream& operator<<(ostream& os, const rgw_sync_bucket_entities& e) { - os << "{b=" << rgw_sync_bucket_entities::bucket_key(e.bucket) << ",z=" << e.zones.value_or(std::set<string>()) << "}"; + os << "{b=" << rgw_sync_bucket_entities::bucket_key(e.bucket) << ",z=" << e.zones.value_or(std::set<rgw_zone_id>()) << "}"; return os; } @@ -32,8 +32,8 @@ ostream& operator<<(ostream& os, const rgw_sync_bucket_pipes& pipe) { } static std::vector<rgw_sync_bucket_pipe> filter_relevant_pipes(const std::vector<rgw_sync_bucket_pipes>& pipes, - const string& source_zone, - const string& dest_zone) + const rgw_zone_id& source_zone, + const rgw_zone_id& dest_zone) { std::vector<rgw_sync_bucket_pipe> relevant_pipes; for (auto& p : pipes) { @@ -57,7 +57,7 @@ static bool is_wildcard_bucket(const rgw_bucket& bucket) void rgw_sync_group_pipe_map::dump(ceph::Formatter *f) const { - encode_json("zone", zone, f); + encode_json("zone", zone.id, f); encode_json("buckets", rgw_sync_bucket_entities::bucket_key(bucket), f); encode_json("sources", sources, f); encode_json("dests", dests, f); @@ -65,8 +65,8 @@ void rgw_sync_group_pipe_map::dump(ceph::Formatter *f) const template <typename CB1, typename CB2> -void rgw_sync_group_pipe_map::try_add_to_pipe_map(const string& source_zone, - const string& dest_zone, +void rgw_sync_group_pipe_map::try_add_to_pipe_map(const rgw_zone_id& source_zone, + const rgw_zone_id& dest_zone, const std::vector<rgw_sync_bucket_pipes>& pipes, zb_pipe_map_t *pipe_map, CB1 filter_cb, @@ -87,8 +87,8 @@ void rgw_sync_group_pipe_map::try_add_to_pipe_map(const string& source_zone, } template <typename CB> -void rgw_sync_group_pipe_map::try_add_source(const string& source_zone, - const string& dest_zone, +void rgw_sync_group_pipe_map::try_add_source(const rgw_zone_id& source_zone, + const rgw_zone_id& dest_zone, const std::vector<rgw_sync_bucket_pipes>& pipes, CB filter_cb) { @@ -102,8 +102,8 @@ void rgw_sync_group_pipe_map::try_add_source(const string& source_zone, } template <typename CB> -void rgw_sync_group_pipe_map::try_add_dest(const string& source_zone, - const string& dest_zone, +void rgw_sync_group_pipe_map::try_add_dest(const rgw_zone_id& source_zone, + const rgw_zone_id& dest_zone, const std::vector<rgw_sync_bucket_pipes>& pipes, CB filter_cb) { @@ -119,7 +119,7 @@ void rgw_sync_group_pipe_map::try_add_dest(const string& source_zone, using zb_pipe_map_t = rgw_sync_group_pipe_map::zb_pipe_map_t; pair<zb_pipe_map_t::const_iterator, zb_pipe_map_t::const_iterator> rgw_sync_group_pipe_map::find_pipes(const zb_pipe_map_t& m, - const string& zone, + const rgw_zone_id& zone, std::optional<rgw_bucket> b) const { if (!b) { @@ -141,11 +141,11 @@ pair<zb_pipe_map_t::const_iterator, zb_pipe_map_t::const_iterator> rgw_sync_grou template <typename CB> -void rgw_sync_group_pipe_map::init(const string& _zone, +void rgw_sync_group_pipe_map::init(const rgw_zone_id& _zone, std::optional<rgw_bucket> _bucket, const rgw_sync_policy_group& group, rgw_sync_data_flow_group *_default_flow, - std::set<std::string> *_pall_zones, + std::set<rgw_zone_id> *_pall_zones, CB filter_cb) { zone = _zone; bucket = _bucket; @@ -212,7 +212,7 @@ void rgw_sync_group_pipe_map::init(const string& _zone, /* * find all relevant pipes in our zone that match {dest_bucket} <- {source_zone, source_bucket} */ -vector<rgw_sync_bucket_pipe> rgw_sync_group_pipe_map::find_source_pipes(const string& source_zone, +vector<rgw_sync_bucket_pipe> rgw_sync_group_pipe_map::find_source_pipes(const rgw_zone_id& source_zone, std::optional<rgw_bucket> source_bucket, std::optional<rgw_bucket> dest_bucket) const { vector<rgw_sync_bucket_pipe> result; @@ -233,7 +233,7 @@ vector<rgw_sync_bucket_pipe> rgw_sync_group_pipe_map::find_source_pipes(const st * source bucket in out zone {source_bucket} -> {dest_zone, dest_bucket} */ vector<rgw_sync_bucket_pipe> rgw_sync_group_pipe_map::find_dest_pipes(std::optional<rgw_bucket> source_bucket, - const string& dest_zone, + const rgw_zone_id& dest_zone, std::optional<rgw_bucket> dest_bucket) const { vector<rgw_sync_bucket_pipe> result; @@ -252,9 +252,9 @@ vector<rgw_sync_bucket_pipe> rgw_sync_group_pipe_map::find_dest_pipes(std::optio /* * find all relevant pipes from {source_zone, source_bucket} -> {dest_zone, dest_bucket} */ -vector<rgw_sync_bucket_pipe> rgw_sync_group_pipe_map::find_pipes(const string& source_zone, +vector<rgw_sync_bucket_pipe> rgw_sync_group_pipe_map::find_pipes(const rgw_zone_id& source_zone, std::optional<rgw_bucket> source_bucket, - const string& dest_zone, + const rgw_zone_id& dest_zone, std::optional<rgw_bucket> dest_bucket) const { if (dest_zone == zone) { return find_source_pipes(source_zone, source_bucket, dest_bucket); @@ -371,9 +371,9 @@ void RGWBucketSyncFlowManager::pipe_set::dump(ceph::Formatter *f) const encode_json("pipes", pipe_map, f); } -bool RGWBucketSyncFlowManager::allowed_data_flow(const string& source_zone, +bool RGWBucketSyncFlowManager::allowed_data_flow(const rgw_zone_id& source_zone, std::optional<rgw_bucket> source_bucket, - const string& dest_zone, + const rgw_zone_id& dest_zone, std::optional<rgw_bucket> dest_bucket, bool check_activated) const { @@ -422,12 +422,12 @@ void RGWBucketSyncFlowManager::init(const rgw_sync_policy_info& sync_policy) { auto& group = item.second; auto& flow_group_map = flow_groups[group.id]; - flow_group_map.init(zone_name, bucket, group, + flow_group_map.init(zone_id, bucket, group, (default_flow ? &(*default_flow) : nullptr), &all_zones, - [&](const string& source_zone, + [&](const rgw_zone_id& source_zone, std::optional<rgw_bucket> source_bucket, - const string& dest_zone, + const rgw_zone_id& dest_zone, std::optional<rgw_bucket> dest_bucket) { if (!parent) { return true; @@ -448,7 +448,7 @@ void RGWBucketSyncFlowManager::reflect(std::optional<rgw_bucket> effective_bucke { rgw_sync_bucket_entity entity; - entity.zone = zone_name; + entity.zone = zone_id; entity.bucket = effective_bucket.value_or(rgw_bucket()); if (parent) { @@ -492,9 +492,9 @@ void RGWBucketSyncFlowManager::reflect(std::optional<rgw_bucket> effective_bucke } -RGWBucketSyncFlowManager::RGWBucketSyncFlowManager(const string& _zone_name, +RGWBucketSyncFlowManager::RGWBucketSyncFlowManager(const rgw_zone_id& _zone_id, std::optional<rgw_bucket> _bucket, - const RGWBucketSyncFlowManager *_parent) : zone_name(_zone_name), + const RGWBucketSyncFlowManager *_parent) : zone_id(_zone_id), bucket(_bucket), parent(_parent) {} @@ -511,11 +511,11 @@ void RGWSyncPolicyCompat::convert_old_sync_config(RGWSI_Zone *zone_svc, auto& zonegroup = zone_svc->get_zonegroup(); for (const auto& ziter1 : zonegroup.zones) { - const string& id1 = ziter1.first; + auto& id1 = ziter1.first; const RGWZone& z1 = ziter1.second; for (const auto& ziter2 : zonegroup.zones) { - const string& id2 = ziter2.first; + auto& id2 = ziter2.first; const RGWZone& z2 = ziter2.second; if (id1 == id2) { @@ -525,7 +525,10 @@ void RGWSyncPolicyCompat::convert_old_sync_config(RGWSI_Zone *zone_svc, if (z1.syncs_from(z2.name)) { found = true; rgw_sync_directional_rule *rule; - group.data_flow.find_directional(z2.name, z1.name, true, &rule); + group.data_flow.find_directional(id2, + id1, + true, + &rule); } } } @@ -550,10 +553,10 @@ void RGWSyncPolicyCompat::convert_old_sync_config(RGWSI_Zone *zone_svc, RGWBucketSyncPolicyHandler::RGWBucketSyncPolicyHandler(RGWSI_Zone *_zone_svc, RGWSI_SyncModules *sync_modules_svc, RGWSI_Bucket_Sync *_bucket_sync_svc, - std::optional<string> effective_zone) : zone_svc(_zone_svc) , - bucket_sync_svc(_bucket_sync_svc) { - zone_name = effective_zone.value_or(zone_svc->zone_name()); - flow_mgr.reset(new RGWBucketSyncFlowManager(zone_name, + std::optional<rgw_zone_id> effective_zone) : zone_svc(_zone_svc) , + bucket_sync_svc(_bucket_sync_svc) { + zone_id = effective_zone.value_or(zone_svc->zone_id()); + flow_mgr.reset(new RGWBucketSyncFlowManager(zone_id, nullopt, nullptr)); sync_policy = zone_svc->get_zonegroup().sync_policy; @@ -572,7 +575,7 @@ RGWBucketSyncPolicyHandler::RGWBucketSyncPolicyHandler(const RGWBucketSyncPolicy bucket = _bucket_info.bucket; zone_svc = parent->zone_svc; bucket_sync_svc = parent->bucket_sync_svc; - flow_mgr.reset(new RGWBucketSyncFlowManager(parent->zone_name, + flow_mgr.reset(new RGWBucketSyncFlowManager(parent->zone_id, _bucket_info.bucket, parent->flow_mgr.get())); } @@ -586,7 +589,7 @@ RGWBucketSyncPolicyHandler::RGWBucketSyncPolicyHandler(const RGWBucketSyncPolicy bucket = _bucket; zone_svc = parent->zone_svc; bucket_sync_svc = parent->bucket_sync_svc; - flow_mgr.reset(new RGWBucketSyncFlowManager(parent->zone_name, + flow_mgr.reset(new RGWBucketSyncFlowManager(parent->zone_id, _bucket, parent->flow_mgr.get())); } @@ -616,8 +619,8 @@ int RGWBucketSyncPolicyHandler::init(optional_yield y) flow_mgr->init(sync_policy); - reflect(&sources_by_name, - &targets_by_name, + reflect(&source_pipes, + &target_pipes, &sources, &targets, &source_zones, @@ -627,57 +630,46 @@ int RGWBucketSyncPolicyHandler::init(optional_yield y) return 0; } -void RGWBucketSyncPolicyHandler::reflect(RGWBucketSyncFlowManager::pipe_set *psources_by_name, - RGWBucketSyncFlowManager::pipe_set *ptargets_by_name, - map<string, RGWBucketSyncFlowManager::pipe_set> *psources, - map<string, RGWBucketSyncFlowManager::pipe_set> *ptargets, - std::set<string> *psource_zones, - std::set<string> *ptarget_zones, +void RGWBucketSyncPolicyHandler::reflect(RGWBucketSyncFlowManager::pipe_set *psource_pipes, + RGWBucketSyncFlowManager::pipe_set *ptarget_pipes, + map<rgw_zone_id, RGWBucketSyncFlowManager::pipe_set> *psources, + map<rgw_zone_id, RGWBucketSyncFlowManager::pipe_set> *ptargets, + std::set<rgw_zone_id> *psource_zones, + std::set<rgw_zone_id> *ptarget_zones, bool only_enabled) const { - RGWBucketSyncFlowManager::pipe_set _sources_by_name; - RGWBucketSyncFlowManager::pipe_set _targets_by_name; - map<string, RGWBucketSyncFlowManager::pipe_set> _sources; - map<string, RGWBucketSyncFlowManager::pipe_set> _targets; - std::set<string> _source_zones; - std::set<string> _target_zones; + RGWBucketSyncFlowManager::pipe_set _source_pipes; + RGWBucketSyncFlowManager::pipe_set _target_pipes; + map<rgw_zone_id, RGWBucketSyncFlowManager::pipe_set> _sources; + map<rgw_zone_id, RGWBucketSyncFlowManager::pipe_set> _targets; + std::set<rgw_zone_id> _source_zones; + std::set<rgw_zone_id> _target_zones; - flow_mgr->reflect(bucket, &_sources_by_name, &_targets_by_name, only_enabled); + flow_mgr->reflect(bucket, &_source_pipes, &_target_pipes, only_enabled); - for (auto& entry : _sources_by_name.pipe_map) { + for (auto& entry : _source_pipes.pipe_map) { auto& pipe = entry.second; if (!pipe.source.zone) { continue; } _source_zones.insert(*pipe.source.zone); - rgw_sync_bucket_pipe new_pipe = pipe; - string zone_id; - - if (zone_svc->find_zone_id_by_name(*pipe.source.zone, &zone_id)) { - new_pipe.source.zone = zone_id; - } - _sources[*new_pipe.source.zone].insert(new_pipe); + _sources[*pipe.source.zone].insert(pipe); } - for (auto& entry : _targets_by_name.pipe_map) { + for (auto& entry : _target_pipes.pipe_map) { auto& pipe = entry.second; if (!pipe.dest.zone) { continue; } _target_zones.insert(*pipe.dest.zone); - rgw_sync_bucket_pipe new_pipe = pipe; - string zone_id; - if (zone_svc->find_zone_id_by_name(*pipe.dest.zone, &zone_id)) { - new_pipe.dest.zone = zone_id; - } - _targets[*new_pipe.dest.zone].insert(new_pipe); + _targets[*pipe.dest.zone].insert(pipe); } - if (psources_by_name) { - *psources_by_name = std::move(_sources_by_name); + if (psource_pipes) { + *psource_pipes = std::move(_source_pipes); } - if (ptargets_by_name) { - *ptargets_by_name = std::move(_targets_by_name); + if (ptarget_pipes) { + *ptarget_pipes = std::move(_target_pipes); } if (psources) { *psources = std::move(_sources); @@ -693,21 +685,21 @@ void RGWBucketSyncPolicyHandler::reflect(RGWBucketSyncFlowManager::pipe_set *pso } } -void RGWBucketSyncPolicyHandler::get_pipes(std::set<rgw_sync_bucket_pipe> *sources, std::set<rgw_sync_bucket_pipe> *targets, - std::optional<rgw_sync_bucket_entity> filter_peer) { /* return raw pipes (with zone name) */ - for (auto& entry : sources_by_name.pipe_map) { +void RGWBucketSyncPolicyHandler::get_pipes(std::set<rgw_sync_bucket_pipe> *_sources, std::set<rgw_sync_bucket_pipe> *_targets, + std::optional<rgw_sync_bucket_entity> filter_peer) { /* return raw pipes */ + for (auto& entry : source_pipes.pipe_map) { auto& source_pipe = entry.second; if (!filter_peer || source_pipe.source.match(*filter_peer)) { - sources->insert(source_pipe); + _sources->insert(source_pipe); } } - for (auto& entry : targets_by_name.pipe_map) { + for (auto& entry : target_pipes.pipe_map) { auto& target_pipe = entry.second; if (!filter_peer || target_pipe.dest.match(*filter_peer)) { - targets->insert(target_pipe); + _targets->insert(target_pipe); } } } diff --git a/src/rgw/rgw_bucket_sync.h b/src/rgw/rgw_bucket_sync.h index 8f8ea1cb32d..ceb1c14b909 100644 --- a/src/rgw/rgw_bucket_sync.h +++ b/src/rgw/rgw_bucket_sync.h @@ -28,7 +28,7 @@ struct rgw_sync_bucket_pipes; struct rgw_sync_policy_info; struct rgw_sync_group_pipe_map { - string zone; + rgw_zone_id zone; std::optional<rgw_bucket> bucket; rgw_sync_policy_group::Status status{rgw_sync_policy_group::Status::FORBIDDEN}; @@ -38,7 +38,7 @@ struct rgw_sync_group_pipe_map { zb_pipe_map_t sources; /* all the pipes where zone is pulling from */ zb_pipe_map_t dests; /* all the pipes that pull from zone */ - std::set<string> *pall_zones{nullptr}; + std::set<rgw_zone_id> *pall_zones{nullptr}; rgw_sync_data_flow_group *default_flow{nullptr}; /* flow to use if policy doesn't define it, used in the case of bucket sync policy, not at the zonegroup level */ @@ -46,41 +46,41 @@ struct rgw_sync_group_pipe_map { void dump(ceph::Formatter *f) const; template <typename CB1, typename CB2> - void try_add_to_pipe_map(const string& source_zone, - const string& dest_zone, + void try_add_to_pipe_map(const rgw_zone_id& source_zone, + const rgw_zone_id& dest_zone, const std::vector<rgw_sync_bucket_pipes>& pipes, zb_pipe_map_t *pipe_map, CB1 filter_cb, CB2 call_filter_cb); template <typename CB> - void try_add_source(const string& source_zone, - const string& dest_zone, + void try_add_source(const rgw_zone_id& source_zone, + const rgw_zone_id& dest_zone, const std::vector<rgw_sync_bucket_pipes>& pipes, CB filter_cb); template <typename CB> - void try_add_dest(const string& source_zone, - const string& dest_zone, + void try_add_dest(const rgw_zone_id& source_zone, + const rgw_zone_id& dest_zone, const std::vector<rgw_sync_bucket_pipes>& pipes, CB filter_cb); pair<zb_pipe_map_t::const_iterator, zb_pipe_map_t::const_iterator> find_pipes(const zb_pipe_map_t& m, - const string& zone, + const rgw_zone_id& zone, std::optional<rgw_bucket> b) const; template <typename CB> - void init(const string& _zone, + void init(const rgw_zone_id& _zone, std::optional<rgw_bucket> _bucket, const rgw_sync_policy_group& group, rgw_sync_data_flow_group *_default_flow, - std::set<std::string> *_pall_zones, + std::set<rgw_zone_id> *_pall_zones, CB filter_cb); /* * find all relevant pipes in our zone that match {dest_bucket} <- {source_zone, source_bucket} */ - vector<rgw_sync_bucket_pipe> find_source_pipes(const string& source_zone, + vector<rgw_sync_bucket_pipe> find_source_pipes(const rgw_zone_id& source_zone, std::optional<rgw_bucket> source_bucket, std::optional<rgw_bucket> dest_bucket) const; @@ -89,15 +89,15 @@ struct rgw_sync_group_pipe_map { * source bucket in out zone {source_bucket} -> {dest_zone, dest_bucket} */ vector<rgw_sync_bucket_pipe> find_dest_pipes(std::optional<rgw_bucket> source_bucket, - const string& dest_zone, + const rgw_zone_id& dest_zone, std::optional<rgw_bucket> dest_bucket) const; /* * find all relevant pipes from {source_zone, source_bucket} -> {dest_zone, dest_bucket} */ - vector<rgw_sync_bucket_pipe> find_pipes(const string& source_zone, + vector<rgw_sync_bucket_pipe> find_pipes(const rgw_zone_id& source_zone, std::optional<rgw_bucket> source_bucket, - const string& dest_zone, + const rgw_zone_id& dest_zone, std::optional<rgw_bucket> dest_bucket) const; }; @@ -216,18 +216,18 @@ public: private: - string zone_name; + rgw_zone_id zone_id; std::optional<rgw_bucket> bucket; const RGWBucketSyncFlowManager *parent{nullptr}; map<string, rgw_sync_group_pipe_map> flow_groups; - std::set<std::string> all_zones; + std::set<rgw_zone_id> all_zones; - bool allowed_data_flow(const string& source_zone, + bool allowed_data_flow(const rgw_zone_id& source_zone, std::optional<rgw_bucket> source_bucket, - const string& dest_zone, + const rgw_zone_id& dest_zone, std::optional<rgw_bucket> dest_bucket, bool check_activated) const; @@ -240,7 +240,7 @@ private: public: - RGWBucketSyncFlowManager(const string& _zone_name, + RGWBucketSyncFlowManager(const rgw_zone_id& _zone_id, std::optional<rgw_bucket> _bucket, const RGWBucketSyncFlowManager *_parent); @@ -260,20 +260,20 @@ class RGWBucketSyncPolicyHandler { const RGWBucketSyncPolicyHandler *parent{nullptr}; RGWSI_Zone *zone_svc; RGWSI_Bucket_Sync *bucket_sync_svc; - string zone_name; + rgw_zone_id zone_id; std::optional<RGWBucketInfo> bucket_info; std::optional<rgw_bucket> bucket; std::unique_ptr<RGWBucketSyncFlowManager> flow_mgr; rgw_sync_policy_info sync_policy; - RGWBucketSyncFlowManager::pipe_set sources_by_name; - RGWBucketSyncFlowManager::pipe_set targets_by_name; + RGWBucketSyncFlowManager::pipe_set source_pipes; + RGWBucketSyncFlowManager::pipe_set target_pipes; - map<string, RGWBucketSyncFlowManager::pipe_set> sources; /* source pipes by source zone id */ - map<string, RGWBucketSyncFlowManager::pipe_set> targets; /* target pipes by target zone id */ + map<rgw_zone_id, RGWBucketSyncFlowManager::pipe_set> sources; /* source pipes by source zone id */ + map<rgw_zone_id, RGWBucketSyncFlowManager::pipe_set> targets; /* target pipes by target zone id */ - std::set<string> source_zones; /* source zones by name */ - std::set<string> target_zones; /* target zones by name */ + std::set<rgw_zone_id> source_zones; + std::set<rgw_zone_id> target_zones; std::set<rgw_bucket> source_hints; std::set<rgw_bucket> target_hints; @@ -299,7 +299,7 @@ public: RGWBucketSyncPolicyHandler(RGWSI_Zone *_zone_svc, RGWSI_SyncModules *sync_modules_svc, RGWSI_Bucket_Sync *bucket_sync_svc, - std::optional<string> effective_zone = std::nullopt); + std::optional<rgw_zone_id> effective_zone = std::nullopt); RGWBucketSyncPolicyHandler *alloc_child(const RGWBucketInfo& bucket_info) const; RGWBucketSyncPolicyHandler *alloc_child(const rgw_bucket& bucket, @@ -307,12 +307,12 @@ public: int init(optional_yield y); - void reflect(RGWBucketSyncFlowManager::pipe_set *psources_by_name, - RGWBucketSyncFlowManager::pipe_set *ptargets_by_name, - map<string, RGWBucketSyncFlowManager::pipe_set> *psources, - map<string, RGWBucketSyncFlowManager::pipe_set> *ptargets, - std::set<string> *psource_zones, - std::set<string> *ptarget_zones, + void reflect(RGWBucketSyncFlowManager::pipe_set *psource_pipes, + RGWBucketSyncFlowManager::pipe_set *ptarget_pipes, + map<rgw_zone_id, RGWBucketSyncFlowManager::pipe_set> *psources, + map<rgw_zone_id, RGWBucketSyncFlowManager::pipe_set> *ptargets, + std::set<rgw_zone_id> *psource_zones, + std::set<rgw_zone_id> *ptarget_zones, bool only_enabled) const; void set_resolved_hints(std::set<rgw_sync_bucket_pipe>&& _resolved_sources, @@ -329,19 +329,19 @@ public: return resolved_dests; } - const std::set<string>& get_source_zones() const { + const std::set<rgw_zone_id>& get_source_zones() const { return source_zones; } - const std::set<string>& get_target_zones() const { + const std::set<rgw_zone_id>& get_target_zones() const { return target_zones; } - const map<string, RGWBucketSyncFlowManager::pipe_set>& get_sources() { + const map<rgw_zone_id, RGWBucketSyncFlowManager::pipe_set>& get_sources() { return sources; } - const map<string, RGWBucketSyncFlowManager::pipe_set>& get_targets() { + const map<rgw_zone_id, RGWBucketSyncFlowManager::pipe_set>& get_targets() { return targets; } @@ -349,9 +349,9 @@ public: return bucket_info; } - void get_pipes(RGWBucketSyncFlowManager::pipe_set **sources, RGWBucketSyncFlowManager::pipe_set **targets) { /* return raw pipes (with zone name) */ - *sources = &sources_by_name; - *targets = &targets_by_name; + void get_pipes(RGWBucketSyncFlowManager::pipe_set **_sources, RGWBucketSyncFlowManager::pipe_set **_targets) { /* return raw pipes (with zone name) */ + *_sources = &source_pipes; + *_targets = &target_pipes; } void get_pipes(std::set<rgw_sync_bucket_pipe> *sources, std::set<rgw_sync_bucket_pipe> *targets, std::optional<rgw_sync_bucket_entity> filter_peer); diff --git a/src/rgw/rgw_common.cc b/src/rgw/rgw_common.cc index 4d8af33f3cc..7e9cfb8e0a5 100644 --- a/src/rgw/rgw_common.cc +++ b/src/rgw/rgw_common.cc @@ -2065,3 +2065,13 @@ bool RGWBucketInfo::empty_sync_policy() const return sync_policy->empty(); } +void encode_json(const char *name, const rgw_zone_id& zid, Formatter *f) +{ + encode_json(name, zid.id, f); +} + +void decode_json_obj(rgw_zone_id& zid, JSONObj *obj) +{ + decode_json_obj(zid.id, obj); +} + diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index 0df1d90ec15..2aa72159ba5 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -2662,4 +2662,70 @@ int decode_bl(bufferlist& bl, T& t) return 0; } +/* + * should avoid encoding rgw_opt_zone_nid, and rgw_zone_nid, + * these should be used for run time representation of zone, + * but internally we should keep zone ids + */ +struct rgw_opt_zone_nid { + std::optional<string> id; + std::optional<string> name; +}; + +struct rgw_zone_nid { + string id; + string name; +}; + +struct rgw_zone_id { + string id; + + rgw_zone_id() {} + rgw_zone_id(const string& _id) : id(_id) {} + rgw_zone_id(string&& _id) : id(std::move(_id)) {} + + void encode(bufferlist& bl) const { + /* backward compatiblity, not using ENCODE_{START,END} macros */ + ceph::encode(id, bl); + } + + void decode(bufferlist::const_iterator& bl) { + /* backward compatiblity, not using DECODE_{START,END} macros */ + ceph::decode(id, bl); + } + + void clear() { + id.clear(); + } + + bool operator==(const string& _id) const { + return (id == _id); + } + bool operator==(const rgw_zone_id& zid) const { + return (id == zid.id); + } + bool operator!=(const rgw_zone_id& zid) const { + return (id != zid.id); + } + bool operator<(const rgw_zone_id& zid) const { + return (id < zid.id); + } + bool operator>(const rgw_zone_id& zid) const { + return (id > zid.id); + } + + bool empty() const { + return id.empty(); + } +}; +WRITE_CLASS_ENCODER(rgw_zone_id) + +static inline ostream& operator<<(ostream& os, const rgw_zone_id& zid) { + os << zid.id; + return os; +} + +void encode_json(const char *name, const rgw_zone_id& zid, Formatter *f); +void decode_json_obj(rgw_zone_id& zid, JSONObj *obj); + #endif diff --git a/src/rgw/rgw_cr_rados.h b/src/rgw/rgw_cr_rados.h index 63109879cb2..5b689e6d493 100644 --- a/src/rgw/rgw_cr_rados.h +++ b/src/rgw/rgw_cr_rados.h @@ -918,7 +918,7 @@ class RGWRadosBILogTrimCR : public RGWSimpleCoroutine { class RGWAsyncFetchRemoteObj : public RGWAsyncRadosRequest { rgw::sal::RGWRadosStore *store; - string source_zone; + rgw_zone_id source_zone; rgw_bucket src_bucket; std::optional<rgw_placement_rule> dest_placement_rule; @@ -939,7 +939,7 @@ protected: int _send_request() override; public: RGWAsyncFetchRemoteObj(RGWCoroutine *caller, RGWAioCompletionNotifier *cn, rgw::sal::RGWRadosStore *_store, - const string& _source_zone, + const rgw_zone_id& _source_zone, const rgw_bucket& _src_bucket, std::optional<rgw_placement_rule> _dest_placement_rule, const RGWBucketInfo& _dest_bucket_info, @@ -969,7 +969,7 @@ class RGWFetchRemoteObjCR : public RGWSimpleCoroutine { CephContext *cct; RGWAsyncRadosProcessor *async_rados; rgw::sal::RGWRadosStore *store; - string source_zone; + rgw_zone_id source_zone; rgw_bucket src_bucket; std::optional<rgw_placement_rule> dest_placement_rule; @@ -990,7 +990,7 @@ class RGWFetchRemoteObjCR : public RGWSimpleCoroutine { public: RGWFetchRemoteObjCR(RGWAsyncRadosProcessor *_async_rados, rgw::sal::RGWRadosStore *_store, - const string& _source_zone, + const rgw_zone_id& _source_zone, const rgw_bucket& _src_bucket, std::optional<rgw_placement_rule> _dest_placement_rule, const RGWBucketInfo& _dest_bucket_info, @@ -1039,7 +1039,7 @@ public: class RGWAsyncStatRemoteObj : public RGWAsyncRadosRequest { rgw::sal::RGWRadosStore *store; - string source_zone; + rgw_zone_id source_zone; rgw_bucket src_bucket; rgw_obj_key key; @@ -1054,7 +1054,7 @@ protected: int _send_request() override; public: RGWAsyncStatRemoteObj(RGWCoroutine *caller, RGWAioCompletionNotifier *cn, rgw::sal::RGWRadosStore *_store, - const string& _source_zone, + const rgw_zone_id& _source_zone, rgw_bucket& _src_bucket, const rgw_obj_key& _key, ceph::real_time *_pmtime, @@ -1076,7 +1076,7 @@ class RGWStatRemoteObjCR : public RGWSimpleCoroutine { CephContext *cct; RGWAsyncRadosProcessor *async_rados; rgw::sal::RGWRadosStore *store; - string source_zone; + rgw_zone_id source_zone; rgw_bucket src_bucket; rgw_obj_key key; @@ -1091,7 +1091,7 @@ class RGWStatRemoteObjCR : public RGWSimpleCoroutine { public: RGWStatRemoteObjCR(RGWAsyncRadosProcessor *_async_rados, rgw::sal::RGWRadosStore *_store, - const string& _source_zone, + const rgw_zone_id& _source_zone, rgw_bucket& _src_bucket, const rgw_obj_key& _key, ceph::real_time *_pmtime, @@ -1136,7 +1136,7 @@ public: class RGWAsyncRemoveObj : public RGWAsyncRadosRequest { rgw::sal::RGWRadosStore *store; - string source_zone; + rgw_zone_id source_zone; RGWBucketInfo bucket_info; @@ -1155,7 +1155,7 @@ protected: int _send_request() override; public: RGWAsyncRemoveObj(RGWCoroutine *caller, RGWAioCompletionNotifier *cn, rgw::sal::RGWRadosStore *_store, - const string& _source_zone, + const rgw_zone_id& _source_zone, RGWBucketInfo& _bucket_info, const rgw_obj_key& _key, const string& _owner, @@ -1189,7 +1189,7 @@ class RGWRemoveObjCR : public RGWSimpleCoroutine { CephContext *cct; RGWAsyncRadosProcessor *async_rados; rgw::sal::RGWRadosStore *store; - string source_zone; + rgw_zone_id source_zone; RGWBucketInfo bucket_info; @@ -1209,7 +1209,7 @@ class RGWRemoveObjCR : public RGWSimpleCoroutine { public: RGWRemoveObjCR(RGWAsyncRadosProcessor *_async_rados, rgw::sal::RGWRadosStore *_store, - const string& _source_zone, + const rgw_zone_id& _source_zone, RGWBucketInfo& _bucket_info, const rgw_obj_key& _key, bool _versioned, diff --git a/src/rgw/rgw_cr_tools.h b/src/rgw/rgw_cr_tools.h index ccbd4a4d0ff..28bee86ef4b 100644 --- a/src/rgw/rgw_cr_tools.h +++ b/src/rgw/rgw_cr_tools.h @@ -76,7 +76,7 @@ struct rgw_bucket_lifecycle_config_params { using RGWBucketLifecycleConfigCR = RGWSimpleWriteOnlyAsyncCR<rgw_bucket_lifecycle_config_params>; struct rgw_bucket_get_sync_policy_params { - std::optional<string> zone; + std::optional<rgw_zone_id> zone; std::optional<rgw_bucket> bucket; }; diff --git a/src/rgw/rgw_data_sync.cc b/src/rgw/rgw_data_sync.cc index 385d84c66c7..e0665db8811 100644 --- a/src/rgw/rgw_data_sync.cc +++ b/src/rgw/rgw_data_sync.cc @@ -533,7 +533,7 @@ public: /* fetch current position in logs */ yield { - RGWRESTConn *conn = sync_env->svc->zone->get_zone_conn_by_id(sc->source_zone); + RGWRESTConn *conn = sync_env->svc->zone->get_zone_conn(sc->source_zone); if (!conn) { tn->log(0, SSTR("ERROR: connection to zone " << sc->source_zone << " does not exist!")); return set_cr_error(-EIO); @@ -631,7 +631,7 @@ int RGWRemoteDataLog::read_source_log_shards_next(map<int, string> shard_markers return run(new RGWListRemoteDataLogCR(&sc, shard_markers, 1, result)); } -int RGWRemoteDataLog::init(const string& _source_zone, RGWRESTConn *_conn, RGWSyncErrorLogger *_error_logger, +int RGWRemoteDataLog::init(const rgw_zone_id& _source_zone, RGWRESTConn *_conn, RGWSyncErrorLogger *_error_logger, RGWSyncTraceManager *_sync_tracer, RGWSyncModuleInstanceRef& _sync_module, PerfCounters* counters) { @@ -738,10 +738,10 @@ int RGWRemoteDataLog::init_sync_status(int num_shards) return ret; } -static string full_data_sync_index_shard_oid(const string& source_zone, int shard_id) +static string full_data_sync_index_shard_oid(const rgw_zone_id& source_zone, int shard_id) { - char buf[datalog_sync_full_sync_index_prefix.size() + 1 + source_zone.size() + 1 + 16]; - snprintf(buf, sizeof(buf), "%s.%s.%d", datalog_sync_full_sync_index_prefix.c_str(), source_zone.c_str(), shard_id); + char buf[datalog_sync_full_sync_index_prefix.size() + 1 + source_zone.id.size() + 1 + 16]; + snprintf(buf, sizeof(buf), "%s.%s.%d", datalog_sync_full_sync_index_prefix.c_str(), source_zone.id.c_str(), shard_id); return string(buf); } @@ -810,7 +810,7 @@ public: rgw_data_sync_status *_sync_status) : RGWCoroutine(_sc->cct), sc(_sc), sync_env(_sc->env), store(sync_env->store), sync_status(_sync_status), req_ret(0), ret(0), entries_index(NULL), i(0), failed(false), truncated(false) { - oid_prefix = datalog_sync_full_sync_index_prefix + "." + sc->source_zone; + oid_prefix = datalog_sync_full_sync_index_prefix + "." + sc->source_zone.id; path = "/admin/metadata/bucket.instance"; num_shards = sync_status->sync_info.num_shards; } @@ -1054,7 +1054,7 @@ private: bool _has_bucket_info{false}; public: - string zone; + rgw_zone_id zone; rgw_sync_pipe_info_entity() {} rgw_sync_pipe_info_entity(const rgw_sync_bucket_entity& e, @@ -1245,7 +1245,7 @@ class RGWRunBucketSourcesSyncCR : public RGWCoroutine { RGWDataSyncCtx *cur_sc{nullptr}; RGWRESTConn *conn{nullptr}; - string last_zone; + rgw_zone_id last_zone; int ret{0}; @@ -2158,7 +2158,7 @@ int RGWDataSyncStatusManager::init() { RGWZone *zone_def; - if (!store->svc()->zone->find_zone_by_id(source_zone, &zone_def)) { + if (!store->svc()->zone->find_zone(source_zone, &zone_def)) { ldpp_dout(this, 0) << "ERROR: failed to find zone config info for zone=" << source_zone << dendl; return -EIO; } @@ -2173,7 +2173,7 @@ int RGWDataSyncStatusManager::init() sync_module = store->getRados()->get_sync_module(); } - conn = store->svc()->zone->get_zone_conn_by_id(source_zone); + conn = store->svc()->zone->get_zone_conn(source_zone); if (!conn) { ldpp_dout(this, 0) << "connection object to zone " << source_zone << " does not exist" << dendl; return -EINVAL; @@ -2219,22 +2219,22 @@ unsigned RGWDataSyncStatusManager::get_subsys() const std::ostream& RGWDataSyncStatusManager::gen_prefix(std::ostream& out) const { - auto zone = std::string_view{source_zone}; + auto zone = std::string_view{source_zone.id}; return out << "data sync zone:" << zone.substr(0, 8) << ' '; } -string RGWDataSyncStatusManager::sync_status_oid(const string& source_zone) +string RGWDataSyncStatusManager::sync_status_oid(const rgw_zone_id& source_zone) { - char buf[datalog_sync_status_oid_prefix.size() + source_zone.size() + 16]; - snprintf(buf, sizeof(buf), "%s.%s", datalog_sync_status_oid_prefix.c_str(), source_zone.c_str()); + char buf[datalog_sync_status_oid_prefix.size() + source_zone.id.size() + 16]; + snprintf(buf, sizeof(buf), "%s.%s", datalog_sync_status_oid_prefix.c_str(), source_zone.id.c_str()); return string(buf); } -string RGWDataSyncStatusManager::shard_obj_name(const string& source_zone, int shard_id) +string RGWDataSyncStatusManager::shard_obj_name(const rgw_zone_id& source_zone, int shard_id) { - char buf[datalog_sync_status_shard_prefix.size() + source_zone.size() + 16]; - snprintf(buf, sizeof(buf), "%s.%s.%d", datalog_sync_status_shard_prefix.c_str(), source_zone.c_str(), shard_id); + char buf[datalog_sync_status_shard_prefix.size() + source_zone.id.size() + 16]; + snprintf(buf, sizeof(buf), "%s.%s.%d", datalog_sync_status_shard_prefix.c_str(), source_zone.id.c_str(), shard_id); return string(buf); } @@ -2335,7 +2335,7 @@ public: RGWRemoteBucketManager::RGWRemoteBucketManager(const DoutPrefixProvider *_dpp, RGWDataSyncEnv *_sync_env, - const string& _source_zone, + const rgw_zone_id& _source_zone, RGWRESTConn *_conn, const RGWBucketInfo& source_bucket_info, const rgw_bucket& dest_bucket) : dpp(_dpp), sync_env(_sync_env) @@ -2655,7 +2655,7 @@ RGWCoroutine *RGWRemoteBucketManager::read_sync_status_cr(int num, rgw_bucket_sh } RGWBucketPipeSyncStatusManager::RGWBucketPipeSyncStatusManager(rgw::sal::RGWRadosStore *_store, - std::optional<string> _source_zone, + std::optional<rgw_zone_id> _source_zone, std::optional<rgw_bucket> _source_bucket, const rgw_bucket& _dest_bucket) : store(_store), cr_mgr(_store->ctx(), _store->getRados()->get_cr_registry()), @@ -3203,7 +3203,7 @@ public: status_oid(status_oid), tn(sync_env->sync_tracer->add_node(tn_parent, "full_sync", SSTR(bucket_shard_str{bs}))) { - zones_trace.insert(sc->source_zone, sync_pipe.info.dest_bs.bucket.get_key()); + zones_trace.insert(sc->source_zone.id, sync_pipe.info.dest_bs.bucket.get_key()); marker_tracker.set_tn(tn); prefix_handler.set_rules(sync_pipe.get_rules()); } @@ -3348,7 +3348,7 @@ class RGWBucketShardIncrementalSyncCR : public RGWCoroutine { RGWBucketIncSyncShardMarkerTrack marker_tracker; bool updated_status{false}; const string& status_oid; - const string& zone_id; + rgw_zone_id zone_id; string target_location_key; string cur_id; @@ -3434,7 +3434,7 @@ int RGWBucketShardIncrementalSyncCR::operate() if (e.state != CLS_RGW_STATE_COMPLETE) { continue; } - if (e.zones_trace.exists(zone_id, target_location_key)) { + if (e.zones_trace.exists(zone_id.id, target_location_key)) { continue; } auto& squash_entry = squash_map[make_pair(e.object, e.instance)]; @@ -3508,7 +3508,7 @@ int RGWBucketShardIncrementalSyncCR::operate() marker_tracker.try_update_high_marker(cur_id, 0, entry->timestamp); continue; } - if (entry->zones_trace.exists(zone_id, target_location_key)) { + if (entry->zones_trace.exists(zone_id.id, target_location_key)) { set_status() << "redundant operation, skipping"; tn->log(20, SSTR("skipping object: " <<bucket_shard_str{bs} <<"/"<<key<<": redundant operation")); @@ -3629,66 +3629,11 @@ int RGWBucketShardIncrementalSyncCR::operate() return 0; } -struct rgw_bucket_sync_source_local_info { - string id; - string type; - string zone; - rgw_bucket bucket; - /* FIXME: config */ - - void encode(bufferlist& bl) const { - ENCODE_START(1, 1, bl); - encode(id, bl); - encode(type, bl); - encode(zone, bl); - encode(bucket, bl); - ENCODE_FINISH(bl); - } - - void decode(bufferlist::const_iterator& bl) { - DECODE_START(1, bl); - decode(id, bl); - decode(type, bl); - decode(zone, bl); - decode(bucket, bl); - DECODE_FINISH(bl); - } - void dump(ceph::Formatter *f) const { - encode_json("id", id, f); - encode_json("type", type, f); - encode_json("zone", zone, f); - encode_json("bucket", bucket, f); - } -}; -WRITE_CLASS_ENCODER(rgw_bucket_sync_source_local_info) - -struct rgw_bucket_sync_sources_local_info { - map<string, rgw_bucket_sync_source_local_info> sources; /* id -> source */ - - void encode(bufferlist& bl) const { - ENCODE_START(1, 1, bl); - encode(sources, bl); - ENCODE_FINISH(bl); - } - - void decode(bufferlist::const_iterator& bl) { - DECODE_START(1, bl); - decode(sources, bl); - DECODE_FINISH(bl); - } - - void dump(ceph::Formatter *f) const { - encode_json("sources", sources, f); - } -}; -WRITE_CLASS_ENCODER(rgw_bucket_sync_sources_local_info) - - class RGWGetBucketPeersCR : public RGWCoroutine { RGWDataSyncEnv *sync_env; std::optional<rgw_bucket> target_bucket; - std::optional<string> source_zone; + std::optional<rgw_zone_id> source_zone; std::optional<rgw_bucket> source_bucket; rgw_sync_pipe_info_set *pipes; @@ -3705,9 +3650,9 @@ class RGWGetBucketPeersCR : public RGWCoroutine { RGWSyncTraceNodeRef tn; - using pipe_const_iter = map<string, RGWBucketSyncFlowManager::pipe_set>::const_iterator; + using pipe_const_iter = map<rgw_zone_id, RGWBucketSyncFlowManager::pipe_set>::const_iterator; - static pair<pipe_const_iter, pipe_const_iter> get_pipe_iters(const map<string, RGWBucketSyncFlowManager::pipe_set>& m, std::optional<string> zone) { + static pair<pipe_const_iter, pipe_const_iter> get_pipe_iters(const map<rgw_zone_id, RGWBucketSyncFlowManager::pipe_set>& m, std::optional<rgw_zone_id> zone) { if (!zone) { return { m.begin(), m.end() }; } @@ -3719,11 +3664,11 @@ class RGWGetBucketPeersCR : public RGWCoroutine { return { b, std::next(b) }; } - void filter_sources(std::optional<string> source_zone, + void filter_sources(std::optional<rgw_zone_id> source_zone, std::optional<rgw_bucket> source_bucket, - const map<string, RGWBucketSyncFlowManager::pipe_set>& all_sources, + const map<rgw_zone_id, RGWBucketSyncFlowManager::pipe_set>& all_sources, rgw_sync_pipe_info_set *result) { - ldpp_dout(sync_env->dpp, 20) << __func__ << ": source_zone=" << source_zone.value_or("*") + ldpp_dout(sync_env->dpp, 20) << __func__ << ": source_zone=" << source_zone.value_or(rgw_zone_id("*")).id << " source_bucket=" << source_bucket.value_or(rgw_bucket()) << " all_sources.size()=" << all_sources.size() << dendl; auto iters = get_pipe_iters(all_sources, source_zone); @@ -3743,11 +3688,11 @@ class RGWGetBucketPeersCR : public RGWCoroutine { } } - void filter_targets(std::optional<string> target_zone, + void filter_targets(std::optional<rgw_zone_id> target_zone, std::optional<rgw_bucket> target_bucket, - const map<string, RGWBucketSyncFlowManager::pipe_set>& all_targets, + const map<rgw_zone_id, RGWBucketSyncFlowManager::pipe_set>& all_targets, rgw_sync_pipe_info_set *result) { - ldpp_dout(sync_env->dpp, 20) << __func__ << ": target_zone=" << source_zone.value_or("*") + ldpp_dout(sync_env->dpp, 20) << __func__ << ": target_zone=" << source_zone.value_or(rgw_zone_id("*")).id << " target_bucket=" << source_bucket.value_or(rgw_bucket()) << " all_targets.size()=" << all_targets.size() << dendl; auto iters = get_pipe_iters(all_targets, target_zone); @@ -3796,7 +3741,7 @@ class RGWGetBucketPeersCR : public RGWCoroutine { public: RGWGetBucketPeersCR(RGWDataSyncEnv *_sync_env, std::optional<rgw_bucket> _target_bucket, - std::optional<string> _source_zone, + std::optional<rgw_zone_id> _source_zone, std::optional<rgw_bucket> _source_bucket, rgw_sync_pipe_info_set *_pipes, const RGWSyncTraceNodeRef& _tn_parent) @@ -3809,7 +3754,7 @@ public: tn(sync_env->sync_tracer->add_node(_tn_parent, "get_bucket_peers", SSTR( "target=" << target_bucket.value_or(rgw_bucket()) << ":source=" << target_bucket.value_or(rgw_bucket()) - << ":source_zone=" << source_zone.value_or("*")))) { + << ":source_zone=" << source_zone.value_or(rgw_zone_id("*")).id))) { } int operate() override; @@ -4276,13 +4221,13 @@ int RGWBucketPipeSyncStatusManager::init() return ret; } - string last_zone; + rgw_zone_id last_zone; for (auto& pipe : pipes) { auto& szone = pipe.source.zone; if (last_zone != szone) { - conn = store->svc()->zone->get_zone_conn_by_id(szone); + conn = store->svc()->zone->get_zone_conn(szone); if (!conn) { ldpp_dout(this, 0) << "connection object to zone " << szone << " does not exist" << dendl; return -EINVAL; @@ -4369,26 +4314,26 @@ unsigned RGWBucketPipeSyncStatusManager::get_subsys() const std::ostream& RGWBucketPipeSyncStatusManager::gen_prefix(std::ostream& out) const { - auto zone = std::string_view{source_zone.value_or("*")}; + auto zone = std::string_view{source_zone.value_or(rgw_zone_id("*")).id}; return out << "bucket sync zone:" << zone.substr(0, 8) << " bucket:" << dest_bucket << ' '; } -string RGWBucketPipeSyncStatusManager::status_oid(const string& source_zone, +string RGWBucketPipeSyncStatusManager::status_oid(const rgw_zone_id& source_zone, const rgw_bucket_sync_pair_info& sync_pair) { if (sync_pair.source_bs == sync_pair.dest_bs) { - return bucket_status_oid_prefix + "." + source_zone + ":" + sync_pair.dest_bs.get_key(); + return bucket_status_oid_prefix + "." + source_zone.id + ":" + sync_pair.dest_bs.get_key(); } else { - return bucket_status_oid_prefix + "." + source_zone + ":" + sync_pair.dest_bs.get_key() + ":" + sync_pair.source_bs.get_key(); + return bucket_status_oid_prefix + "." + source_zone.id + ":" + sync_pair.dest_bs.get_key() + ":" + sync_pair.source_bs.get_key(); } } -string RGWBucketPipeSyncStatusManager::obj_status_oid(const string& source_zone, +string RGWBucketPipeSyncStatusManager::obj_status_oid(const rgw_zone_id& source_zone, const rgw_obj& obj) { #warning FIXME - return object_status_oid_prefix + "." + source_zone + ":" + obj.bucket.get_key() + ":" + + return object_status_oid_prefix + "." + source_zone.id + ":" + obj.bucket.get_key() + ":" + obj.key.name + ":" + obj.key.instance; } diff --git a/src/rgw/rgw_data_sync.h b/src/rgw/rgw_data_sync.h index 4ea13440068..6a9c9a4d8af 100644 --- a/src/rgw/rgw_data_sync.h +++ b/src/rgw/rgw_data_sync.h @@ -311,11 +311,11 @@ struct RGWDataSyncCtx { RGWDataSyncEnv *env{nullptr}; RGWRESTConn *conn{nullptr}; - string source_zone; + rgw_zone_id source_zone; void init(RGWDataSyncEnv *_env, RGWRESTConn *_conn, - const string& _source_zone) { + const rgw_zone_id& _source_zone) { cct = _env->cct; env = _env; conn = _conn; @@ -348,7 +348,7 @@ public: RGWRemoteDataLog(const DoutPrefixProvider *dpp, rgw::sal::RGWRadosStore *_store, RGWAsyncRadosProcessor *async_rados); - int init(const string& _source_zone, RGWRESTConn *_conn, RGWSyncErrorLogger *_error_logger, + int init(const rgw_zone_id& _source_zone, RGWRESTConn *_conn, RGWSyncErrorLogger *_error_logger, RGWSyncTraceManager *_sync_tracer, RGWSyncModuleInstanceRef& module, PerfCounters* _counters); void finish(); @@ -368,7 +368,7 @@ public: class RGWDataSyncStatusManager : public DoutPrefixProvider { rgw::sal::RGWRadosStore *store; - string source_zone; + rgw_zone_id source_zone; RGWRESTConn *conn; RGWSyncErrorLogger *error_logger; RGWSyncModuleInstanceRef sync_module; @@ -385,12 +385,12 @@ class RGWDataSyncStatusManager : public DoutPrefixProvider { public: RGWDataSyncStatusManager(rgw::sal::RGWRadosStore *_store, RGWAsyncRadosProcessor *async_rados, - const string& _source_zone, PerfCounters* counters) + const rgw_zone_id& _source_zone, PerfCounters* counters) : store(_store), source_zone(_source_zone), conn(NULL), error_logger(NULL), sync_module(nullptr), counters(counters), source_log(this, store, async_rados), num_shards(0) {} RGWDataSyncStatusManager(rgw::sal::RGWRadosStore *_store, RGWAsyncRadosProcessor *async_rados, - const string& _source_zone, PerfCounters* counters, + const rgw_zone_id& _source_zone, PerfCounters* counters, const RGWSyncModuleInstanceRef& _sync_module) : store(_store), source_zone(_source_zone), conn(NULL), error_logger(NULL), sync_module(_sync_module), counters(counters), @@ -401,8 +401,8 @@ public: int init(); void finalize(); - static string shard_obj_name(const string& source_zone, int shard_id); - static string sync_status_oid(const string& source_zone); + static string shard_obj_name(const rgw_zone_id& source_zone, int shard_id); + static string sync_status_oid(const rgw_zone_id& source_zone); int read_sync_status(rgw_data_sync_status *sync_status) { return source_log.read_sync_status(sync_status); @@ -558,7 +558,7 @@ class RGWRemoteBucketManager { RGWDataSyncEnv *sync_env; RGWRESTConn *conn{nullptr}; - string source_zone; + rgw_zone_id source_zone; vector<rgw_bucket_sync_pair_info> sync_pairs; @@ -570,11 +570,11 @@ class RGWRemoteBucketManager { public: RGWRemoteBucketManager(const DoutPrefixProvider *_dpp, RGWDataSyncEnv *_sync_env, - const string& _source_zone, RGWRESTConn *_conn, + const rgw_zone_id& _source_zone, RGWRESTConn *_conn, const RGWBucketInfo& source_bucket_info, const rgw_bucket& dest_bucket); - void init(const string& _source_zone, RGWRESTConn *_conn, + void init(const rgw_zone_id& _source_zone, RGWRESTConn *_conn, const rgw_bucket& source_bucket, int shard_id, const rgw_bucket& dest_bucket); @@ -598,7 +598,7 @@ class RGWBucketPipeSyncStatusManager : public DoutPrefixProvider { RGWHTTPManager http_manager; - std::optional<string> source_zone; + std::optional<rgw_zone_id> source_zone; std::optional<rgw_bucket> source_bucket; RGWRESTConn *conn; @@ -619,7 +619,7 @@ class RGWBucketPipeSyncStatusManager : public DoutPrefixProvider { public: RGWBucketPipeSyncStatusManager(rgw::sal::RGWRadosStore *_store, - std::optional<string> _source_zone, + std::optional<rgw_zone_id> _source_zone, std::optional<rgw_bucket> _source_bucket, const rgw_bucket& dest_bucket); ~RGWBucketPipeSyncStatusManager(); @@ -629,9 +629,9 @@ public: map<int, rgw_bucket_shard_sync_info>& get_sync_status() { return sync_status; } int init_sync_status(); - static string status_oid(const string& source_zone, const rgw_bucket_sync_pair_info& bs); - static string obj_status_oid(const string& source_zone, const rgw_obj& obj); /* specific source obj sync status, - can be used by sync modules */ + static string status_oid(const rgw_zone_id& source_zone, const rgw_bucket_sync_pair_info& bs); + static string obj_status_oid(const rgw_zone_id& source_zone, const rgw_obj& obj); /* specific source obj sync status, + can be used by sync modules */ // implements DoutPrefixProvider CephContext *get_cct() const override; diff --git a/src/rgw/rgw_json_enc.cc b/src/rgw/rgw_json_enc.cc index 4a6abb6d513..54ef0baa992 100644 --- a/src/rgw/rgw_json_enc.cc +++ b/src/rgw/rgw_json_enc.cc @@ -1392,7 +1392,7 @@ void RGWZoneGroup::dump(Formatter *f) const encode_json("sync_policy", sync_policy, f); } -static void decode_zones(map<string, RGWZone>& zones, JSONObj *o) +static void decode_zones(map<rgw_zone_id, RGWZone>& zones, JSONObj *o) { RGWZone z; z.decode_json(o); @@ -2030,3 +2030,4 @@ void rgw_user::dump(Formatter *f) const { ::encode_json("user", *this, f); } + diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index a6cdaa00261..c68c9addb5b 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -283,13 +283,13 @@ public: http_manager.start(); } - int notify_all(map<string, RGWRESTConn *>& conn_map, set<int>& shards) { + int notify_all(map<rgw_zone_id, RGWRESTConn *>& conn_map, set<int>& shards) { rgw_http_param_pair pairs[] = { { "type", "metadata" }, { "notify", NULL }, { NULL, NULL } }; list<RGWCoroutinesStack *> stacks; - for (map<string, RGWRESTConn *>::iterator iter = conn_map.begin(); iter != conn_map.end(); ++iter) { + for (auto iter = conn_map.begin(); iter != conn_map.end(); ++iter) { RGWRESTConn *conn = iter->second; RGWCoroutinesStack *stack = new RGWCoroutinesStack(store->ctx(), this); stack->call(new RGWPostRESTResourceCR<set<int>, int>(store->ctx(), conn, &http_manager, "/admin/log", pairs, shards, NULL)); @@ -310,14 +310,14 @@ public: http_manager.start(); } - int notify_all(map<string, RGWRESTConn *>& conn_map, map<int, set<string> >& shards) { + int notify_all(map<rgw_zone_id, RGWRESTConn *>& conn_map, map<int, set<string> >& shards) { rgw_http_param_pair pairs[] = { { "type", "data" }, { "notify", NULL }, { "source-zone", store->svc.zone->get_zone_params().get_id().c_str() }, { NULL, NULL } }; list<RGWCoroutinesStack *> stacks; - for (map<string, RGWRESTConn *>::iterator iter = conn_map.begin(); iter != conn_map.end(); ++iter) { + for (auto iter = conn_map.begin(); iter != conn_map.end(); ++iter) { RGWRESTConn *conn = iter->second; RGWCoroutinesStack *stack = new RGWCoroutinesStack(store->ctx(), this); stack->call(new RGWPostRESTResourceCR<map<int, set<string> >, int>(store->ctx(), conn, &http_manager, "/admin/log", pairs, shards, NULL)); @@ -625,11 +625,11 @@ void RGWRados::wakeup_meta_sync_shards(set<int>& shard_ids) } } -void RGWRados::wakeup_data_sync_shards(const string& source_zone, map<int, set<string> >& shard_ids) +void RGWRados::wakeup_data_sync_shards(const rgw_zone_id& source_zone, map<int, set<string> >& shard_ids) { ldout(ctx(), 20) << __func__ << ": source_zone=" << source_zone << ", shard_ids=" << shard_ids << dendl; std::lock_guard l{data_sync_thread_lock}; - map<string, RGWDataSyncProcessorThread *>::iterator iter = data_sync_processor_threads.find(source_zone); + auto iter = data_sync_processor_threads.find(source_zone); if (iter == data_sync_processor_threads.end()) { ldout(ctx(), 10) << __func__ << ": couldn't find sync thread for zone " << source_zone << ", skipping async data sync processing" << dendl; return; @@ -649,7 +649,7 @@ RGWMetaSyncStatusManager* RGWRados::get_meta_sync_manager() return nullptr; } -RGWDataSyncStatusManager* RGWRados::get_data_sync_manager(const std::string& source_zone) +RGWDataSyncStatusManager* RGWRados::get_data_sync_manager(const rgw_zone_id& source_zone) { std::lock_guard l{data_sync_thread_lock}; auto thread = data_sync_processor_threads.find(source_zone); @@ -1105,7 +1105,7 @@ int RGWRados::register_to_service_map(const string& daemon_type, const map<strin metadata["zonegroup_id"] = svc.zone->get_zonegroup().get_id(); metadata["zonegroup_name"] = svc.zone->get_zonegroup().get_name(); metadata["zone_name"] = svc.zone->zone_name(); - metadata["zone_id"] = svc.zone->zone_id(); + metadata["zone_id"] = svc.zone->zone_id().id; string name = cct->_conf->name.get_id(); if (name.compare(0, 4, "rgw.") == 0) { name = name.substr(4); @@ -1240,7 +1240,7 @@ int RGWRados::init_complete() return ret; } thread->start(); - data_sync_processor_threads[source_zone->id] = thread; + data_sync_processor_threads[rgw_zone_id(source_zone->id)] = thread; } auto interval = cct->_conf->rgw_sync_log_trim_interval; if (interval > 0) { @@ -2747,7 +2747,7 @@ int RGWRados::swift_versioning_copy(RGWObjectCtx& obj_ctx, obj_ctx.set_atomic(dest_obj); - string no_zone; + rgw_zone_id no_zone; r = copy_obj(obj_ctx, user, @@ -2819,7 +2819,7 @@ int RGWRados::swift_versioning_restore(RGWObjectCtx& obj_ctx, /* This code will be executed on latest version of the object. */ const auto handler = [&](const rgw_bucket_dir_entry& entry) -> int { - std::string no_zone; + rgw_zone_id no_zone; /* We don't support object versioning of Swift API on those buckets that * are already versioned using the S3 mechanism. This affects also bucket @@ -3505,7 +3505,7 @@ public: int RGWRados::stat_remote_obj(RGWObjectCtx& obj_ctx, const rgw_user& user_id, req_info *info, - const string& source_zone, + const rgw_zone_id& source_zone, rgw_obj& src_obj, const RGWBucketInfo *src_bucket_info, real_time *src_mtime, @@ -3546,7 +3546,7 @@ int RGWRados::stat_remote_obj(RGWObjectCtx& obj_ctx, } } else { auto& zone_conn_map = svc.zone->get_zone_conn_map(); - map<string, RGWRESTConn *>::iterator iter = zone_conn_map.find(source_zone); + auto iter = zone_conn_map.find(source_zone); if (iter == zone_conn_map.end()) { ldout(cct, 0) << "could not find zone connection to zone: " << source_zone << dendl; return -ENOENT; @@ -3619,7 +3619,7 @@ int RGWRados::stat_remote_obj(RGWObjectCtx& obj_ctx, int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, const rgw_user& user_id, req_info *info, - const string& source_zone, + const rgw_zone_id& source_zone, const rgw_obj& dest_obj, const rgw_obj& src_obj, const RGWBucketInfo& dest_bucket_info, @@ -3677,7 +3677,7 @@ int RGWRados::fetch_remote_obj(RGWObjectCtx& obj_ctx, conn = iter->second; } } else { - map<string, RGWRESTConn *>::iterator iter = zone_conn_map.find(source_zone); + auto iter = zone_conn_map.find(source_zone); if (iter == zone_conn_map.end()) { ldout(cct, 0) << "could not find zone connection to zone: " << source_zone << dendl; return -ENOENT; @@ -3936,7 +3936,7 @@ int RGWRados::copy_obj_to_remote_dest(RGWObjState *astate, int RGWRados::copy_obj(RGWObjectCtx& obj_ctx, const rgw_user& user_id, req_info *info, - const string& source_zone, + const rgw_zone_id& source_zone, rgw_obj& dest_obj, rgw_obj& src_obj, RGWBucketInfo& dest_bucket_info, diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index 9eab78c83b5..e730a2f45ab 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -412,7 +412,7 @@ class RGWRados RGWDataNotifier *data_notifier; RGWMetaSyncProcessorThread *meta_sync_processor_thread; RGWSyncTraceManager *sync_tracer = nullptr; - map<string, RGWDataSyncProcessorThread *> data_sync_processor_threads; + map<rgw_zone_id, RGWDataSyncProcessorThread *> data_sync_processor_threads; boost::optional<rgw::BucketTrimManager> bucket_trim; RGWSyncLogTrimThread *sync_log_trimmer{nullptr}; @@ -1058,7 +1058,7 @@ public: int stat_remote_obj(RGWObjectCtx& obj_ctx, const rgw_user& user_id, req_info *info, - const string& source_zone, + const rgw_zone_id& source_zone, rgw_obj& src_obj, const RGWBucketInfo *src_bucket_info, real_time *src_mtime, @@ -1077,7 +1077,7 @@ public: int fetch_remote_obj(RGWObjectCtx& obj_ctx, const rgw_user& user_id, req_info *info, - const string& source_zone, + const rgw_zone_id& source_zone, const rgw_obj& dest_obj, const rgw_obj& src_obj, const RGWBucketInfo& dest_bucket_info, @@ -1120,7 +1120,7 @@ public: int copy_obj(RGWObjectCtx& obj_ctx, const rgw_user& user_id, req_info *info, - const string& source_zone, + const rgw_zone_id& source_zone, rgw_obj& dest_obj, rgw_obj& src_obj, RGWBucketInfo& dest_bucket_info, @@ -1180,10 +1180,10 @@ public: int delete_bucket(RGWBucketInfo& bucket_info, RGWObjVersionTracker& objv_tracker, optional_yield y, bool check_empty = true); void wakeup_meta_sync_shards(set<int>& shard_ids); - void wakeup_data_sync_shards(const string& source_zone, map<int, set<string> >& shard_ids); + void wakeup_data_sync_shards(const rgw_zone_id& source_zone, map<int, set<string> >& shard_ids); RGWMetaSyncStatusManager* get_meta_sync_manager(); - RGWDataSyncStatusManager* get_data_sync_manager(const std::string& source_zone); + RGWDataSyncStatusManager* get_data_sync_manager(const rgw_zone_id& source_zone); int set_bucket_owner(rgw_bucket& bucket, ACLOwner& owner); int set_buckets_enabled(std::vector<rgw_bucket>& buckets, bool enabled); @@ -1397,8 +1397,8 @@ public: int get_target_shard_id(const RGWBucketInfo& bucket_info, const string& obj_key, int *shard_id); - int lock_exclusive(const rgw_pool& pool, const string& oid, ceph::timespan& duration, string& zone_id, string& owner_id); - int unlock(const rgw_pool& pool, const string& oid, string& zone_id, string& owner_id); + int lock_exclusive(const rgw_pool& pool, const string& oid, ceph::timespan& duration, rgw_zone_id& zone_id, string& owner_id); + int unlock(const rgw_pool& pool, const string& oid, rgw_zone_id& zone_id, string& owner_id); void update_gc_chain(rgw_obj& head_obj, RGWObjManifest& manifest, cls_rgw_obj_chain *chain); int send_chain_to_gc(cls_rgw_obj_chain& chain, const string& tag); diff --git a/src/rgw/rgw_sync_module_aws.cc b/src/rgw/rgw_sync_module_aws.cc index 103b28864cf..e479b534781 100644 --- a/src/rgw/rgw_sync_module_aws.cc +++ b/src/rgw/rgw_sync_module_aws.cc @@ -1610,7 +1610,7 @@ public: << " zone_short_id=" << src_zone_short_id << " pg_ver=" << src_pg_ver << dendl; - source_conn = sync_env->svc->zone->get_zone_conn_by_id(sc->source_zone); + source_conn = sync_env->svc->zone->get_zone_conn(sc->source_zone); if (!source_conn) { ldout(sc->cct, 0) << "ERROR: cannot find http connection to zone " << sc->source_zone << dendl; return set_cr_error(-EINVAL); diff --git a/src/rgw/rgw_sync_policy.cc b/src/rgw/rgw_sync_policy.cc index 5d0cad7e1e4..01a1fb6ccde 100644 --- a/src/rgw/rgw_sync_policy.cc +++ b/src/rgw/rgw_sync_policy.cc @@ -151,7 +151,7 @@ void rgw_sync_bucket_entity::apply_bucket(std::optional<rgw_bucket> b) } } -void rgw_sync_bucket_entities::add_zones(const std::vector<string>& new_zones) { +void rgw_sync_bucket_entities::add_zones(const std::vector<rgw_zone_id>& new_zones) { for (auto& z : new_zones) { if (z == "*") { all_zones = true; @@ -194,7 +194,7 @@ std::vector<rgw_sync_bucket_entity> rgw_sync_bucket_entities::expand() const return result; } -void rgw_sync_bucket_entities::remove_zones(const std::vector<string>& rm_zones) { +void rgw_sync_bucket_entities::remove_zones(const std::vector<rgw_zone_id>& rm_zones) { all_zones = false; if (!zones) { @@ -346,7 +346,7 @@ bool rgw_sync_data_flow_group::find_symmetrical(const string& flow_id, bool crea return true; } -void rgw_sync_data_flow_group::remove_symmetrical(const string& flow_id, std::optional<std::vector<string> > zones) +void rgw_sync_data_flow_group::remove_symmetrical(const string& flow_id, std::optional<std::vector<rgw_zone_id> > zones) { if (!symmetrical) { return; @@ -387,7 +387,7 @@ void rgw_sync_data_flow_group::remove_symmetrical(const string& flow_id, std::op } } -bool rgw_sync_data_flow_group::find_directional(const string& source_zone, const string& dest_zone, bool create, rgw_sync_directional_rule **flow_group) +bool rgw_sync_data_flow_group::find_directional(const rgw_zone_id& source_zone, const rgw_zone_id& dest_zone, bool create, rgw_sync_directional_rule **flow_group) { if (!directional) { if (!create) { @@ -417,7 +417,7 @@ bool rgw_sync_data_flow_group::find_directional(const string& source_zone, const return true; } -void rgw_sync_data_flow_group::remove_directional(const string& source_zone, const string& dest_zone) +void rgw_sync_data_flow_group::remove_directional(const rgw_zone_id& source_zone, const rgw_zone_id& dest_zone) { if (!directional) { return; @@ -436,7 +436,7 @@ void rgw_sync_data_flow_group::remove_directional(const string& source_zone, con } } -void rgw_sync_data_flow_group::init_default(const std::set<string>& zones) +void rgw_sync_data_flow_group::init_default(const std::set<rgw_zone_id>& zones) { symmetrical.emplace(); symmetrical->push_back(rgw_sync_symmetric_group("default", zones)); diff --git a/src/rgw/rgw_sync_policy.h b/src/rgw/rgw_sync_policy.h index d312f7e7908..12353777464 100644 --- a/src/rgw/rgw_sync_policy.h +++ b/src/rgw/rgw_sync_policy.h @@ -20,11 +20,11 @@ struct rgw_sync_symmetric_group { string id; - std::set<string> zones; + std::set<rgw_zone_id> zones; rgw_sync_symmetric_group() {} rgw_sync_symmetric_group(const string& _id, - const std::set<string> _zones) : id(_id), zones(_zones) {} + const std::set<rgw_zone_id> _zones) : id(_id), zones(_zones) {} void encode(bufferlist& bl) const { @@ -47,8 +47,8 @@ struct rgw_sync_symmetric_group { WRITE_CLASS_ENCODER(rgw_sync_symmetric_group) struct rgw_sync_directional_rule { - string source_zone; - string dest_zone; + rgw_zone_id source_zone; + rgw_zone_id dest_zone; void encode(bufferlist& bl) const { ENCODE_START(1, 1, bl); @@ -70,7 +70,7 @@ struct rgw_sync_directional_rule { WRITE_CLASS_ENCODER(rgw_sync_directional_rule) struct rgw_sync_bucket_entity { - std::optional<string> zone; /* define specific zones */ + std::optional<rgw_zone_id> zone; /* define specific zones */ std::optional<rgw_bucket> bucket; /* define specific bucket */ static bool match_str(const string& s1, const string& s2) { /* empty string is wildcard */ @@ -82,7 +82,7 @@ struct rgw_sync_bucket_entity { bool all_zones{false}; rgw_sync_bucket_entity() {} - rgw_sync_bucket_entity(const string& _zone, + rgw_sync_bucket_entity(const rgw_zone_id& _zone, std::optional<rgw_bucket> _bucket) : zone(_zone), bucket(_bucket.value_or(rgw_bucket())) {} @@ -115,7 +115,7 @@ struct rgw_sync_bucket_entity { string bucket_key() const; - bool match_zone(const string& z) const { + bool match_zone(const rgw_zone_id& z) const { if (all_zones) { return true; } @@ -126,7 +126,7 @@ struct rgw_sync_bucket_entity { return (*zone == z); } - void apply_zone(const string& z) { + void apply_zone(const rgw_zone_id& z) { all_zones = false; zone = z; } @@ -166,7 +166,7 @@ struct rgw_sync_bucket_entity { if (zone < e.zone) { return true; } - if (zone > e.zone) { + if (e.zone < zone) { return false; } return (bucket < e.bucket); @@ -356,7 +356,7 @@ WRITE_CLASS_ENCODER(rgw_sync_bucket_pipe) struct rgw_sync_bucket_entities { std::optional<rgw_bucket> bucket; /* define specific bucket */ - std::optional<std::set<string> > zones; /* define specific zones, if not set then all zones */ + std::optional<std::set<rgw_zone_id> > zones; /* define specific zones, if not set then all zones */ bool all_zones{false}; @@ -394,8 +394,8 @@ struct rgw_sync_bucket_entities { rgw_sync_bucket_entity::match_str(bucket->bucket_id, b->bucket_id)); } - void add_zones(const std::vector<string>& new_zones); - void remove_zones(const std::vector<string>& rm_zones); + void add_zones(const std::vector<rgw_zone_id>& new_zones); + void remove_zones(const std::vector<rgw_zone_id>& rm_zones); void set_bucket(std::optional<string> tenant, std::optional<string> bucket_name, std::optional<string> bucket_id); @@ -403,7 +403,7 @@ struct rgw_sync_bucket_entities { std::optional<string> bucket_name, std::optional<string> bucket_id); - bool match_zone(const string& zone) const { + bool match_zone(const rgw_zone_id& zone) const { if (all_zones) { return true; } else if (!zones) { @@ -448,15 +448,15 @@ struct rgw_sync_bucket_pipes { DECODE_FINISH(bl); } - bool match_source(const string& zone, std::optional<rgw_bucket> b) const { + bool match_source(const rgw_zone_id& zone, std::optional<rgw_bucket> b) const { return (source.match_zone(zone) && source.match_bucket(b)); } - bool match_dest(const string& zone, std::optional<rgw_bucket> b) const { + bool match_dest(const rgw_zone_id& zone, std::optional<rgw_bucket> b) const { return (dest.match_zone(zone) && dest.match_bucket(b)); } - bool contains_zone_bucket(const string& zone, std::optional<rgw_bucket> b) const { + bool contains_zone_bucket(const rgw_zone_id& zone, std::optional<rgw_bucket> b) const { return (match_source(zone, b) || match_dest(zone, b)); } @@ -507,11 +507,11 @@ struct rgw_sync_data_flow_group { } bool find_symmetrical(const string& flow_id, bool create, rgw_sync_symmetric_group **flow_group); - void remove_symmetrical(const string& flow_id, std::optional<std::vector<string> > zones); - bool find_directional(const string& source_zone, const string& dest_zone, bool create, rgw_sync_directional_rule **flow_group); - void remove_directional(const string& source_zone, const string& dest_zone); + void remove_symmetrical(const string& flow_id, std::optional<std::vector<rgw_zone_id> > zones); + bool find_directional(const rgw_zone_id& source_zone, const rgw_zone_id& dest_zone, bool create, rgw_sync_directional_rule **flow_group); + void remove_directional(const rgw_zone_id& source_zone, const rgw_zone_id& dest_zone); - void init_default(const std::set<string>& zones); + void init_default(const std::set<rgw_zone_id>& zones); }; WRITE_CLASS_ENCODER(rgw_sync_data_flow_group) diff --git a/src/rgw/rgw_trim_mdlog.cc b/src/rgw/rgw_trim_mdlog.cc index 3cd728f0114..1c1941936ae 100644 --- a/src/rgw/rgw_trim_mdlog.cc +++ b/src/rgw/rgw_trim_mdlog.cc @@ -144,8 +144,8 @@ connection_map make_peer_connections(rgw::sal::RGWRadosStore *store, for (auto& g : zonegroups) { for (auto& z : g.second.zones) { std::unique_ptr<RGWRESTConn> conn{ - new RGWRESTConn(store->ctx(), store->svc()->zone, z.first, z.second.endpoints)}; - connections.emplace(z.first, std::move(conn)); + new RGWRESTConn(store->ctx(), store->svc()->zone, z.first.id, z.second.endpoints)}; + connections.emplace(z.first.id, std::move(conn)); } } return connections; @@ -206,13 +206,13 @@ struct TrimEnv { rgw::sal::RGWRadosStore *const store; RGWHTTPManager *const http; int num_shards; - const std::string& zone; + const rgw_zone_id& zone; Cursor current; //< cursor to current period epoch_t last_trim_epoch{0}; //< epoch of last mdlog that was purged TrimEnv(const DoutPrefixProvider *dpp, rgw::sal::RGWRadosStore *store, RGWHTTPManager *http, int num_shards) : dpp(dpp), store(store), http(http), num_shards(num_shards), - zone(store->svc()->zone->get_zone_params().get_id()), + zone(store->svc()->zone->zone_id()), current(store->svc()->mdlog->get_period_history()->get_current()) {} }; @@ -229,7 +229,7 @@ struct MasterTrimEnv : public TrimEnv { { auto& period = current.get_period(); connections = make_peer_connections(store, period.get_map().zonegroups); - connections.erase(zone); + connections.erase(zone.id); peer_status.resize(connections.size()); } }; diff --git a/src/rgw/rgw_zone.cc b/src/rgw/rgw_zone.cc index e47e169d50d..ac2d8ab6fb1 100644 --- a/src/rgw/rgw_zone.cc +++ b/src/rgw/rgw_zone.cc @@ -261,14 +261,14 @@ void RGWZoneGroup::post_process_params() bool log_data = zones.size() > 1; if (master_zone.empty()) { - map<string, RGWZone>::iterator iter = zones.begin(); + auto iter = zones.begin(); if (iter != zones.end()) { master_zone = iter->first; } } - for (map<string, RGWZone>::iterator iter = zones.begin(); iter != zones.end(); ++iter) { - RGWZone& zone = iter->second; + for (auto& item : zones) { + RGWZone& zone = item.second; zone.log_data = log_data; RGWZoneParams zone_params(zone.id, zone.name); @@ -278,9 +278,8 @@ void RGWZoneGroup::post_process_params() continue; } - for (map<string, RGWZonePlacementInfo>::iterator iter = zone_params.placement_pools.begin(); - iter != zone_params.placement_pools.end(); ++iter) { - const string& placement_name = iter->first; + for (auto& pitem : zone_params.placement_pools) { + const string& placement_name = pitem.first; if (placement_targets.find(placement_name) == placement_targets.end()) { RGWZoneGroupPlacementTarget placement_target; placement_target.name = placement_name; @@ -296,7 +295,7 @@ void RGWZoneGroup::post_process_params() int RGWZoneGroup::remove_zone(const std::string& zone_id) { - map<string, RGWZone>::iterator iter = zones.find(zone_id); + auto iter = zones.find(zone_id); if (iter == zones.end()) { ldout(cct, 0) << "zone id " << zone_id << " is not a part of zonegroup " << name << dendl; diff --git a/src/rgw/rgw_zone.h b/src/rgw/rgw_zone.h index 002c72e443b..f5c05513010 100644 --- a/src/rgw/rgw_zone.h +++ b/src/rgw/rgw_zone.h @@ -33,6 +33,7 @@ extern std::string default_storage_pool_suffix; class JSONObj; class RGWSyncModulesManager; + struct RGWNameToId { std::string obj_id; @@ -382,9 +383,9 @@ struct RGWZoneParams : RGWSystemMetaObj { RGWZoneParams() : RGWSystemMetaObj() {} explicit RGWZoneParams(const std::string& name) : RGWSystemMetaObj(name){} - RGWZoneParams(const std::string& id, const std::string& name) : RGWSystemMetaObj(id, name) {} - RGWZoneParams(const std::string& id, const std::string& name, const std::string& _realm_id) - : RGWSystemMetaObj(id, name), realm_id(_realm_id) {} + RGWZoneParams(const rgw_zone_id& id, const std::string& name) : RGWSystemMetaObj(id.id, name) {} + RGWZoneParams(const rgw_zone_id& id, const std::string& name, const std::string& _realm_id) + : RGWSystemMetaObj(id.id, name), realm_id(_realm_id) {} rgw_pool get_pool(CephContext *cct) const override; const std::string get_default_oid(bool old_format = false) const override; @@ -695,8 +696,8 @@ struct RGWZoneGroup : public RGWSystemMetaObj { list<std::string> endpoints; bool is_master = false; - std::string master_zone; - map<std::string, RGWZone> zones; + rgw_zone_id master_zone; + map<rgw_zone_id, RGWZone> zones; map<std::string, RGWZoneGroupPlacementTarget> placement_targets; rgw_placement_rule default_placement; @@ -1021,7 +1022,7 @@ class RGWPeriod RGWPeriodMap period_map; RGWPeriodConfig period_config; std::string master_zonegroup; - std::string master_zone; + rgw_zone_id master_zone; std::string realm_id; std::string realm_name; @@ -1054,7 +1055,7 @@ public: epoch_t get_epoch() const { return epoch; } epoch_t get_realm_epoch() const { return realm_epoch; } const std::string& get_predecessor() const { return predecessor_uuid; } - const std::string& get_master_zone() const { return master_zone; } + const rgw_zone_id& get_master_zone() const { return master_zone; } const std::string& get_master_zonegroup() const { return master_zonegroup; } const std::string& get_realm() const { return realm_id; } const RGWPeriodMap& get_map() const { return period_map; } @@ -1073,9 +1074,9 @@ public: period_config.bucket_quota = bucket_quota; } - void set_id(const std::string& id) { - this->id = id; - period_map.id = id; + void set_id(const string& _id) { + this->id = _id; + period_map.id = _id; } void set_epoch(epoch_t epoch) { this->epoch = epoch; } void set_realm_epoch(epoch_t epoch) { realm_epoch = epoch; } diff --git a/src/rgw/services/svc_bucket_sync.h b/src/rgw/services/svc_bucket_sync.h index c0d6bdd9a8a..4016490f71d 100644 --- a/src/rgw/services/svc_bucket_sync.h +++ b/src/rgw/services/svc_bucket_sync.h @@ -31,7 +31,7 @@ public: RGWSI_Bucket_Sync(CephContext *cct) : RGWServiceInstance(cct) {} virtual int get_policy_handler(RGWSI_Bucket_X_Ctx& ctx, - std::optional<string> zone, + std::optional<rgw_zone_id> zone, std::optional<rgw_bucket> bucket, RGWBucketSyncPolicyHandlerRef *handler, optional_yield y) = 0; diff --git a/src/rgw/services/svc_bucket_sync_sobj.cc b/src/rgw/services/svc_bucket_sync_sobj.cc index 31fa3ca1539..da3c9874f24 100644 --- a/src/rgw/services/svc_bucket_sync_sobj.cc +++ b/src/rgw/services/svc_bucket_sync_sobj.cc @@ -68,19 +68,13 @@ int RGWSI_Bucket_Sync_SObj::do_start() } void RGWSI_Bucket_Sync_SObj::get_hint_entities(RGWSI_Bucket_X_Ctx& ctx, - const std::set<string>& zone_names, + const std::set<rgw_zone_id>& zones, const std::set<rgw_bucket>& buckets, std::set<rgw_sync_bucket_entity> *hint_entities, optional_yield y) { - for (auto& zone : zone_names) { + for (auto& zone : zones) { for (auto& b : buckets) { - string zid; - if (!svc.zone->find_zone_id_by_name(zone, &zid)) { - cerr << "WARNING: cannot find zone id for zone=" << zone << ", skippping" << std::endl; - continue; - } - RGWBucketInfo hint_bucket_info; int ret = svc.bucket_sobj->read_bucket_info(ctx, b, &hint_bucket_info, nullptr, nullptr, boost::none, @@ -90,7 +84,7 @@ void RGWSI_Bucket_Sync_SObj::get_hint_entities(RGWSI_Bucket_X_Ctx& ctx, continue; } - hint_entities->insert(rgw_sync_bucket_entity(zid, hint_bucket_info.bucket)); + hint_entities->insert(rgw_sync_bucket_entity(zone, hint_bucket_info.bucket)); } } } @@ -102,8 +96,8 @@ int RGWSI_Bucket_Sync_SObj::resolve_policy_hints(RGWSI_Bucket_X_Ctx& ctx, std::map<optional_zone_bucket, RGWBucketSyncPolicyHandlerRef>& temp_map, optional_yield y) { - set<string> source_zones; - set<string> target_zones; + set<rgw_zone_id> source_zones; + set<rgw_zone_id> target_zones; zone_policy_handler->reflect(nullptr, nullptr, nullptr, nullptr, @@ -153,7 +147,7 @@ int RGWSI_Bucket_Sync_SObj::resolve_policy_hints(RGWSI_Bucket_X_Ctx& ctx, } int RGWSI_Bucket_Sync_SObj::do_get_policy_handler(RGWSI_Bucket_X_Ctx& ctx, - std::optional<string> zone, + std::optional<rgw_zone_id> zone, std::optional<rgw_bucket> _bucket, std::map<optional_zone_bucket, RGWBucketSyncPolicyHandlerRef>& temp_map, RGWBucketSyncPolicyHandlerRef *handler, @@ -170,7 +164,7 @@ int RGWSI_Bucket_Sync_SObj::do_get_policy_handler(RGWSI_Bucket_X_Ctx& ctx, string bucket_key; if (zone && *zone != svc.zone->zone_id()) { - zone_key = *zone; + zone_key = zone->id; } bucket_key = RGWSI_Bucket::get_bi_meta_key(bucket); @@ -202,6 +196,10 @@ int RGWSI_Bucket_Sync_SObj::do_get_policy_handler(RGWSI_Bucket_X_Ctx& ctx, } auto zone_policy_handler = svc.zone->get_sync_policy_handler(zone); + if (!zone_policy_handler) { + ldout(cct, 20) << "ERROR: could not find policy handler for zone=" << zone << dendl; + return -ENOENT; + } e.handler.reset(zone_policy_handler->alloc_child(bucket_info)); @@ -234,7 +232,7 @@ int RGWSI_Bucket_Sync_SObj::do_get_policy_handler(RGWSI_Bucket_X_Ctx& ctx, } int RGWSI_Bucket_Sync_SObj::get_policy_handler(RGWSI_Bucket_X_Ctx& ctx, - std::optional<string> zone, + std::optional<rgw_zone_id> zone, std::optional<rgw_bucket> _bucket, RGWBucketSyncPolicyHandlerRef *handler, optional_yield y) diff --git a/src/rgw/services/svc_bucket_sync_sobj.h b/src/rgw/services/svc_bucket_sync_sobj.h index ae497f3b580..9dc0e380b3b 100644 --- a/src/rgw/services/svc_bucket_sync_sobj.h +++ b/src/rgw/services/svc_bucket_sync_sobj.h @@ -47,10 +47,10 @@ class RGWSI_Bucket_Sync_SObj : public RGWSI_Bucket_Sync int do_start() override; struct optional_zone_bucket { - optional<string> zone; + optional<rgw_zone_id> zone; optional<rgw_bucket> bucket; - optional_zone_bucket(const optional<string>& _zone, + optional_zone_bucket(const optional<rgw_zone_id>& _zone, const optional<rgw_bucket>& _bucket) : zone(_zone), bucket(_bucket) {} bool operator<(const optional_zone_bucket& ozb) const { @@ -65,7 +65,7 @@ class RGWSI_Bucket_Sync_SObj : public RGWSI_Bucket_Sync }; void get_hint_entities(RGWSI_Bucket_X_Ctx& ctx, - const std::set<string>& zone_names, + const std::set<rgw_zone_id>& zone_names, const std::set<rgw_bucket>& buckets, std::set<rgw_sync_bucket_entity> *hint_entities, optional_yield y); @@ -76,7 +76,7 @@ class RGWSI_Bucket_Sync_SObj : public RGWSI_Bucket_Sync std::map<optional_zone_bucket, RGWBucketSyncPolicyHandlerRef>& temp_map, optional_yield y); int do_get_policy_handler(RGWSI_Bucket_X_Ctx& ctx, - std::optional<string> zone, + std::optional<rgw_zone_id> zone, std::optional<rgw_bucket> _bucket, std::map<optional_zone_bucket, RGWBucketSyncPolicyHandlerRef>& temp_map, RGWBucketSyncPolicyHandlerRef *handler, @@ -99,7 +99,7 @@ public: int get_policy_handler(RGWSI_Bucket_X_Ctx& ctx, - std::optional<string> zone, + std::optional<rgw_zone_id> zone, std::optional<rgw_bucket> bucket, RGWBucketSyncPolicyHandlerRef *handler, optional_yield y); diff --git a/src/rgw/services/svc_zone.cc b/src/rgw/services/svc_zone.cc index 511984f9a29..404937574c9 100644 --- a/src/rgw/services/svc_zone.cc +++ b/src/rgw/services/svc_zone.cc @@ -47,7 +47,7 @@ RGWSI_Zone::~RGWSI_Zone() delete current_period; } -std::shared_ptr<RGWBucketSyncPolicyHandler> RGWSI_Zone::get_sync_policy_handler(std::optional<string> zone) const { +std::shared_ptr<RGWBucketSyncPolicyHandler> RGWSI_Zone::get_sync_policy_handler(std::optional<rgw_zone_id> zone) const { if (!zone || *zone == zone_id()) { return sync_policy_handler; } @@ -142,6 +142,9 @@ int RGWSI_Zone::do_start() lderr(cct) << "failed reading zone info: ret "<< ret << " " << cpp_strerror(-ret) << dendl; return ret; } + + cur_zone_id = rgw_zone_id(zone_params->get_id()); + auto zone_iter = zonegroup->zones.find(zone_params->get_id()); if (zone_iter == zonegroup->zones.end()) { if (using_local) { @@ -166,7 +169,7 @@ int RGWSI_Zone::do_start() zone_short_id = current_period->get_map().get_zone_short_id(zone_params->get_id()); for (auto ziter : zonegroup->zones) { - auto zone_handler = new RGWBucketSyncPolicyHandler(this, sync_modules_svc, bucket_sync_svc, ziter.second.name); + auto zone_handler = new RGWBucketSyncPolicyHandler(this, sync_modules_svc, bucket_sync_svc, ziter.second.id); ret = zone_handler->init(null_yield); if (ret < 0) { lderr(cct) << "ERROR: could not initialize zone policy handler for zone=" << ziter.second.name << dendl; @@ -177,13 +180,13 @@ int RGWSI_Zone::do_start() sync_policy_handler = sync_policy_handlers[zone_id()]; /* we made sure earlier that zonegroup->zones has our zone */ - set<string> source_zones_by_name; - set<string> target_zones_by_name; + set<rgw_zone_id> source_zones; + set<rgw_zone_id> target_zones; sync_policy_handler->reflect(nullptr, nullptr, nullptr, nullptr, - &source_zones_by_name, - &target_zones_by_name, + &source_zones, + &target_zones, false); /* relaxed: also get all zones that we allow to sync to/from */ ret = sync_modules_svc->start(); @@ -201,7 +204,7 @@ int RGWSI_Zone::do_start() /* first build all zones index */ for (auto ziter : zonegroup->zones) { - const string& id = ziter.first; + const rgw_zone_id& id = ziter.first; RGWZone& z = ziter.second; zone_id_by_name[z.name] = id; zone_by_id[id] = z; @@ -212,7 +215,7 @@ int RGWSI_Zone::do_start() } for (const auto& ziter : zonegroup->zones) { - const string& id = ziter.first; + const rgw_zone_id& id = ziter.first; const RGWZone& z = ziter.second; if (id == zone_id()) { continue; @@ -225,8 +228,8 @@ int RGWSI_Zone::do_start() RGWRESTConn *conn = new RGWRESTConn(cct, this, z.id, z.endpoints); zone_conn_map[id] = conn; - bool zone_is_source = source_zones_by_name.find(z.name) != source_zones_by_name.end(); - bool zone_is_target = target_zones_by_name.find(z.name) != target_zones_by_name.end(); + bool zone_is_source = source_zones.find(z.id) != source_zones.end(); + bool zone_is_target = target_zones.find(z.id) != target_zones.end(); if (zone_is_source || zone_is_target) { if (zone_is_source) { @@ -250,14 +253,13 @@ void RGWSI_Zone::shutdown() { delete rest_master_conn; - map<string, RGWRESTConn *>::iterator iter; - for (iter = zone_conn_map.begin(); iter != zone_conn_map.end(); ++iter) { - RGWRESTConn *conn = iter->second; + for (auto& item : zone_conn_map) { + auto conn = item.second; delete conn; } - for (iter = zonegroup_conn_map.begin(); iter != zonegroup_conn_map.end(); ++iter) { - RGWRESTConn *conn = iter->second; + for (auto& item : zonegroup_conn_map) { + auto conn = item.second; delete conn; } } @@ -405,7 +407,8 @@ int RGWSI_Zone::replace_region_with_zonegroup() return 0; } - string master_region, master_zone; + string master_region; + rgw_zone_id master_zone; for (list<string>::iterator iter = regions.begin(); iter != regions.end(); ++iter) { if (*iter != default_zonegroup_name){ RGWZoneGroup region(*iter); @@ -425,7 +428,7 @@ int RGWSI_Zone::replace_region_with_zonegroup() The realm name will be the region and zone concatenated realm id will be mds of its name */ if (realm->get_id().empty() && !master_region.empty() && !master_zone.empty()) { - string new_realm_name = master_region + "." + master_zone; + string new_realm_name = master_region + "." + master_zone.id; unsigned char md5[CEPH_CRYPTO_MD5_DIGESTSIZE]; char md5_str[CEPH_CRYPTO_MD5_DIGESTSIZE * 2 + 1]; MD5 hash; @@ -507,11 +510,11 @@ int RGWSI_Zone::replace_region_with_zonegroup() return ret; } } - for (map<string, RGWZone>::const_iterator iter = zonegroup.zones.begin(); iter != zonegroup.zones.end(); + for (auto iter = zonegroup.zones.begin(); iter != zonegroup.zones.end(); ++iter) { ldout(cct, 0) << __func__ << " Converting zone" << iter->first << dendl; - RGWZoneParams zoneparams(iter->first, iter->first); - zoneparams.set_id(iter->first); + RGWZoneParams zoneparams(iter->first, iter->second.name); + zoneparams.set_id(iter->first.id); zoneparams.realm_id = realm->get_id(); ret = zoneparams.init(cct, sysobj_svc); if (ret < 0 && ret != -ENOENT) { @@ -893,12 +896,8 @@ const string& RGWSI_Zone::zone_name() const { return get_zone_params().get_name(); } -const string& RGWSI_Zone::zone_id() const -{ - return get_zone_params().get_id(); -} -bool RGWSI_Zone::find_zone_by_id(const string& id, RGWZone **zone) +bool RGWSI_Zone::find_zone(const rgw_zone_id& id, RGWZone **zone) { auto iter = zone_by_id.find(id); if (iter == zone_by_id.end()) { @@ -908,8 +907,8 @@ bool RGWSI_Zone::find_zone_by_id(const string& id, RGWZone **zone) return true; } -RGWRESTConn *RGWSI_Zone::get_zone_conn_by_id(const string& id) { - auto citer = zone_conn_map.find(id); +RGWRESTConn *RGWSI_Zone::get_zone_conn(const rgw_zone_id& zone_id) { + auto citer = zone_conn_map.find(zone_id.id); if (citer == zone_conn_map.end()) { return NULL; } @@ -923,10 +922,10 @@ RGWRESTConn *RGWSI_Zone::get_zone_conn_by_name(const string& name) { return NULL; } - return get_zone_conn_by_id(i->second); + return get_zone_conn(i->second); } -bool RGWSI_Zone::find_zone_id_by_name(const string& name, string *id) { +bool RGWSI_Zone::find_zone_id_by_name(const string& name, rgw_zone_id *id) { auto i = zone_id_by_name.find(name); if (i == zone_id_by_name.end()) { return false; @@ -992,7 +991,7 @@ bool RGWSI_Zone::is_syncing_bucket_meta(const rgw_bucket& bucket) } /* zone is not master */ - if (zonegroup->master_zone.compare(zone_public_config->id) != 0) { + if (zonegroup->master_zone != zone_public_config->id) { return false; } diff --git a/src/rgw/services/svc_zone.h b/src/rgw/services/svc_zone.h index e20575f1632..5a51b6de253 100644 --- a/src/rgw/services/svc_zone.h +++ b/src/rgw/services/svc_zone.h @@ -38,20 +38,21 @@ class RGWSI_Zone : public RGWServiceInstance RGWZone *zone_public_config{nullptr}; /* external zone params, e.g., entrypoints, log flags, etc. */ RGWZoneParams *zone_params{nullptr}; /* internal zone params, e.g., rados pools */ RGWPeriod *current_period{nullptr}; + rgw_zone_id cur_zone_id; uint32_t zone_short_id{0}; bool writeable_zone{false}; std::shared_ptr<RGWBucketSyncPolicyHandler> sync_policy_handler; - std::map<string, std::shared_ptr<RGWBucketSyncPolicyHandler> > sync_policy_handlers; + std::map<rgw_zone_id, std::shared_ptr<RGWBucketSyncPolicyHandler> > sync_policy_handlers; RGWRESTConn *rest_master_conn{nullptr}; - map<string, RGWRESTConn *> zone_conn_map; + map<rgw_zone_id, RGWRESTConn *> zone_conn_map; std::vector<const RGWZone*> data_sync_source_zones; - map<string, RGWRESTConn *> zone_data_notify_to_map; + map<rgw_zone_id, RGWRESTConn *> zone_data_notify_to_map; map<string, RGWRESTConn *> zonegroup_conn_map; - map<string, string> zone_id_by_name; - map<string, RGWZone> zone_by_id; + map<string, rgw_zone_id> zone_id_by_name; + map<rgw_zone_id, RGWZone> zone_by_id; std::unique_ptr<rgw_sync_policy_info> sync_policy; @@ -79,10 +80,12 @@ public: int get_zonegroup(const string& id, RGWZoneGroup& zonegroup) const; const RGWZone& get_zone() const; - std::shared_ptr<RGWBucketSyncPolicyHandler> get_sync_policy_handler(std::optional<string> zone = nullopt) const; + std::shared_ptr<RGWBucketSyncPolicyHandler> get_sync_policy_handler(std::optional<rgw_zone_id> zone = nullopt) const; const string& zone_name() const; - const string& zone_id() const; + const rgw_zone_id& zone_id() const { + return cur_zone_id; + } uint32_t get_zone_short_id() const; const string& get_current_period_id() const; @@ -101,7 +104,7 @@ public: return zonegroup_conn_map; } - map<string, RGWRESTConn *>& get_zone_conn_map() { + map<rgw_zone_id, RGWRESTConn *>& get_zone_conn_map() { return zone_conn_map; } @@ -109,15 +112,15 @@ public: return data_sync_source_zones; } - map<string, RGWRESTConn *>& get_zone_data_notify_to_map() { + map<rgw_zone_id, RGWRESTConn *>& get_zone_data_notify_to_map() { return zone_data_notify_to_map; } - bool find_zone_by_id(const string& id, RGWZone **zone); + bool find_zone(const rgw_zone_id& id, RGWZone **zone); - RGWRESTConn *get_zone_conn_by_id(const string& id); + RGWRESTConn *get_zone_conn(const rgw_zone_id& zone_id); RGWRESTConn *get_zone_conn_by_name(const string& name); - bool find_zone_id_by_name(const string& name, string *id); + bool find_zone_id_by_name(const string& name, rgw_zone_id *id); int select_bucket_placement(const RGWUserInfo& user_info, const string& zonegroup_id, const rgw_placement_rule& rule, |