]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd,mon: add 'nosnaptrim' osd flag
authorSage Weil <sage@redhat.com>
Fri, 1 Dec 2017 15:00:49 +0000 (09:00 -0600)
committerSage Weil <sage@redhat.com>
Sat, 2 Dec 2017 03:26:48 +0000 (21:26 -0600)
Now

 ceph osd {set,unset} nosnaptrim

will suspend or resume snap trimming.

Signed-off-by: Sage Weil <sage@redhat.com>
src/include/rados.h
src/mon/MonCommands.h
src/mon/OSDMonitor.cc
src/osd/OSDMap.cc
src/osd/PrimaryLogPG.cc
src/osd/PrimaryLogPG.h

index a5dcbfaa76d2c4233132cbbdc2abdb4975e25ce3..f57dda8080d8a3473f3ed91bd4a45ee1425c6bde 100644 (file)
@@ -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|       \
index 4694c1102b4622d032b1444d7e1a19602a0e1b33..ff467957e7bab0c617835190c3d4cbf39083be70 100644 (file)
@@ -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 <key>", "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 <key>", "osd", "rw", "cli,rest")
 COMMAND("osd require-osd-release "\
        "name=release,type=CephChoices,strings=luminous|mimic " \
index 13bf749b2a29e3a91bc83f3d1cfc9f11aca55737..4c214ea29b3dc76f992bba28b8d4a69f7f8a6136 100644 (file)
@@ -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;
index c7b13a77d698145f3938d520e9e8b6ea033fef79..5b9cf4a53b780880d8945f12b53df3d697695c09 100644 (file)
@@ -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;
index 48c678ce735c408f8e90f13ba05fc4c0ab7c9b36..fd41d69d04050bb5c618462bf9ff0fdb4a0a63c6 100644 (file)
@@ -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());
+    }
   }
 }
 
index a7f228f7aac435b8f98dca05191bff51b2643161..3aaae3d307c77462aa5049e4f623cb0844a75136 100644 (file)
@@ -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;