]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
OSDMonitor: do not add non-empty tier pool unless forced 1335/head
authorSage Weil <sage@inktank.com>
Tue, 4 Mar 2014 05:11:17 +0000 (21:11 -0800)
committerSage Weil <sage@inktank.com>
Tue, 4 Mar 2014 05:11:17 +0000 (21:11 -0800)
In general, users should not use non-empty pools as new tiers or else
things can behave strangely:

 - the data sets are unrelated behavior will be... strange.
 - if the cache pool is not "new" and does not do the OMAP flag, the OSD
   will not know not to flush omap objects to an EC base tier
 - probably other random stuff I'm forgetting

Allow a user to shoot themselves in the foot with --force-nonempty.

Implements: #7457
Signed-off-by: Sage Weil <sage@inktank.com>
qa/workunits/cephtool/test.sh
src/mon/MonCommands.h
src/mon/OSDMonitor.cc
src/mon/PGMap.h

index 4da5cd58aa13c2e2ba6b47b0ef51eeb4b4977166..d4ccc9d178e4f538b1a181f7554ae0b8dc0c46c7 100755 (executable)
@@ -74,6 +74,17 @@ ceph osd tier set-overlay metadata cache
 ceph osd tier remove-overlay metadata
 ceph osd tier remove metadata cache
 ceph osd tier remove data cache2
+
+# make sure a non-empty pool fails
+rados -p cache2 put /etc/passwd /etc/passwd
+while ! ceph df | grep cache2 | grep ' 1 ' ; do
+    echo waiting for pg stats to flush
+    sleep 2
+done
+expect_false ceph osd tier add data cache2
+ceph osd tier add data cache2 --force-nonempty
+ceph osd tier remove data cache2
+
 ceph osd pool delete cache cache --yes-i-really-really-mean-it
 ceph osd pool delete cache2 cache2 --yes-i-really-really-mean-it
 
index b84b26567c51c168a6ee4a5198472a42453f1b18..230bd1014b10bcf943a395c0494fb038d0762fa4 100644 (file)
@@ -552,7 +552,8 @@ COMMAND("osd thrash " \
 // tiering
 COMMAND("osd tier add " \
        "name=pool,type=CephPoolname " \
-       "name=tierpool,type=CephPoolname",
+       "name=tierpool,type=CephPoolname " \
+       "name=force_nonempty,type=CephChoices,strings=--force-nonempty,req=false",
        "add the tier <tierpool> to base pool <pool>", "osd", "rw", "cli,rest")
 COMMAND("osd tier remove " \
        "name=pool,type=CephPoolname " \
index 1cee7d5935a29c184d9989438a1bd4942718f85a..2f86b194c0bfc4e17e483c3e51fd2033ce80c26d 100644 (file)
@@ -4494,6 +4494,17 @@ done:
       err = -EINVAL;
       goto reply;
     }
+    // make sure new tier is empty
+    string force_nonempty;
+    cmd_getval(g_ceph_context, cmdmap, "force_nonempty", force_nonempty);
+    const pool_stat_t& tier_stats =
+      mon->pgmon()->pg_map.get_pg_pool_sum_stat(tierpool_id);
+    if (tier_stats.stats.sum.num_objects != 0 &&
+       force_nonempty != "--force-nonempty") {
+      ss << "tier pool '" << tierpoolstr << "' is not empty; --force-nonempty to force";
+      err = -ENOTEMPTY;
+      goto reply;
+    }
     // go
     pending_inc.get_new_pool(pool_id, p)->tiers.insert(tierpool_id);
     pending_inc.get_new_pool(tierpool_id, tp)->tier_of = pool_id;
index 9c346403abec5775f371cb0d7bcc0cfb548e9455..65eccd35cbdec4ea7ca61be8ebb0b486afd341be 100644 (file)
@@ -205,6 +205,12 @@ public:
     stamp = s;
   }
 
+  const pool_stat_t& get_pg_pool_sum_stat(int64_t pool) {
+    ceph::unordered_map<int,pool_stat_t>::iterator p = pg_pool_sum.find(pool);
+    assert(p != pg_pool_sum.end());
+    return p->second;
+  }
+
   void update_pg(pg_t pgid, bufferlist& bl);
   void remove_pg(pg_t pgid);
   void update_osd(int osd, bufferlist& bl);