From a53ba7314c53e75d1e0b8a0edd29181db3c93863 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 1 Dec 2017 09:00:49 -0600 Subject: [PATCH] osd,mon: add 'nosnaptrim' osd flag Now ceph osd {set,unset} nosnaptrim will suspend or resume snap trimming. Signed-off-by: Sage Weil --- src/include/rados.h | 1 + src/mon/MonCommands.h | 4 ++-- src/mon/OSDMonitor.cc | 4 ++++ src/osd/OSDMap.cc | 3 +++ src/osd/PrimaryLogPG.cc | 8 ++++++-- src/osd/PrimaryLogPG.h | 6 +++++- 6 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/include/rados.h b/src/include/rados.h index a5dcbfaa76d2c..f57dda8080d8a 100644 --- a/src/include/rados.h +++ b/src/include/rados.h @@ -157,6 +157,7 @@ extern const char *ceph_osd_state_name(int s); #define CEPH_OSDMAP_REQUIRE_LUMINOUS (1<<18) /* require l for booting osds */ #define CEPH_OSDMAP_RECOVERY_DELETES (1<<19) /* deletes performed during recovery instead of peering */ #define CEPH_OSDMAP_PURGED_SNAPDIRS (1<<20) /* osds have converted snapsets */ +#define CEPH_OSDMAP_NOSNAPTRIM (1<<21) /* disable snap trimming */ /* these are hidden in 'ceph status' view */ #define CEPH_OSDMAP_SEMIHIDDEN_FLAGS (CEPH_OSDMAP_REQUIRE_JEWEL| \ diff --git a/src/mon/MonCommands.h b/src/mon/MonCommands.h index 4694c1102b462..ff467957e7bab 100644 --- a/src/mon/MonCommands.h +++ b/src/mon/MonCommands.h @@ -728,11 +728,11 @@ COMMAND("osd erasure-code-profile ls", \ "list all erasure code profiles", \ "osd", "r", "cli,rest") COMMAND("osd set " \ - "name=key,type=CephChoices,strings=full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent|sortbitwise|recovery_deletes|require_jewel_osds|require_kraken_osds " \ + "name=key,type=CephChoices,strings=full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent|nosnaptrim|sortbitwise|recovery_deletes|require_jewel_osds|require_kraken_osds " \ "name=sure,type=CephChoices,strings=--yes-i-really-mean-it,req=false", \ "set ", "osd", "rw", "cli,rest") COMMAND("osd unset " \ - "name=key,type=CephChoices,strings=full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent", \ + "name=key,type=CephChoices,strings=full|pause|noup|nodown|noout|noin|nobackfill|norebalance|norecover|noscrub|nodeep-scrub|notieragent|nosnaptrim", \ "unset ", "osd", "rw", "cli,rest") COMMAND("osd require-osd-release "\ "name=release,type=CephChoices,strings=luminous|mimic " \ diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 13bf749b2a29e..4c214ea29b3dc 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -8523,6 +8523,8 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, return prepare_set_flag(op, CEPH_OSDMAP_NODEEP_SCRUB); else if (key == "notieragent") return prepare_set_flag(op, CEPH_OSDMAP_NOTIERAGENT); + else if (key == "nosnaptrim") + return prepare_set_flag(op, CEPH_OSDMAP_NOSNAPTRIM); else if (key == "sortbitwise") { return prepare_set_flag(op, CEPH_OSDMAP_SORTBITWISE); } else if (key == "recovery_deletes") { @@ -8619,6 +8621,8 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op, return prepare_unset_flag(op, CEPH_OSDMAP_NODEEP_SCRUB); else if (key == "notieragent") return prepare_unset_flag(op, CEPH_OSDMAP_NOTIERAGENT); + else if (key == "nosnaptrim") + return prepare_unset_flag(op, CEPH_OSDMAP_NOSNAPTRIM); else { ss << "unrecognized flag '" << key << "'"; err = -EINVAL; diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index c7b13a77d6981..5b9cf4a53b780 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -3056,6 +3056,8 @@ string OSDMap::get_flag_string(unsigned f) s += ",nodeep-scrub"; if (f & CEPH_OSDMAP_NOTIERAGENT) s += ",notieragent"; + if (f & CEPH_OSDMAP_NOSNAPTRIM) + s += ",nosnaptrim"; if (f & CEPH_OSDMAP_SORTBITWISE) s += ",sortbitwise"; if (f & CEPH_OSDMAP_REQUIRE_JEWEL) @@ -4712,6 +4714,7 @@ void OSDMap::check_health(health_check_map_t *checks) const CEPH_OSDMAP_NOSCRUB | CEPH_OSDMAP_NODEEP_SCRUB | CEPH_OSDMAP_NOTIERAGENT | + CEPH_OSDMAP_NOSNAPTRIM | CEPH_OSDMAP_NOREBALANCE; if (test_flag(warn_flags)) { ostringstream ss; diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 48c678ce735c4..fd41d69d04050 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -3841,8 +3841,12 @@ void PrimaryLogPG::kick_snap_trim() assert(is_active()); assert(is_primary()); if (is_clean() && !snap_trimq.empty()) { - dout(10) << __func__ << ": clean and snaps to trim, kicking" << dendl; - snap_trimmer_machine.process_event(KickTrim()); + if (get_osdmap()->test_flag(CEPH_OSDMAP_NOSNAPTRIM)) { + dout(10) << __func__ << ": nosnaptrim set, not kicking" << dendl; + } else { + dout(10) << __func__ << ": clean and snaps to trim, kicking" << dendl; + snap_trimmer_machine.process_event(KickTrim()); + } } } diff --git a/src/osd/PrimaryLogPG.h b/src/osd/PrimaryLogPG.h index a7f228f7aac43..3aaae3d307c77 100644 --- a/src/osd/PrimaryLogPG.h +++ b/src/osd/PrimaryLogPG.h @@ -1514,7 +1514,11 @@ private: void log_enter(const char *state_name); void log_exit(const char *state_name, utime_t duration); bool can_trim() { - return pg->is_clean() && !pg->scrubber.active && !pg->snap_trimq.empty(); + return + pg->is_clean() && + !pg->scrubber.active && + !pg->snap_trimq.empty() && + !pg->get_osdmap()->test_flag(CEPH_OSDMAP_NOSNAPTRIM); } } snap_trimmer_machine; -- 2.39.5