summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Schwenke <martin@meltin.net>2013-01-11 14:09:14 +1100
committerAmitay Isaacs <amitay@gmail.com>2013-05-24 14:08:07 +1000
commitb5ebff6931adf0564bb1cbb98a9283382c578564 (patch)
tree99743532faf52b1b502a9612309b70cddb1c9794
parent87eb70180aad04dc353c008f48b3b5fe652fa87c (diff)
downloadsamba-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-xctdb/config/ctdb.init2
-rwxr-xr-xctdb/config/events.d/00.ctdb2
-rw-r--r--ctdb/doc/ctdb.1.xml7
-rw-r--r--ctdb/tools/ctdb.c25
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"},