}
}
-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())
return (id == other_zonegroup);
}
-int RGWZoneGroup::add_zone(const DoutPrefixProvider *dpp,
- const RGWZoneParams& zone_params, bool *is_master, bool *read_only,
- const list<string>& endpoints, const string *ptier_type,
- bool *psync_from_all, list<string>& sync_from, list<string>& sync_from_rm,
- string *predirect_zone, std::optional<int> 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);
}
};
WRITE_CLASS_ENCODER(RGWZoneParams)
-struct RGWZoneGroup : public RGWSystemMetaObj {
+struct RGWZoneGroup {
+ std::string id;
+ std::string name;
std::string api_name;
std::list<std::string> endpoints;
bool is_master = false;
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<std::string>& _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<std::string>& _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);
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);
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;
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<std::string>& endpoints, const std::string *ptier_type,
- bool *psync_from_all, std::list<std::string>& sync_from,
- std::list<std::string>& sync_from_rm, std::string *predirect_zone,
- std::optional<int> 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);
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<string>("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()) {
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<std::string>("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)
{
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);
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);
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<std::string>("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);
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;
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){
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;
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;
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;