]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd: add 'ceph osd stop <osd.nnn>' command
authorxie xingguo <xie.xingguo@zte.com.cn>
Mon, 15 Apr 2019 12:36:36 +0000 (20:36 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Thu, 18 Apr 2019 05:55:02 +0000 (13:55 +0800)
stop command can be used to force stopping a specified osd daemon, e.g.,
you don't have to pre-figure out where it located.

Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
qa/standalone/osd/osd-markdown.sh
src/common/ceph_strings.cc
src/include/rados.h
src/mon/MonCommands.h
src/mon/OSDMonitor.cc
src/osd/OSD.cc
src/osd/OSDMap.cc
src/osd/OSDMap.h

index 4c4fd767f65abd0c6f091d698faecc3b748feef0..a33f54003bbb5097c0447106f248927ada4eb06d 100755 (executable)
@@ -124,8 +124,23 @@ function TEST_markdown_boot_exceed_time() {
     ceph osd tree | grep up | grep osd.0 || return 1
 }
 
-main osd-markdown "$@"
+function TEST_osd_stop() {
+
+    local dir=$1
 
-# Local Variables:
-# compile-command: "cd ../.. ; make -j4 && test/osd/osd-bench.sh"
-# End:
+    run_mon $dir a || return 1
+    run_mgr $dir x || return 1
+    run_osd $dir 0 || return 1
+    run_osd $dir 1 || return 1
+    run_osd $dir 2 || return 1
+    osd_0_pid=$(cat $dir/osd.0.pid)
+    ps -p $osd_0_pid || return 1
+
+    ceph osd tree | grep osd.0 | grep up || return 1
+    ceph osd stop osd.0
+    sleep 15 # give osd plenty of time to notice and exit
+    ceph osd tree | grep down | grep osd.0 || return 1
+    ! ps -p $osd_0_pid || return 1
+}
+
+main osd-markdown "$@"
index 201f4dbb8ec6eaa0656b2309fa3bf8a64871fdd8..8711672689e8ed885f273437cd06c0af93ceaf5e 100644 (file)
@@ -65,6 +65,8 @@ const char *ceph_osd_state_name(int s)
                 return "noin";
         case CEPH_OSD_NOOUT:
                 return "noout";
+        case CEPH_OSD_STOP:
+                return "stop";
        default:
                return "???";
        }
index 59bd771c15e3c3469955ceefb3180d6b20e63ec8..a7a852e31bf50246074ed02cf740b44893b9d8d7 100644 (file)
@@ -124,6 +124,7 @@ struct ceph_eversion {
 #define CEPH_OSD_NODOWN       (1<<9)  /* osd can not be marked down */
 #define CEPH_OSD_NOIN         (1<<10) /* osd can not be marked in */
 #define CEPH_OSD_NOOUT        (1<<11) /* osd can not be marked out */
+#define CEPH_OSD_STOP         (1<<12) /* osd has been stopped by admin */
 
 extern const char *ceph_osd_state_name(int s);
 
index 729eb1cd8c95f795a67fb3e0632a3036826f68b5..3e6c5f7682cc777433984714fa82b4592632ebf5 100644 (file)
@@ -817,6 +817,10 @@ COMMAND("osd down " \
        "set osd(s) <id> [<id>...] down, " \
         "or use <any|all> to set all osds down", \
         "osd", "rw")
+COMMAND("osd stop " \
+        "type=CephString,name=ids,n=N", \
+        "stop the corresponding osd daemons and mark them as down", \
+        "osd", "rw")
 COMMAND("osd out " \
        "name=ids,type=CephString,n=N", \
        "set osd(s) <id> [<id>...] out, " \
index e5d031c9a37be0d27b0648ba63e2096e074011be..718e86b1cdbf3527575fba9c14db5c78a5174927 100644 (file)
@@ -10397,9 +10397,10 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
     pending_inc.new_require_osd_release = rel;
     goto update;
   } else if (prefix == "osd down" ||
-            prefix == "osd out" ||
-            prefix == "osd in" ||
-            prefix == "osd rm") {
+             prefix == "osd out" ||
+             prefix == "osd in" ||
+             prefix == "osd rm" ||
+             prefix == "osd stop") {
 
     bool any = false;
     bool stop = false;
@@ -10505,6 +10506,19 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
             }
            any = true;
          }
+        } else if (prefix == "osd stop") {
+          if (osdmap.is_stop(osd)) {
+            if (verbose)
+              ss << "osd." << osd << " is already stopped. ";
+          } else if (osdmap.is_down(osd)) {
+            pending_inc.pending_osd_state_set(osd, CEPH_OSD_STOP);
+            ss << "stop down osd." << osd << ". ";
+            any = true;
+          } else {
+            pending_inc.pending_osd_state_set(osd, CEPH_OSD_UP | CEPH_OSD_STOP);
+            ss << "stop osd." << osd << ". ";
+            any = true;
+          }
         }
       }
     }
index 16f85379e37de2cab935baa2e2a8bd9892823aeb..188bf29a31887b196af90eff2ed8fc343186f33b 100644 (file)
@@ -8241,6 +8241,9 @@ void OSD::_committed_osd_maps(epoch_t first, epoch_t last, MOSDMap *m)
       dout(0) << "map says i do not exist.  shutting down." << dendl;
       do_shutdown = true;   // don't call shutdown() while we have
                            // everything paused
+    } else if (osdmap->is_stop(whoami)) {
+      dout(0) << "map says i am stopped by admin. shutting down." << dendl;
+      do_shutdown = true;
     } else if (!osdmap->is_up(whoami) ||
               !osdmap->get_addrs(whoami).legacy_equals(
                 client_messenger->get_myaddrs()) ||
index 1fd46a7be4273f21a8f5a662a9c3232d3aff8182..246eb19797b5e11d48324b6ce3b50aadcd2c6fd6 100644 (file)
@@ -2030,6 +2030,7 @@ int OSDMap::apply_incremental(const Incremental &inc)
 
   for (const auto &client : inc.new_up_client) {
     osd_state[client.first] |= CEPH_OSD_EXISTS | CEPH_OSD_UP;
+    osd_state[client.first] &= ~CEPH_OSD_STOP; // if any
     osd_addrs->client_addrs[client.first].reset(
       new entity_addrvec_t(client.second));
     osd_addrs->hb_back_addrs[client.first].reset(
index 83b0037ad9e42af94ec5e8a673daa8488d205311..3b10a7b99556415a953501c3472dd0b2572d6394 100644 (file)
@@ -815,6 +815,11 @@ public:
     return !is_up(osd);
   }
 
+  bool is_stop(int osd) const {
+    return exists(osd) && is_down(osd) &&
+           (osd_state[osd] & CEPH_OSD_STOP);
+  }
+
   bool is_out(int osd) const {
     return !exists(osd) || get_weight(osd) == CEPH_OSD_OUT;
   }