]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: convert old region configuration to zonegroups during init
authorOrit Wasserman <owasserm@redhat.com>
Fri, 7 Aug 2015 12:01:39 +0000 (14:01 +0200)
committerYehuda Sadeh <yehuda@redhat.com>
Tue, 9 Feb 2016 22:36:53 +0000 (14:36 -0800)
Signed-off-by: Orit Wasserman <owasserm@redhat.com>
src/rgw/rgw_admin.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index 8590954cf2ef2189c8ffdf8fa4a2f54b8a12ae00..dad26c1c880c7f35085c69df59f6b28a438f5bdc 100644 (file)
@@ -1934,7 +1934,7 @@ int main(int argc, char **argv)
          return -ret;
        }
        RGWDefaultZoneGroupInfo default_zonegroup;
-       ret = zonegroup.read_default(default_zonegroup);
+       ret = zonegroup.read_default(default_zonegroup, zonegroup.get_default_oid());
        if (ret < 0 && ret != -ENOENT) {
          cerr << "could not determine default zonegroup: " << cpp_strerror(-ret) << std::endl;
        }
index f9f079f2546efbfa05ac3f206a4e3ba0cea24bad..ecbbfd1f34280e6cd7ec97cf77217d303ea01809 100644 (file)
@@ -128,9 +128,9 @@ int RGWZoneGroup::get_pool_name(CephContext *cct, string *pool_name)
   return 0;
 }
 
