]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
RGW/standalone: refactor RGWZoneGroup with configstore
authorAli Masarwa <amasarwa@redhat.com>
Thu, 3 Apr 2025 13:51:54 +0000 (16:51 +0300)
committerAli Masarwa <amasarwa@redhat.com>
Tue, 29 Apr 2025 12:31:09 +0000 (15:31 +0300)
Signed-off-by: Ali Masarwa <amasarwa@redhat.com>
src/rgw/driver/rados/rgw_zone.cc
src/rgw/driver/rados/rgw_zone.h
src/rgw/rgw_zone.cc
src/rgw/services/svc_zone.cc

index d7c167bb3764ac775b2e0579db75bb31d443e73f..a3ffcc6189a1c98994b953cc342651fa6dce55f9 100644 (file)
@@ -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<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);
 }
index 99adae881bf215f64089c1ea21eaa72f96370ec7..c48dbf3a6046ba9dedb75c9f60c96c1be17f91cc 100644 (file)
@@ -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<std::string> 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<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);
@@ -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<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);
index f0d5e0d86cbf2280d7a9158f900bda6cb2a7f0a0..4b33ffc1e36a896a6a47fdd6cb9ab9705a4eb44b 100644 (file)
@@ -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<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()) {
@@ -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<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)
 {
@@ -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<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);
index f0705cceb654856dddb8c6e2ccdb3c9bfdd118c3..99edbee5cf470df7916969a6528727dd4275704b 100644 (file)
@@ -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;