diff options
author | Martin Schwenke <martin@meltin.net> | 2013-01-11 14:09:14 +1100 |
---|---|---|
committer | Amitay Isaacs <amitay@gmail.com> | 2013-05-24 14:08:07 +1000 |
commit | b5ebff6931adf0564bb1cbb98a9283382c578564 (patch) | |
tree | 99743532faf52b1b502a9612309b70cddb1c9794 | |
parent | 87eb70180aad04dc353c008f48b3b5fe652fa87c (diff) | |
download | samba-b5ebff6931adf0564bb1cbb98a9283382c578564.tar.gz samba-b5ebff6931adf0564bb1cbb98a9283382c578564.tar.xz samba-b5ebff6931adf0564bb1cbb98a9283382c578564.zip |
tools/ctdb: "ctdb runstate" now accepts optional expected run state arguments
If one or more run states are specified then "ctdb runstate" succeeds
only if ctdbd is in one of those run states.
At the moment, if the "setup" event fails then the initscript succeeds
but ctdbd exits almost immediately. This behaviour isn't very
friendly.
The initscript now waits until ctdbd is in "startup" or "running" run
state via the use of "ctdb runstate startup running", meaning that ctdbd
has successfully passed the "setup" event.
The "setup" event code in 00.ctdb now waits until ctdbd is in the
"setup" run state before proceeding via the use of "ctdb runstate setup".
Signed-off-by: Martin Schwenke <martin@meltin.net>
Pair-programmed-with: Amitay Isaacs <amitay@gmail.com>
(This used to be ctdb commit 4a2effcc455be67ff4a779a59ca81ba584312cd6)
-rwxr-xr-x | ctdb/config/ctdb.init | 2 | ||||
-rwxr-xr-x | ctdb/config/events.d/00.ctdb | 2 | ||||
-rw-r--r-- | ctdb/doc/ctdb.1.xml | 7 | ||||
-rw-r--r-- | ctdb/tools/ctdb.c | 25 |
4 files changed, 32 insertions, 4 deletions
diff --git a/ctdb/config/ctdb.init b/ctdb/config/ctdb.init index 6c4e16d0de..70dcfa6421 100755 --- a/ctdb/config/ctdb.init +++ b/ctdb/config/ctdb.init @@ -220,7 +220,7 @@ wait_until_ready () { _timeout="${1:-10}" # default is 10 seconds _count=0 - while ! ctdb ping >/dev/null 2>&1 ; do + while ! ctdb runstate startup running >/dev/null 2>&1 ; do if [ $_count -ge $_timeout ] ; then return 1 fi diff --git a/ctdb/config/events.d/00.ctdb b/ctdb/config/events.d/00.ctdb index c1ac11a923..02d1569107 100755 --- a/ctdb/config/events.d/00.ctdb +++ b/ctdb/config/events.d/00.ctdb @@ -53,7 +53,7 @@ wait_until_ready () { _timeout="${1:-10}" # default is 10 seconds _count=0 - while ! ctdb ping >/dev/null 2>&1 ; do + while ! ctdb runstate setup >/dev/null 2>&1 ; do if [ $_count -ge $_timeout ] ; then return 1 fi diff --git a/ctdb/doc/ctdb.1.xml b/ctdb/doc/ctdb.1.xml index d1734b7c8f..7242f3aa29 100644 --- a/ctdb/doc/ctdb.1.xml +++ b/ctdb/doc/ctdb.1.xml @@ -382,13 +382,18 @@ response from 3 time=0.000114 sec (2 clients) </screen> </refsect2> - <refsect2><title>runstate</title> + <refsect2><title>runstate [setup|startup|running]</title> <para> Print the runstate of the specified node. Runstates are used to serialise important state transitions in CTDB, particularly during startup. </para> <para> + If one or more optional runstate arguments are specified then + the node must be in one of these runstates for the command to + succeed. + </para> + <para> Example: ctdb runstate </para> <para> diff --git a/ctdb/tools/ctdb.c b/ctdb/tools/ctdb.c index 842c872b64..e21e845073 100644 --- a/ctdb/tools/ctdb.c +++ b/ctdb/tools/ctdb.c @@ -4385,6 +4385,29 @@ static int control_runstate(struct ctdb_context *ctdb, int argc, const char **ar printf("Unable to get runstate response from node %u\n", options.pnn); return -1; + } else { + bool found = true; + enum ctdb_runstate t; + int i; + for (i=0; i<argc; i++) { + found = false; + t = runstate_from_string(argv[i]); + if (t == CTDB_RUNSTATE_UNKNOWN) { + printf("Invalid run state (%s)\n", argv[i]); + return -1; + } + + if (t == runstate) { + found = true; + break; + } + } + + if (!found) { + printf("CTDB not in required run state (got %s)\n", + runstate_to_string((enum ctdb_runstate)runstate)); + return -1; + } } printf("%s\n", runstate_to_string(runstate)); @@ -5824,7 +5847,7 @@ static const struct { { "status", control_status, true, false, "show node status" }, { "uptime", control_uptime, true, false, "show node uptime" }, { "ping", control_ping, true, false, "ping all nodes" }, - { "runstate", control_runstate, true, false, "get runstate of a node" }, + { "runstate", control_runstate, true, false, "get/check runstate of a node", "[setup|startup|running]" }, { "getvar", control_getvar, true, false, "get a tunable variable", "<name>"}, { "setvar", control_setvar, true, false, "set a tunable variable", "<name> <value>"}, { "listvars", control_listvars, true, false, "list tunable variables"}, |