-const string& RGWZoneGroup::get_default_oid()
+const string& RGWZoneGroup::get_default_oid(bool old_region_format)
 {
-  if (old_region) {
+  if (old_region_format) {
     if (cct->_conf->rgw_default_region_info_oid.empty()) {
       return default_region_info_oid;
     }
@@ -144,15 +144,16 @@ const string& RGWZoneGroup::get_default_oid()
   return cct->_conf->rgw_default_zonegroup_info_oid;
 }
 
-const string& RGWZoneGroup::get_info_oid_prefix()
+const string& RGWZoneGroup::get_info_oid_prefix(bool old_region_format)
 {
-  if (old_region) {
+  if (old_region_format) {
     return region_info_oid_prefix;
   }
   return zone_group_info_oid_prefix;
 }
 
-int RGWZoneGroup::read_default(RGWDefaultZoneGroupInfo& default_info)
+int RGWZoneGroup::read_default(RGWDefaultZoneGroupInfo& default_info,
+                              const string& oid)
 {
   string pool_name;
 
@@ -161,7 +162,6 @@ int RGWZoneGroup::read_default(RGWDefaultZoneGroupInfo& default_info)
     return ret;
   }
 
-  string oid = get_default_oid();
   rgw_bucket pool(pool_name.c_str());
   bufferlist bl;
   RGWObjectCtx obj_ctx(store);
@@ -206,7 +206,7 @@ int RGWZoneGroup::set_as_default()
   return 0;
 }
 
-int RGWZoneGroup::init(CephContext *_cct, RGWRados *_store, bool setup_zonegroup)
+int RGWZoneGroup::init(CephContext *_cct, RGWRados *_store, bool setup_zonegroup, bool old_region_format)
 {
   cct = _cct;
   store = _store;
@@ -222,7 +222,7 @@ int RGWZoneGroup::init(CephContext *_cct, RGWRados *_store, bool setup_zonegroup
 
   if (zonegroup_name.empty()) {
     RGWDefaultZoneGroupInfo default_info;
-    int r = read_default(default_info);
+    int r = read_default(default_info, get_default_oid(old_region_format));
     if (r == -ENOENT) {
       r = create_default();
       if (r == -EEXIST) { /* we may have raced with another zonegroup creation,
@@ -237,7 +237,7 @@ int RGWZoneGroup::init(CephContext *_cct, RGWRados *_store, bool setup_zonegroup
       if (r < 0)
         return r;
       /*Re attempt to read zonegroup info from newly created default zonegroup */
-      r = read_default(default_info);
+      r = read_default(default_info, get_default_oid(old_region_format));
       if (r < 0)
        return r;
     } else if (r < 0) {
@@ -246,11 +246,11 @@ int RGWZoneGroup::init(CephContext *_cct, RGWRados *_store, bool setup_zonegroup
     }
     zonegroup_name = default_info.default_zonegroup;
   }
-
-  return read_info(zonegroup_name);
+  
+  return read_info(zonegroup_name, old_region_format);
 }
 
-int RGWZoneGroup::read_info(const string& zonegroup_name)
+int RGWZoneGroup::read_info(const string& zonegroup_name, bool old_region_format)
 {
   string pool_name;
   int ret = get_pool_name(cct, &pool_name);
@@ -261,8 +261,7 @@ int RGWZoneGroup::read_info(const string& zonegroup_name)
   bufferlist bl;
 
   name = zonegroup_name;
-
-  string oid = get_info_oid_prefix() + name;
+  string oid = get_info_oid_prefix(old_region_format) + name;
 
   RGWObjectCtx obj_ctx(store);
   ret = rgw_get_system_obj(store, obj_ctx, pool, oid, bl, NULL, NULL);
@@ -342,6 +341,41 @@ int RGWZoneGroup::equals(const string& other_zonegroup)
   return (name == other_zonegroup);
 }
 
+int RGWZoneGroup::delete_obj(bool old_region_format)
+{
+  string pool_name;
+  int ret = get_pool_name(cct, &pool_name);
+  if (ret < 0) {
+    return ret;
+  }
+  rgw_bucket pool(pool_name.c_str());
+  
+  /* check to see if obj is the default */
+  RGWDefaultZoneGroupInfo default_info;
+  ret = read_default(default_info, get_default_oid(old_region_format));
+  if (ret < 0 && ret != -ENOENT)
+    return ret;
+  if (default_info.default_zonegroup == name) {
+    string oid = get_default_oid(old_region_format);
+    rgw_obj default_named_obj(pool, oid);
+    ret = store->delete_system_obj(default_named_obj);
+    if (ret < 0) {
+      lderr(cct) << "Error delete default obj name  " << name << ": " << cpp_strerror(-ret) << dendl;
+      return ret;
+    }
+  }
+  
+  string oid  = get_info_oid_prefix(old_region_format) + name;
+  rgw_obj object(pool, oid);
+  ret = store->delete_system_obj(object);
+  if (ret < 0) {
+    lderr(cct) << "Error delete zonegroup " << name << ": " << cpp_strerror(-ret) << dendl;
+    return ret;
+  }
+
+  return ret;
+}
+
 int RGWSystemMetaObj::init(CephContext *_cct, RGWRados *_store, bool setup_obj)
 {
   cct = _cct;
@@ -2113,6 +2147,95 @@ static void add_new_connection_to_map(map<string, RGWRESTConn *> &zonegroup_conn
   zonegroup_conn_map[zonegroup.name] = new_connection;
 }
 
+
+/** 
+ * Replace all region configuration with zonegroup for
+ * backward compatability
+ * Returns 0 on success, -ERR# on failure.
+ */
+int RGWRados::replace_region_with_zonegroup()
+{
+  RGWZoneGroup zonegroup;
+  int ret = zonegroup.init(cct, this, false);
+  if (ret < 0) {
+    lderr(cct) << "failed init default zonegroup: ret "<< ret << " " << cpp_strerror(-ret) << dendl;
+    return ret;
+  }
+
+  /* copy default region */
+  /* convert default region to default zonegroup */
+  string default_oid = cct->_conf->rgw_default_region_info_oid;
+  if (default_oid.empty()) {
+    default_oid = default_region_info_oid;
+  }
+  RGWDefaultZoneGroupInfo default_info;
+  ret  = zonegroup.read_default(default_info, default_oid);
+
+  if (ret < 0 && ret != -ENOENT) {
+    lderr(cct) << "failed reading old default region: ret "<< ret << " " << cpp_strerror(-ret) << dendl;
+    return ret;
+  } else if (ret != -ENOENT) {
+    zonegroup.name = default_info.default_zonegroup;
+    ret = zonegroup.set_as_default();
+    if (ret < 0) {
+      lderr(cct) << "failed to set default zonegroup: ret "<< ret << " " << cpp_strerror(-ret) << dendl;
+      return ret;
+    }
+  }
+  /* convert regions to zonegroups */
+  list<string> regions;
+  ret = list_regions(regions);
+  if (ret < 0 && ret != -ENOENT) {
+    lderr(cct) << "failed to list regions: ret "<< ret << " " << cpp_strerror(-ret) << dendl;
+    return ret;
+  }
+
+  list<string>::iterator iter;
+  /* create zonegroups */
+  for (iter = regions.begin(); iter != regions.end(); ++iter)
+  {
+    lderr(cct) << "create zonegroup " << *iter << dendl;    
+    /* read region info default has no data */
+    if (*iter != "default"){
+      ret = zonegroup.read_info(*iter, true);
+      if (ret < 0) {
+       lderr(cct) << "failed to read region " << *iter << " info: ret "<< ret << " " << cpp_strerror(-ret)
+                  << dendl;
+       return ret;
+      }
+    }
+    ret = zonegroup.store_info(true);
+    if (ret < 0 && ret != -EEXIST) {
+      lderr(cct) << "failed to store zonegroup " << *iter << ": ret "<< ret << " " << cpp_strerror(-ret)
+                << dendl;
+      return ret;
+    }
+  }
+
+  ret = 0;
+    
+  /* delete regions */
+  for (iter = regions.begin(); iter != regions.end(); ++iter)
+  {
+    /* there is no default region */
+    if (*iter == "default"){
+      continue;
+    }
+
+    lderr(cct) << "delete zonegroup " << *iter << dendl;
+    zonegroup.name = *iter;
+    ret = zonegroup.delete_obj(true);
+    if (ret < 0) {
+      lderr(cct) << "failed to delete region " << *iter << ": ret "<< ret << " " << cpp_strerror(-ret)
+                << dendl;
+      return ret;
+    }
+  }    
+
+  /* update region for all zones */
+  return ret;
+}
+
 /** 
  * Initialize the RADOS instance and prepare to do other ops
  * Returns 0 on success, -ERR# on failure.
@@ -2121,6 +2244,12 @@ int RGWRados::init_complete()
 {
   int ret;
 
+  ret = replace_region_with_zonegroup();
+  if (ret < 0) {
+    lderr(cct) << "failed converting region to zonegroup : ret "<< ret << " " << cpp_strerror(-ret) << dendl;
+    return ret;
+  }
+  
   ret = realm.init(cct, this);
   if (ret < 0 && ret != -ENOENT) {
     lderr(cct) << "failed reading realm info: ret "<< ret << " " << cpp_strerror(-ret) << dendl;
@@ -2290,6 +2419,17 @@ int RGWRados::list_raw_prefixed_objs(string pool_name, const string& prefix, lis
   return 0;
 }
 
+int RGWRados::list_regions(list<string>& regions)
+{
+  string pool_name;
+  int ret = RGWZoneGroup::get_pool_name(cct, &pool_name);
+  if (ret < 0)
+    return ret;
+
+  return list_raw_prefixed_objs(pool_name, region_info_oid_prefix, regions);
+}
+
+
 int RGWRados::list_zonegroups(list<string>& zonegroups)
 {
   string pool_name;
@@ -2297,7 +2437,7 @@ int RGWRados::list_zonegroups(list<string>& zonegroups)
   if (ret < 0)
     return ret;
 
-  return list_raw_prefixed_objs(pool_name, region_info_oid_prefix, zonegroups);
+  return list_raw_prefixed_objs(pool_name, zone_group_info_oid_prefix, zonegroups);
 }
 
 int RGWRados::list_zones(list<string>& zones)
index b16c5f14d6d8159fe1d93ff3c8aca0fbbd7a3860..79fc27d3c29af998fc901500b303793f54ae08ae 100644 (file)
@@ -1044,6 +1044,7 @@ struct RGWZoneGroup {
   bool old_region;
 
   RGWZoneGroup() : is_master(false), cct(NULL), store(NULL), old_region(false) {}
+  RGWZoneGroup(const std::string &_name):name(_name) {}
 
   void encode(bufferlist& bl) const {
     ENCODE_START(3, 1, bl);
@@ -1079,17 +1080,20 @@ struct RGWZoneGroup {
     DECODE_FINISH(bl);
   }
 
-  int init(CephContext *_cct, RGWRados *_store, bool setup_zonegroup = true);
+  int init(CephContext *_cct, RGWRados *_store, bool setup_zonegroup = true,
+          bool old_region_format = false);
   int create_default();
   int store_info(bool exclusive);
-  int read_info(const string& zonegroup_name);
-  int read_default(RGWDefaultZoneGroupInfo& default_zonegroup);
+  int read_info(const string& zonegroup_name, bool old_region_format = false);
+  int read_default(RGWDefaultZoneGroupInfo& default_zonegroup,
+                  const string& oid);
   int set_as_default();
   int equals(const string& other_zonegroup);
-
+  int create();
+  int delete_obj(bool old_region_format = false);
   static int get_pool_name(CephContext *cct, string *pool_name);
-  const string& get_default_oid();
-  const string& get_info_oid_prefix();
+  const string& get_default_oid(bool old_region_format = false);
+  const string& get_info_oid_prefix(bool old_region_format = false);
   const string& get_json_perfix();
 
   void dump(Formatter *f) const;
@@ -1651,6 +1655,7 @@ public:
 
   int list_raw_prefixed_objs(string pool_name, const string& prefix, list<string>& result);
   int list_zonegroups(list<string>& zonegroups);
+  int list_regions(list<string>& regions);
   int list_zones(list<string>& zones);
   int list_realms(list<string>& realms);
 
@@ -1667,6 +1672,7 @@ public:
   /** Initialize the RADOS instance and prepare to do other ops */
   virtual int init_rados();
   int init_complete();
+  int replace_region_with_zonegroup();
   virtual int initialize();
   virtual void finalize();