]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: get/set region map
authorYehuda Sadeh <yehuda@inktank.com>
Fri, 22 Feb 2013 01:46:24 +0000 (17:46 -0800)
committerYehuda Sadeh <yehuda@inktank.com>
Wed, 8 May 2013 17:54:54 +0000 (10:54 -0700)
Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_admin.cc
src/rgw/rgw_rados.cc
src/rgw/rgw_rados.h

index 84cb2a4a10bbce849f3c9bf139e495e14b2ec70e..e1dba681cb6ea3278e62cc880ae45ef489a76a9d 100644 (file)
@@ -65,6 +65,8 @@ void _usage()
   cerr << "  regions list               list all regions set on this cluster\n";
   cerr << "  region set                 set region info\n";
   cerr << "  region default             set default region\n";
+  cerr << "  region-map show            show region-map\n";            
+  cerr << "  region-map set             set region-map\n";            
   cerr << "  zone info                  show zone cluster params\n";
   cerr << "  zone set                   set zone cluster params\n";
   cerr << "  zone list                  list all zones set on this cluster\n";
@@ -175,6 +177,8 @@ enum {
   OPT_REGION_LIST,
   OPT_REGION_SET,
   OPT_REGION_DEFAULT,
+  OPT_REGIONMAP_SHOW,
+  OPT_REGIONMAP_SET,
   OPT_ZONE_INFO,
   OPT_ZONE_SET,
   OPT_ZONE_LIST,
@@ -200,6 +204,8 @@ static int get_cmd(const char *cmd, const char *prev_cmd, bool *need_more)
       strcmp(cmd, "user") == 0 ||
       strcmp(cmd, "region") == 0 ||
       strcmp(cmd, "regions") == 0 ||
+      strcmp(cmd, "region-map") == 0 ||
+      strcmp(cmd, "regionmap") == 0 ||
       strcmp(cmd, "zone") == 0) {
     *need_more = true;
     return 0;
@@ -301,6 +307,12 @@ static int get_cmd(const char *cmd, const char *prev_cmd, bool *need_more)
   } else if (strcmp(prev_cmd, "regions") == 0) {
     if (strcmp(cmd, "list") == 0)
       return OPT_REGION_LIST;
+  } else if (strcmp(prev_cmd, "region-map") == 0 ||
+             strcmp(prev_cmd, "regionmap") == 0) {
+    if (strcmp(cmd, "show") == 0)
+      return OPT_REGIONMAP_SHOW;
+    if (strcmp(cmd, "set") == 0)
+      return OPT_REGIONMAP_SET;
   } else if (strcmp(prev_cmd, "zone") == 0) {
     if (strcmp(cmd, "info") == 0)
       return OPT_ZONE_INFO;
@@ -661,6 +673,7 @@ int main(int argc, char **argv)
 
   bool raw_storage_op = (opt_cmd == OPT_REGION_INFO || opt_cmd == OPT_REGION_LIST ||
                          opt_cmd == OPT_REGION_SET || opt_cmd == OPT_REGION_DEFAULT ||
+                         opt_cmd == OPT_REGIONMAP_SHOW || opt_cmd == OPT_REGIONMAP_SET ||
                          opt_cmd == OPT_ZONE_INFO || opt_cmd == OPT_ZONE_SET ||
                          opt_cmd == OPT_ZONE_LIST);
 
@@ -752,6 +765,34 @@ int main(int argc, char **argv)
       }
     }
 
+    if (opt_cmd == OPT_REGIONMAP_SHOW) {
+      RGWRegionMap regionmap;
+      int ret = regionmap.read(g_ceph_context, store);
+      if (ret < 0) {
+       cerr << "failed to read region map: " << cpp_strerror(-ret) << std::endl;
+       return -ret;
+      }
+      encode_json("region-map", regionmap, formatter);
+      formatter->flush(cout);
+    }
+
+    if (opt_cmd == OPT_REGIONMAP_SET) {
+      RGWRegionMap regionmap;
+      int ret = read_decode_json(infile, regionmap);
+      if (ret < 0) {
+        return 1;
+      }
+
+      ret = regionmap.store(g_ceph_context, store);
+      if (ret < 0) {
+        cerr << "ERROR: couldn't store region map info: " << cpp_strerror(-ret) << std::endl;
+        return 1;
+      }
+
+      encode_json("region-map", regionmap, formatter);
+      formatter->flush(cout);
+    }
+
     if (opt_cmd == OPT_ZONE_INFO) {
       RGWRegion region;
       int ret = region.init(g_ceph_context, store);
index 545f43b23fd0639c0ba1f6677614963b5e7b1942..4d4e63a8e7639532c7763042a462492574deeaf3 100644 (file)
@@ -52,6 +52,7 @@ static string zone_info_oid_prefix = "zone_info.";
 static string region_info_oid_prefix = "region_info.";
 
 static string default_region_info_oid = "default.region";
+static string region_map_oid = "region_map";
 
 
 static RGWObjCategory shadow_category = RGW_OBJ_CATEGORY_SHADOW;
@@ -305,6 +306,54 @@ int RGWZoneParams::store_info(CephContext *cct, RGWRados *store, RGWRegion& regi
   return ret;
 }
 
+void RGWRegionMap::get_params(CephContext *cct, string& pool_name, string& oid)
+{
+  pool_name = cct->_conf->rgw_zone_root_pool;
+  if (pool_name.empty()) {
+    pool_name = RGW_DEFAULT_ZONE_ROOT_POOL;
+  }
+  oid = region_map_oid;
+}
+
+int RGWRegionMap::read(CephContext *cct, RGWRados *store)
+{
+  string pool_name, oid;
+
+  get_params(cct, pool_name, oid);
+
+  rgw_bucket pool(pool_name.c_str());
+
+  bufferlist bl;
+  int ret = rgw_get_obj(store, NULL, pool, oid, bl);
+  if (ret < 0)
+    return ret;
+
+  try {
+    bufferlist::iterator iter = bl.begin();
+    ::decode(*this, iter);
+  } catch (buffer::error& err) {
+    ldout(cct, 0) << "ERROR: failed to decode region map info from " << pool << ":" << oid << dendl;
+    return -EIO;
+  }
+
+  return 0;
+}
+
+int RGWRegionMap::store(CephContext *cct, RGWRados *store)
+{
+  string pool_name, oid;
+
+  get_params(cct, pool_name, oid);
+
+  rgw_bucket pool(pool_name.c_str());
+
+  bufferlist bl;
+  ::encode(*this, bl);
+  int ret = rgw_put_system_obj(store, pool, oid, bl.c_str(), bl.length(), false, NULL);
+
+  return ret;
+}
+
 void RGWObjManifest::append(RGWObjManifest& m)
 {
   map<uint64_t, RGWObjManifestPart>::iterator iter;
index 9d215908a7e29545135920c07860ab119ba93716..078d826ede325271527af697e0045ed6f8c857d9 100644 (file)
@@ -403,6 +403,10 @@ struct RGWRegionMap {
     DECODE_FINISH(bl);
   }
 
+  void get_params(CephContext *cct, string& pool_name, string& oid);
+  int read(CephContext *cct, RGWRados *store);
+  int store(CephContext *cct, RGWRados *store);
+
   void dump(Formatter *f) const;
   void decode_json(JSONObj *obj);
 };