]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix missing master zone for a single zone zonegroup 11965/head
authorOrit Wasserman <owasserm@redhat.com>
Thu, 10 Nov 2016 15:17:05 +0000 (16:17 +0100)
committerOrit Wasserman <owasserm@redhat.com>
Thu, 17 Nov 2016 13:51:35 +0000 (14:51 +0100)
Fixes: http://tracker.ceph.com/issues/17364
Signed-off-by: Orit Wasserman <owasserm@redhat.com>
src/rgw/rgw_rados.cc

index 352c87e7b7fc2cde36feb508b4fad6e044203985..7c1b5c8737121d621ffd2e1387f375da4ee7907d 100644 (file)
@@ -3688,9 +3688,29 @@ int RGWRados::init_zg_from_period(bool *initialized)
     // use endpoints from the zonegroup's master zone
     auto master = zg.zones.find(zg.master_zone);
     if (master == zg.zones.end()) {
-      ldout(cct, 0) << "zonegroup " << zg.get_name() << " missing zone for "
-          "master_zone=" << zg.master_zone << dendl;
-      return -EINVAL;
+      // fix missing master zone for a single zone zonegroup
+      if (zg.master_zone.empty() && zg.zones.size() == 1) {
+       master = zg.zones.begin();
+       ldout(cct, 0) << "zonegroup " << zg.get_name() << " missing master_zone, setting zone " <<
+         master->second.name << " id:" << master->second.id << " as master" << dendl;
+       if (zonegroup.get_id() == zg.get_id()) {
+         zonegroup.master_zone = master->second.id;
+         zonegroup.update();
+       } else {
+         RGWZoneGroup fixed_zg(zg.get_id(),zg.get_name());
+         ret = fixed_zg.init(cct, this);
+         if (ret < 0) {
+           ldout(cct, 0) << "error initializing zonegroup : " << cpp_strerror(-ret) << dendl;
+           return ret;
+         }
+         fixed_zg.master_zone = master->second.id;
+         fixed_zg.update();
+       }
+      } else {
+       ldout(cct, 0) << "zonegroup " << zg.get_name() << " missing zone for master_zone=" <<
+         zg.master_zone << dendl;
+       return -EINVAL;
+      }
     }
     const auto& endpoints = master->second.endpoints;
     add_new_connection_to_map(zonegroup_conn_map, zg, new RGWRESTConn(cct, this, zg.get_id(), endpoints));
@@ -3732,9 +3752,18 @@ int RGWRados::init_zg_from_local(bool *creating_defaults)
     // use endpoints from the zonegroup's master zone
     auto master = zonegroup.zones.find(zonegroup.master_zone);
     if (master == zonegroup.zones.end()) {
-      ldout(cct, 0) << "zonegroup " << zonegroup.get_name() << " missing zone for "
+      // fix missing master zone for a single zone zonegroup
+      if (zonegroup.master_zone.empty() && zonegroup.zones.size() == 1) {
+       master = zonegroup.zones.begin();
+       ldout(cct, 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;
+       zonegroup.update();
+      } else {
+       ldout(cct, 0) << "zonegroup " << zonegroup.get_name() << " missing zone for "
           "master_zone=" << zonegroup.master_zone << dendl;
-      return -EINVAL;
+       return -EINVAL;
+      }
     }
     const auto& endpoints = master->second.endpoints;
     rest_master_conn = new RGWRESTConn(cct, this, zonegroup.get_id(), endpoints);