From 848fd1f4af3c98e14dfb407f64a304c4a4a5e960 Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Thu, 16 Feb 2017 21:26:12 -0500 Subject: [PATCH] mon: detect existing fs and duplicate name earlier Detecting creation of an equivalent fs was made impossible by 052c3d3f681017d56b5b0ee5cf6f65bffc952a4c, as an existing file system will obviously have objects in its pool. This commit moves the pool with objects check later and uses a more helpful errno (EEXIST) for the case where a fs with the same name already exists (but uses different pools). Fixes: http://tracker.ceph.com/issues/18964 Signed-off-by: Patrick Donnelly --- src/mon/MDSMonitor.cc | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index 4dbce27162c7d..e834678f6eb97 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -1582,27 +1582,17 @@ int MDSMonitor::management_command( return -ENOENT; } - string force; - cmd_getval(g_ceph_context,cmdmap, "force", force); - int64_t metadata_num_objects = mon->pgmon()->pg_map.pg_pool_sum[metadata].stats.sum.num_objects; - if (force != "--force" && metadata_num_objects > 0) { - ss << "pool '" << metadata_name - << "' already contains some objects. Use an empty pool instead."; - return -EINVAL; - } - string data_name; cmd_getval(g_ceph_context, cmdmap, "data", data_name); int64_t data = mon->osdmon()->osdmap.lookup_pg_pool_name(data_name); if (data < 0) { ss << "pool '" << data_name << "' does not exist"; return -ENOENT; - } - if (data == 0) { + } else if (data == 0) { ss << "pool '" << data_name << "' has id 0, which CephFS does not allow. Use another pool or recreate it to get a non-zero pool id."; return -EINVAL; } - + string fs_name; cmd_getval(g_ceph_context, cmdmap, "fs_name", fs_name); if (fs_name.empty()) { @@ -1610,9 +1600,7 @@ int MDSMonitor::management_command( // commmands that refer to FS by name in future. ss << "Filesystem name may not be empty"; return -EINVAL; - } - - if (pending_fsmap.get_filesystem(fs_name)) { + } else if (pending_fsmap.get_filesystem(fs_name)) { auto fs = pending_fsmap.get_filesystem(fs_name); if (*(fs->mds_map.data_pools.begin()) == data && fs->mds_map.metadata_pool == metadata) { @@ -1621,10 +1609,19 @@ int MDSMonitor::management_command( return 0; } else { ss << "filesystem already exists with name '" << fs_name << "'"; - return -EINVAL; + return -EEXIST; } } + string force; + cmd_getval(g_ceph_context,cmdmap, "force", force); + int64_t metadata_num_objects = mon->pgmon()->pg_map.pg_pool_sum[metadata].stats.sum.num_objects; + if (force != "--force" && metadata_num_objects > 0) { + ss << "pool '" << metadata_name + << "' already contains some objects. Use an empty pool instead."; + return -EINVAL; + } + if (pending_fsmap.filesystem_count() > 0 && !pending_fsmap.get_enable_multiple()) { ss << "Creation of multiple filesystems is disabled. To enable " -- 2.39.5