From: Orit Wasserman Date: Sun, 1 Jan 2017 10:36:04 +0000 (+0200) Subject: radosgw-admin: realm set should create a new realm X-Git-Tag: v11.2.1~64^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=68d2d4bb91d6c508c0e1c154aff3b5de3dc347eb;p=ceph.git radosgw-admin: realm set should create a new realm Fixes: http://tracker.ceph.com/issues/18333 Signed-off-by: Orit Wasserman (cherry picked from commit e23339c9ef34f6b9df90b1ab64b550af9b541d9e) --- diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index d1ad3467e9f..195fef06d87 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -3045,7 +3045,7 @@ int main(int argc, char **argv) cerr << "failed to list realms: " << cpp_strerror(-ret) << std::endl; return -ret; } - formatter->open_object_section("realmss_list"); + formatter->open_object_section("realms_list"); encode_json("default_info", default_id, formatter); encode_json("realms", realms, formatter); formatter->close_section(); @@ -3108,19 +3108,33 @@ int main(int argc, char **argv) return EINVAL; } RGWRealm realm(realm_id, realm_name); - int ret = realm.init(g_ceph_context, store, false); - if (ret < 0) { + bool new_realm = false; + int ret = realm.init(g_ceph_context, store); + if (ret < 0 && ret != -ENOENT) { cerr << "failed to init realm: " << cpp_strerror(-ret) << std::endl; return -ret; + } else if (ret == -ENOENT) { + new_realm = true; } ret = read_decode_json(infile, realm); if (ret < 0) { return 1; } - ret = realm.update(); - if (ret < 0) { - cerr << "ERROR: couldn't store realm info: " << cpp_strerror(-ret) << std::endl; - return 1; + /* new realm */ + if (new_realm) { + cout << "clearing period and epoch for new realm" << std::endl; + realm.clear_current_period_and_epoch(); + ret = realm.create(); + if (ret < 0) { + cerr << "ERROR: couldn't create new realm: " << cpp_strerror(-ret) << std::endl; + return 1; + } + } else { + ret = realm.update(); + if (ret < 0) { + cerr << "ERROR: couldn't store realm info: " << cpp_strerror(-ret) << std::endl; + return 1; + } } if (set_default) { diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index c44cd12c67b..9d820ff7f00 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -1503,7 +1503,10 @@ public: return current_period; } int set_current_period(RGWPeriod& period); - + void clear_current_period_and_epoch() { + current_period.clear(); + epoch = 0; + } epoch_t get_epoch() const { return epoch; } string get_control_oid();