From: Ali Masarwa Date: Thu, 3 Apr 2025 13:51:54 +0000 (+0300) Subject: RGW/standalone: refactor RGWZoneGroup with configstore X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=4bb08c9247911556ac15c1cd7987841e0d542c70;p=ceph.git RGW/standalone: refactor RGWZoneGroup with configstore Signed-off-by: Ali Masarwa --- diff --git a/src/rgw/driver/rados/rgw_zone.cc b/src/rgw/driver/rados/rgw_zone.cc index d7c167bb3764a..a3ffcc6189a1c 100644 --- a/src/rgw/driver/rados/rgw_zone.cc +++ b/src/rgw/driver/rados/rgw_zone.cc @@ -43,77 +43,6 @@ void RGWDefaultZoneGroupInfo::decode_json(JSONObj *obj) { } } -int RGWZoneGroup::create_default(const DoutPrefixProvider *dpp, optional_yield y, bool old_format) -{ - name = default_zonegroup_name; - api_name = default_zonegroup_name; - is_master = true; - - RGWZoneGroupPlacementTarget placement_target; - placement_target.name = "default-placement"; - placement_targets[placement_target.name] = placement_target; - default_placement.name = "default-placement"; - - RGWZoneParams zone_params(default_zone_name); - - int r = zone_params.init(dpp, cct, sysobj_svc, y, false); - if (r < 0) { - ldpp_dout(dpp, 0) << "create_default: error initializing zone params: " << cpp_strerror(-r) << dendl; - return r; - } - - r = zone_params.create_default(dpp, y); - if (r < 0 && r != -EEXIST) { - ldpp_dout(dpp, 0) << "create_default: error in create_default zone params: " << cpp_strerror(-r) << dendl; - return r; - } else if (r == -EEXIST) { - ldpp_dout(dpp, 10) << "zone_params::create_default() returned -EEXIST, we raced with another default zone_params creation" << dendl; - zone_params.clear_id(); - r = zone_params.init(dpp, cct, sysobj_svc, y); - if (r < 0) { - ldpp_dout(dpp, 0) << "create_default: error in init existing zone params: " << cpp_strerror(-r) << dendl; - return r; - } - ldpp_dout(dpp, 20) << "zone_params::create_default() " << zone_params.get_name() << " id " << zone_params.get_id() - << dendl; - } - - RGWZone& default_zone = zones[zone_params.get_id()]; - default_zone.name = zone_params.get_name(); - default_zone.id = zone_params.get_id(); - master_zone = default_zone.id; - - // initialize supported zone features - default_zone.supported_features.insert(rgw::zone_features::supported.begin(), - rgw::zone_features::supported.end()); - // enable default zonegroup features - enabled_features.insert(rgw::zone_features::enabled.begin(), - rgw::zone_features::enabled.end()); - - r = create(dpp, y); - if (r < 0 && r != -EEXIST) { - ldpp_dout(dpp, 0) << "error storing zone group info: " << cpp_strerror(-r) << dendl; - return r; - } - - if (r == -EEXIST) { - ldpp_dout(dpp, 10) << "create_default() returned -EEXIST, we raced with another zonegroup creation" << dendl; - id.clear(); - r = init(dpp, cct, sysobj_svc, y); - if (r < 0) { - return r; - } - } - - if (old_format) { - name = id; - } - - post_process_params(dpp, y); - - return 0; -} - int RGWZoneGroup::equals(const string& other_zonegroup) const { if (is_master && other_zonegroup.empty()) @@ -122,168 +51,6 @@ int RGWZoneGroup::equals(const string& other_zonegroup) const return (id == other_zonegroup); } -int RGWZoneGroup::add_zone(const DoutPrefixProvider *dpp, - const RGWZoneParams& zone_params, bool *is_master, bool *read_only, - const list& endpoints, const string *ptier_type, - bool *psync_from_all, list& sync_from, list& sync_from_rm, - string *predirect_zone, std::optional bucket_index_max_shards, - RGWSyncModulesManager *sync_mgr, - const rgw::zone_features::set& enable_features, - const rgw::zone_features::set& disable_features, - optional_yield y) -{ - auto& zone_id = zone_params.get_id(); - auto& zone_name = zone_params.get_name(); - - // check for duplicate zone name on insert - if (!zones.count(zone_id)) { - for (const auto& zone : zones) { - if (zone.second.name == zone_name) { - ldpp_dout(dpp, 0) << "ERROR: found existing zone name " << zone_name - << " (" << zone.first << ") in zonegroup " << get_name() << dendl; - return -EEXIST; - } - } - } - - if (is_master) { - if (*is_master) { - if (!master_zone.empty() && master_zone != zone_id) { - ldpp_dout(dpp, 0) << "NOTICE: overriding master zone: " << master_zone << dendl; - } - master_zone = zone_id; - } else if (master_zone == zone_id) { - master_zone.clear(); - } - } - - RGWZone& zone = zones[zone_id]; - zone.name = zone_name; - zone.id = zone_id; - if (!endpoints.empty()) { - zone.endpoints = endpoints; - } - if (read_only) { - zone.read_only = *read_only; - } - if (ptier_type) { - zone.tier_type = *ptier_type; - if (!sync_mgr->get_module(*ptier_type, nullptr)) { - ldpp_dout(dpp, 0) << "ERROR: could not found sync module: " << *ptier_type - << ", valid sync modules: " - << sync_mgr->get_registered_module_names() - << dendl; - return -ENOENT; - } - } - - if (psync_from_all) { - zone.sync_from_all = *psync_from_all; - } - - if (predirect_zone) { - zone.redirect_zone = *predirect_zone; - } - - if (bucket_index_max_shards) { - zone.bucket_index_max_shards = *bucket_index_max_shards; - } - - for (auto add : sync_from) { - zone.sync_from.insert(add); - } - - for (auto rm : sync_from_rm) { - zone.sync_from.erase(rm); - } - - zone.supported_features.insert(enable_features.begin(), - enable_features.end()); - - for (const auto& feature : disable_features) { - if (enabled_features.contains(feature)) { - lderr(cct) << "ERROR: Cannot disable zone feature \"" << feature - << "\" until it's been disabled in zonegroup " << name << dendl; - return -EINVAL; - } - auto i = zone.supported_features.find(feature); - if (i == zone.supported_features.end()) { - ldout(cct, 1) << "WARNING: zone feature \"" << feature - << "\" was not enabled in zone " << zone.name << dendl; - continue; - } - zone.supported_features.erase(i); - } - - post_process_params(dpp, y); - - return update(dpp,y); -} - - -int RGWZoneGroup::rename_zone(const DoutPrefixProvider *dpp, - const RGWZoneParams& zone_params, - optional_yield y) -{ - RGWZone& zone = zones[zone_params.get_id()]; - zone.name = zone_params.get_name(); - - return update(dpp, y); -} - -void RGWZoneGroup::post_process_params(const DoutPrefixProvider *dpp, optional_yield y) -{ - bool log_data = zones.size() > 1; - - if (master_zone.empty()) { - auto iter = zones.begin(); - if (iter != zones.end()) { - master_zone = iter->first; - } - } - - for (auto& item : zones) { - RGWZone& zone = item.second; - zone.log_data = log_data; - - RGWZoneParams zone_params(zone.id, zone.name); - int ret = zone_params.init(dpp, cct, sysobj_svc, y); - if (ret < 0) { - ldpp_dout(dpp, 0) << "WARNING: could not read zone params for zone id=" << zone.id << " name=" << zone.name << dendl; - continue; - } - - 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; - placement_targets[placement_name] = placement_target; - } - } - } - - if (default_placement.empty() && !placement_targets.empty()) { - default_placement.init(placement_targets.begin()->first, RGW_STORAGE_CLASS_STANDARD); - } -} - -int RGWZoneGroup::remove_zone(const DoutPrefixProvider *dpp, const std::string& zone_id, optional_yield y) -{ - auto iter = zones.find(zone_id); - if (iter == zones.end()) { - ldpp_dout(dpp, 0) << "zone id " << zone_id << " is not a part of zonegroup " - << name << dendl; - return -ENOENT; - } - - zones.erase(iter); - - post_process_params(dpp, y); - - return update(dpp, y); -} - void RGWDefaultSystemMetaObjInfo::dump(Formatter *f) const { encode_json("default_id", default_id, f); } diff --git a/src/rgw/driver/rados/rgw_zone.h b/src/rgw/driver/rados/rgw_zone.h index 99adae881bf21..c48dbf3a6046b 100644 --- a/src/rgw/driver/rados/rgw_zone.h +++ b/src/rgw/driver/rados/rgw_zone.h @@ -317,7 +317,9 @@ struct RGWZoneParams : RGWSystemMetaObj { }; WRITE_CLASS_ENCODER(RGWZoneParams) -struct RGWZoneGroup : public RGWSystemMetaObj { +struct RGWZoneGroup { + std::string id; + std::string name; std::string api_name; std::list endpoints; bool is_master = false; @@ -351,24 +353,25 @@ struct RGWZoneGroup : public RGWSystemMetaObj { rgw_sync_policy_info sync_policy; rgw::zone_features::set enabled_features; + CephContext *cct{nullptr}; RGWZoneGroup(): is_master(false){} - RGWZoneGroup(const std::string &id, const std::string &name):RGWSystemMetaObj(id, name) {} - explicit RGWZoneGroup(const std::string &_name):RGWSystemMetaObj(_name) {} - RGWZoneGroup(const std::string &_name, bool _is_master, CephContext *cct, RGWSI_SysObj* sysobj_svc, - const std::string& _realm_id, const std::list& _endpoints) - : RGWSystemMetaObj(_name, cct , sysobj_svc), endpoints(_endpoints), is_master(_is_master), - realm_id(_realm_id) {} - virtual ~RGWZoneGroup(); + RGWZoneGroup(const std::string &_id, const std::string &_name):id(_id), name(_name) {} + explicit RGWZoneGroup(const std::string &_name):name(_name) {} + RGWZoneGroup(const std::string &_name, bool _is_master, const std::string& _realm_id, + const std::list& _endpoints) + : name(_name), endpoints(_endpoints), is_master(_is_master), realm_id(_realm_id) {} + + const std::string& get_name() const { return name; } + const std::string& get_id() const { return id; } + + void set_name(const std::string& _name) { name = _name;} + void set_id(const std::string& _id) { id = _id;} + void clear_id() { id.clear(); } bool is_master_zonegroup() const { return is_master;} - void update_master(const DoutPrefixProvider *dpp, bool _is_master, optional_yield y) { - is_master = _is_master; - post_process_params(dpp, y); - } - void post_process_params(const DoutPrefixProvider *dpp, optional_yield y); - void encode(bufferlist& bl) const override { + void encode(bufferlist& bl) const { ENCODE_START(6, 1, bl); encode(name, bl); encode(api_name, bl); @@ -380,14 +383,21 @@ struct RGWZoneGroup : public RGWSystemMetaObj { encode(default_placement, bl); encode(hostnames, bl); encode(hostnames_s3website, bl); - RGWSystemMetaObj::encode(bl); + { + // these used to be wrapped by RGWSystemMetaObj::encode(), + // so the extra ENCODE_START/ENCODE_FINISH are preserved + ENCODE_START(1, 1, bl); + encode(id, bl); + encode(name, bl); + ENCODE_FINISH(bl); + } encode(realm_id, bl); encode(sync_policy, bl); encode(enabled_features, bl); ENCODE_FINISH(bl); } - void decode(bufferlist::const_iterator& bl) override { + void decode(bufferlist::const_iterator& bl) { DECODE_START(6, bl); decode(name, bl); decode(api_name, bl); @@ -404,7 +414,14 @@ struct RGWZoneGroup : public RGWSystemMetaObj { decode(hostnames_s3website, bl); } if (struct_v >= 4) { - RGWSystemMetaObj::decode(bl); + { + // these used to be wrapped by RGWSystemMetaObj::decode(), + // so the extra DECODE_START/DECODE_FINISH are preserved + DECODE_START(1, bl); + decode(id, bl); + decode(name, bl); + DECODE_FINISH(bl); + } decode(realm_id, bl); } else { id = name; @@ -418,27 +435,8 @@ struct RGWZoneGroup : public RGWSystemMetaObj { DECODE_FINISH(bl); } - int read_default_id(const DoutPrefixProvider *dpp, std::string& default_id, optional_yield y, bool old_format = false) override; - int set_as_default(const DoutPrefixProvider *dpp, optional_yield y, bool exclusive = false) override; - int create_default(const DoutPrefixProvider *dpp, optional_yield y, bool old_format = false); int equals(const std::string& other_zonegroup) const; - int add_zone(const DoutPrefixProvider *dpp, - const RGWZoneParams& zone_params, bool *is_master, bool *read_only, - const std::list& endpoints, const std::string *ptier_type, - bool *psync_from_all, std::list& sync_from, - std::list& sync_from_rm, std::string *predirect_zone, - std::optional bucket_index_max_shards, RGWSyncModulesManager *sync_mgr, - const rgw::zone_features::set& enable_features, - const rgw::zone_features::set& disable_features, - optional_yield y); - int remove_zone(const DoutPrefixProvider *dpp, const std::string& zone_id, optional_yield y); - int rename_zone(const DoutPrefixProvider *dpp, const RGWZoneParams& zone_params, optional_yield y); - rgw_pool get_pool(CephContext *cct) const override; - const std::string get_default_oid(bool old_region_format = false) const override; - const std::string& get_info_oid_prefix(bool old_region_format = false) const override; - const std::string& get_names_oid_prefix() const override; - std::string get_predefined_id(CephContext *cct) const override; - const std::string& get_predefined_name(CephContext *cct) const override; + rgw_pool get_pool(CephContext *cct) const; void dump(Formatter *f) const; void decode_json(JSONObj *obj); diff --git a/src/rgw/rgw_zone.cc b/src/rgw/rgw_zone.cc index f0d5e0d86cbf2..4b33ffc1e36a8 100644 --- a/src/rgw/rgw_zone.cc +++ b/src/rgw/rgw_zone.cc @@ -145,49 +145,6 @@ int RGWSystemMetaObj::init(const DoutPrefixProvider *dpp, CephContext *_cct, RGW return read_info(dpp, id, y, old_format); } -RGWZoneGroup::~RGWZoneGroup() {} - -const string RGWZoneGroup::get_default_oid(bool old_region_format) const -{ - if (old_region_format) { - if (cct->_conf->rgw_default_region_info_oid.empty()) { - return default_region_info_oid; - } - return cct->_conf->rgw_default_region_info_oid; - } - - string default_oid = cct->_conf->rgw_default_zonegroup_info_oid; - - if (cct->_conf->rgw_default_zonegroup_info_oid.empty()) { - default_oid = default_zone_group_info_oid; - } - - default_oid += "." + realm_id; - - return default_oid; -} - -const string& RGWZoneGroup::get_info_oid_prefix(bool old_region_format) const -{ - if (old_region_format) { - return region_info_oid_prefix; - } - return zone_group_info_oid_prefix; -} - -const string& RGWZoneGroup::get_names_oid_prefix() const -{ - return zonegroup_names_oid_prefix; -} - -string RGWZoneGroup::get_predefined_id(CephContext *cct) const { - return cct->_conf.get_val("rgw_zonegroup_id"); -} - -const string& RGWZoneGroup::get_predefined_name(CephContext *cct) const { - return cct->_conf->rgw_zonegroup; -} - rgw_pool RGWZoneGroup::get_pool(CephContext *cct_) const { if (cct_->_conf->rgw_zonegroup_root_pool.empty()) { @@ -197,24 +154,6 @@ rgw_pool RGWZoneGroup::get_pool(CephContext *cct_) const return rgw_pool(cct_->_conf->rgw_zonegroup_root_pool); } -int RGWZoneGroup::read_default_id(const DoutPrefixProvider *dpp, string& default_id, optional_yield y, - bool old_format) -{ - if (realm_id.empty()) { - /* try using default realm */ - RGWRealm realm; - auto config_store_type = g_conf().get_val("rgw_config_store"); - auto cfgstore = DriverManager::create_config_store(dpp, config_store_type); - int ret = rgw::read_realm(dpp, y, cfgstore.get(), realm.get_id(), realm.get_name(), realm); - // no default realm exist - if (ret < 0) { - return read_id(dpp, default_zonegroup_name, default_id, y); - } - realm_id = realm.get_id(); - } - - return RGWSystemMetaObj::read_default_id(dpp, default_id, y, old_format); -} int RGWSystemMetaObj::use_default(const DoutPrefixProvider *dpp, optional_yield y, bool old_format) { @@ -258,7 +197,8 @@ int RGWSystemMetaObj::read_info(const DoutPrefixProvider *dpp, const string& obj void RGWZoneGroup::decode_json(JSONObj *obj) { - RGWSystemMetaObj::decode_json(obj); + JSONDecoder::decode_json("id", id, obj); + JSONDecoder::decode_json("name", name, obj); if (id.empty()) { derr << "old format " << dendl; JSONDecoder::decode_json("name", name, obj); @@ -687,7 +627,8 @@ int RGWSystemMetaObj::delete_obj(const DoutPrefixProvider *dpp, optional_yield y void RGWZoneGroup::dump(Formatter *f) const { - RGWSystemMetaObj::dump(f); + encode_json("id", id , f); + encode_json("name", name , f); encode_json("api_name", api_name, f); encode_json("is_master", is_master, f); encode_json("endpoints", endpoints, f); @@ -1189,24 +1130,6 @@ bool RGWPeriodMap::find_zone_by_id(const rgw_zone_id& zone_id, return false; } -int RGWZoneGroup::set_as_default(const DoutPrefixProvider *dpp, optional_yield y, bool exclusive) -{ - if (realm_id.empty()) { - /* try using default realm */ - RGWRealm realm; - auto config_store_type = g_conf().get_val("rgw_config_store"); - auto cfgstore = DriverManager::create_config_store(dpp, config_store_type); - int ret = rgw::read_realm(dpp, y, cfgstore.get(), realm.get_id(), realm.get_name(), realm); - if (ret < 0) { - ldpp_dout(dpp, 10) << "could not read realm id: " << cpp_strerror(-ret) << dendl; - return -EINVAL; - } - realm_id = realm.get_id(); - } - - return RGWSystemMetaObj::set_as_default(dpp, y, exclusive); -} - int RGWSystemMetaObj::write(const DoutPrefixProvider *dpp, bool exclusive, optional_yield y) { int ret = store_info(dpp, exclusive, y); diff --git a/src/rgw/services/svc_zone.cc b/src/rgw/services/svc_zone.cc index f0705cceb6548..99edbee5cf470 100644 --- a/src/rgw/services/svc_zone.cc +++ b/src/rgw/services/svc_zone.cc @@ -200,7 +200,9 @@ int RGWSI_Zone::do_start(optional_yield y, const DoutPrefixProvider *dpp) if (!zg_initialized) { /* couldn't find a proper period config, use local zonegroup */ - ret = zonegroup->init(dpp, cct, sysobj_svc, y); + std::string_view zonegroup_id = zonegroup->get_id(); + std::string_view zonegroup_name = zonegroup->get_name(); + ret = rgw::read_zonegroup(dpp, y, cfgstore, zonegroup_id, zonegroup_name, *zonegroup); zg_initialized = (ret == 0); if (ret < 0 && ret != -ENOENT) { ldpp_dout(dpp, 0) << "failed reading zonegroup info: " << cpp_strerror(-ret) << dendl; @@ -500,11 +502,6 @@ int RGWSI_Zone::init_zg_from_period(const DoutPrefixProvider *dpp, optional_yiel if (iter != current_period->get_map().zonegroups.end()) { ldpp_dout(dpp, 20) << "using current period zonegroup " << zonegroup->get_name() << dendl; *zonegroup = iter->second; - int ret = zonegroup->init(dpp, cct, sysobj_svc, y, false); - if (ret < 0) { - ldpp_dout(dpp, 0) << "failed init zonegroup: " << " " << cpp_strerror(-ret) << dendl; - return ret; - } } for (iter = current_period->get_map().zonegroups.begin(); iter != current_period->get_map().zonegroups.end(); ++iter){ @@ -522,20 +519,22 @@ int RGWSI_Zone::init_zg_from_period(const DoutPrefixProvider *dpp, optional_yiel master->second.name << " id:" << master->second.id << " as master" << dendl; if (zonegroup->get_id() == zg.get_id()) { zonegroup->master_zone = master->second.id; - int ret = zonegroup->update(dpp, y); + int ret = cfgstore->create_zonegroup(dpp, y, false, *zonegroup, nullptr); if (ret < 0) { ldpp_dout(dpp, 0) << "error updating zonegroup : " << cpp_strerror(-ret) << dendl; return ret; } } else { RGWZoneGroup fixed_zg(zg.get_id(),zg.get_name()); - int ret = fixed_zg.init(dpp, cct, sysobj_svc, y); + std::string_view zonegroup_id = zonegroup->get_id(); + std::string_view zonegroup_name = zonegroup->get_name(); + int ret = rgw::read_zonegroup(dpp, y, cfgstore, zonegroup_id, zonegroup_name, *zonegroup); if (ret < 0) { ldpp_dout(dpp, 0) << "error initializing zonegroup : " << cpp_strerror(-ret) << dendl; return ret; } fixed_zg.master_zone = master->second.id; - ret = fixed_zg.update(dpp, y); + ret = cfgstore->create_zonegroup(dpp, y, false, fixed_zg, nullptr); if (ret < 0) { ldpp_dout(dpp, 0) << "error initializing zonegroup : " << cpp_strerror(-ret) << dendl; return ret; @@ -561,13 +560,15 @@ int RGWSI_Zone::init_zg_from_period(const DoutPrefixProvider *dpp, optional_yiel int RGWSI_Zone::create_default_zg(const DoutPrefixProvider *dpp, optional_yield y) { ldout(cct, 10) << "Creating default zonegroup " << dendl; - int ret = zonegroup->create_default(dpp, y); + int ret = cfgstore->create_zonegroup(dpp, y, true, *zonegroup, nullptr); if (ret < 0) { ldpp_dout(dpp, 0) << "failure in zonegroup create_default: ret "<< ret << " " << cpp_strerror(-ret) << dendl; return ret; } - ret = zonegroup->init(dpp, cct, sysobj_svc, y); + std::string_view zonegroup_id = zonegroup->get_id(); + std::string_view zonegroup_name = zonegroup->get_name(); + ret = rgw::read_zonegroup(dpp, y, cfgstore, zonegroup_id, zonegroup_name, *zonegroup); if (ret < 0) { ldout(cct, 0) << "failure in zonegroup create_default: ret "<< ret << " " << cpp_strerror(-ret) << dendl; @@ -603,7 +604,7 @@ int RGWSI_Zone::init_zg_from_local(const DoutPrefixProvider *dpp, optional_yield ldpp_dout(dpp, 0) << "zonegroup " << zonegroup->get_name() << " missing master_zone, setting zone " << master->second.name << " id:" << master->second.id << " as master" << dendl; zonegroup->master_zone = master->second.id; - int ret = zonegroup->update(dpp, y); + int ret = cfgstore->create_zonegroup(dpp, y, false, *zonegroup, nullptr); if (ret < 0) { ldpp_dout(dpp, 0) << "error initializing zonegroup : " << cpp_strerror(-ret) << dendl; return ret;