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
// 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 " \
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;
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);