summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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"},