diff --git a/qa/workunits/cephtool/test.sh b/qa/workunits/cephtool/test.sh index f03391362e6..2d28950d162 100755 --- a/qa/workunits/cephtool/test.sh +++ b/qa/workunits/cephtool/test.sh @@ -360,12 +360,15 @@ function test_tiering_1() expect_false ceph osd tier add slow2 cache # test some state transitions ceph osd tier cache-mode cache writeback + # forward is removed/deprecated expect_false ceph osd tier cache-mode cache forward - ceph osd tier cache-mode cache forward --yes-i-really-mean-it + expect_false ceph osd tier cache-mode cache forward --yes-i-really-mean-it expect_false ceph osd tier cache-mode cache readonly + ceph osd tier cache-mode cache proxy + ceph osd tier cache-mode cache none ceph osd tier cache-mode cache readonly --yes-i-really-mean-it expect_false ceph osd tier cache-mode cache forward - ceph osd tier cache-mode cache forward --yes-i-really-mean-it + expect_false ceph osd tier cache-mode cache forward --yes-i-really-mean-it ceph osd tier cache-mode cache none ceph osd tier cache-mode cache writeback ceph osd tier cache-mode cache proxy diff --git a/qa/workunits/rados/test_cache_pool.sh b/qa/workunits/rados/test_cache_pool.sh index 5e28b355aba..f4187a98adf 100755 --- a/qa/workunits/rados/test_cache_pool.sh +++ b/qa/workunits/rados/test_cache_pool.sh @@ -137,7 +137,7 @@ rados -p base put testclone /etc/hosts rados -p cache cache-flush-evict-all rados -p cache ls - | wc -l | grep 0 -ceph osd tier cache-mode cache forward --yes-i-really-mean-it +ceph osd tier cache-mode cache proxy --yes-i-really-mean-it rados -p base -s snap get testclone testclone.txt diff -q testclone.txt /etc/passwd rados -p base get testclone testclone.txt diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 7ba9cf5cda9..86d9eb486e2 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1486,6 +1486,27 @@ void OSDMonitor::encode_pending(MonitorDBStore::TransactionRef t) tmp.require_osd_release >= ceph_release_t::octopus) { dout(10) << __func__ << " first octopus+ epoch" << dendl; + // adjust obsoleted cache modes + for (auto& [poolid, pi] : tmp.pools) { + if (pi.cache_mode == pg_pool_t::CACHEMODE_FORWARD) { + if (pending_inc.new_pools.count(poolid) == 0) { + pending_inc.new_pools[poolid] = pi; + } + dout(10) << __func__ << " switching pool " << poolid + << " cachemode from forward -> proxy" << dendl; + pending_inc.new_pools[poolid].cache_mode = pg_pool_t::CACHEMODE_PROXY; + } + if (pi.cache_mode == pg_pool_t::CACHEMODE_READFORWARD) { + if (pending_inc.new_pools.count(poolid) == 0) { + pending_inc.new_pools[poolid] = pi; + } + dout(10) << __func__ << " switching pool " << poolid + << " cachemode from readforward -> readproxy" << dendl; + pending_inc.new_pools[poolid].cache_mode = + pg_pool_t::CACHEMODE_READPROXY; + } + } + // clear removed_snaps for every pool for (auto& [poolid, pi] : tmp.pools) { if (pi.removed_snaps.empty()) { @@ -12386,6 +12407,12 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, bool sure = false; cmd_getval(cct, cmdmap, "yes_i_really_mean_it", sure); + if (mode == pg_pool_t::CACHEMODE_FORWARD || + mode == pg_pool_t::CACHEMODE_READFORWARD) { + ss << "'" << modestr << "' is no longer a supported cache mode"; + err = -EPERM; + goto reply; + } if ((mode != pg_pool_t::CACHEMODE_WRITEBACK && mode != pg_pool_t::CACHEMODE_NONE && mode != pg_pool_t::CACHEMODE_PROXY && @@ -12410,10 +12437,10 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, /* Mode description: * * none: No cache-mode defined - * forward: Forward all reads and writes to base pool + * forward: Forward all reads and writes to base pool [removed] * writeback: Cache writes, promote reads from base pool * readonly: Forward writes to base pool - * readforward: Writes are in writeback mode, Reads are in forward mode + * readforward: Writes are in writeback mode, Reads are in forward mode [removed] * proxy: Proxy all reads and writes to base pool * readproxy: Writes are in writeback mode, Reads are in proxy mode * @@ -12421,10 +12448,10 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, * * none -> any * forward -> proxy || readforward || readproxy || writeback || any IF num_objects_dirty == 0 - * proxy -> forward || readforward || readproxy || writeback || any IF num_objects_dirty == 0 + * proxy -> readproxy || writeback || any IF num_objects_dirty == 0 * readforward -> forward || proxy || readproxy || writeback || any IF num_objects_dirty == 0 - * readproxy -> forward || proxy || readforward || writeback || any IF num_objects_dirty == 0 - * writeback -> readforward || readproxy || forward || proxy + * readproxy -> proxy || writeback || any IF num_objects_dirty == 0 + * writeback -> readproxy || proxy * readonly -> any */ @@ -12433,19 +12460,13 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, // whatever mode is on the pending state. if (p->cache_mode == pg_pool_t::CACHEMODE_WRITEBACK && - (mode != pg_pool_t::CACHEMODE_FORWARD && - mode != pg_pool_t::CACHEMODE_PROXY && - mode != pg_pool_t::CACHEMODE_READFORWARD && + (mode != pg_pool_t::CACHEMODE_PROXY && mode != pg_pool_t::CACHEMODE_READPROXY)) { ss << "unable to set cache-mode '" << pg_pool_t::get_cache_mode_name(mode) << "' on a '" << pg_pool_t::get_cache_mode_name(p->cache_mode) << "' pool; only '" - << pg_pool_t::get_cache_mode_name(pg_pool_t::CACHEMODE_FORWARD) - << "','" << pg_pool_t::get_cache_mode_name(pg_pool_t::CACHEMODE_PROXY) << "','" - << pg_pool_t::get_cache_mode_name(pg_pool_t::CACHEMODE_READFORWARD) - << "','" << pg_pool_t::get_cache_mode_name(pg_pool_t::CACHEMODE_READPROXY) << "' allowed."; err = -EINVAL; @@ -12453,25 +12474,19 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, } if ((p->cache_mode == pg_pool_t::CACHEMODE_READFORWARD && (mode != pg_pool_t::CACHEMODE_WRITEBACK && - mode != pg_pool_t::CACHEMODE_FORWARD && mode != pg_pool_t::CACHEMODE_PROXY && mode != pg_pool_t::CACHEMODE_READPROXY)) || (p->cache_mode == pg_pool_t::CACHEMODE_READPROXY && (mode != pg_pool_t::CACHEMODE_WRITEBACK && - mode != pg_pool_t::CACHEMODE_FORWARD && - mode != pg_pool_t::CACHEMODE_READFORWARD && mode != pg_pool_t::CACHEMODE_PROXY)) || (p->cache_mode == pg_pool_t::CACHEMODE_PROXY && (mode != pg_pool_t::CACHEMODE_WRITEBACK && - mode != pg_pool_t::CACHEMODE_FORWARD && - mode != pg_pool_t::CACHEMODE_READFORWARD && mode != pg_pool_t::CACHEMODE_READPROXY)) || (p->cache_mode == pg_pool_t::CACHEMODE_FORWARD && (mode != pg_pool_t::CACHEMODE_WRITEBACK && - mode != pg_pool_t::CACHEMODE_READFORWARD && mode != pg_pool_t::CACHEMODE_PROXY && mode != pg_pool_t::CACHEMODE_READPROXY))) { diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 6b500e0eba1..9f5491616c2 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -2730,11 +2730,6 @@ PrimaryLogPG::cache_result_t PrimaryLogPG::maybe_handle_cache_detail( ceph_abort_msg("unreachable"); return cache_result_t::NOOP; - case pg_pool_t::CACHEMODE_FORWARD: - // FIXME: this mode allows requests to be reordered. - do_cache_redirect(op); - return cache_result_t::HANDLED_REDIRECT; - case pg_pool_t::CACHEMODE_READONLY: // TODO: clean this case up if (!obc.get() && r == -ENOENT) { @@ -2749,23 +2744,8 @@ PrimaryLogPG::cache_result_t PrimaryLogPG::maybe_handle_cache_detail( // crap, there was a failure of some kind return cache_result_t::NOOP; - case pg_pool_t::CACHEMODE_READFORWARD: - // Do writeback to the cache tier for writes - if (op->may_write() || write_ordered || must_promote) { - if (agent_state && - agent_state->evict_mode == TierAgentState::EVICT_MODE_FULL) { - dout(20) << __func__ << " cache pool full, waiting" << dendl; - block_write_on_full_cache(missing_oid, op); - return cache_result_t::BLOCKED_FULL; - } - promote_object(obc, missing_oid, oloc, op, promote_obc); - return cache_result_t::BLOCKED_PROMOTE; - } - - // If it is a read, we can read, we need to forward it - do_cache_redirect(op); - return cache_result_t::HANDLED_REDIRECT; - + case pg_pool_t::CACHEMODE_FORWARD: + // this mode is deprecated; proxy instead case pg_pool_t::CACHEMODE_PROXY: if (!must_promote) { if (op->may_write() || op->may_cache() || write_ordered) { @@ -2786,6 +2766,8 @@ PrimaryLogPG::cache_result_t PrimaryLogPG::maybe_handle_cache_detail( promote_object(obc, missing_oid, oloc, op, promote_obc); return cache_result_t::BLOCKED_PROMOTE; + case pg_pool_t::CACHEMODE_READFORWARD: + // this mode is deprecated; proxy instead case pg_pool_t::CACHEMODE_READPROXY: // Do writeback to the cache tier for writes if (op->may_write() || write_ordered || must_promote) {