The branch, master has been updated via 5ee242c949a98bb7397e0f7368b20d44c06fe772 (commit) via 2d75a04ba9a2e87a0dcb9bf778c58e335af1871c (commit) via 59a47c0674bacfebc17a1b44f0244727bf2fa7a4 (commit) via 440892d75ef73c0aca22f47c0c01712be00cf5b7 (commit) via 14589bf7c16ba017fe00d4e8bea8cc501546c60f (commit) via 59520c9785d113ad5063eb5fbe42a9efc7e30076 (commit) via 3cc878bc97fdac764a60ed805f64d649eaab06e8 (commit) via 16aba4eb620844626a1c71c58b51658caf44dea6 (commit) via eaa7c165f58abd7e259c37d76b7dd37c91e13d9f (commit) via 0e56e2dad1861892aa8ba59494ad244f2498314e (commit) via 7895bc003f087ab2f3181df3c464386f59bfcc39 (commit) from af540ef728303b4a0a188b17c695e9aefab34489 (commit)
http://gitweb.samba.org/?p=ctdb.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 5ee242c949a98bb7397e0f7368b20d44c06fe772 Author: Martin Schwenke <mar...@meltin.net> Date: Tue Oct 16 17:04:48 2012 +1100 scripts: Refactor logging code in initscript and functions file Signed-off-by: Martin Schwenke <mar...@meltin.net> commit 2d75a04ba9a2e87a0dcb9bf778c58e335af1871c Author: Martin Schwenke <mar...@meltin.net> Date: Thu Oct 11 16:21:02 2012 +1100 tools/ctdb_diagnostics: Add "ctdb listvars" output Signed-off-by: Martin Schwenke <mar...@meltin.net> commit 59a47c0674bacfebc17a1b44f0244727bf2fa7a4 Author: Martin Schwenke <mar...@meltin.net> Date: Thu Oct 11 16:18:26 2012 +1100 initscript: Check that rc.ctdb is executable before running it Signed-off-by: Martin Schwenke <mar...@meltin.net> commit 440892d75ef73c0aca22f47c0c01712be00cf5b7 Author: Martin Schwenke <mar...@meltin.net> Date: Thu Oct 11 16:10:19 2012 +1100 ctdbd: Remove references to forcing running of eventscripts from log messages Running of eventscripts can be initiated from many places, including the recovery daemon. Signed-off-by: Martin Schwenke <mar...@meltin.net> commit 14589bf7c16ba017fe00d4e8bea8cc501546c60f Author: Martin Schwenke <mar...@meltin.net> Date: Thu Oct 11 15:59:00 2012 +1100 recoverd: Clarify some misleading log messages Signed-off-by: Martin Schwenke <mar...@meltin.net> commit 59520c9785d113ad5063eb5fbe42a9efc7e30076 Author: Martin Schwenke <mar...@meltin.net> Date: Thu Oct 11 15:49:13 2012 +1100 tools/ctdb: Remove extra header from natgwlist -Y output Signed-off-by: Martin Schwenke <mar...@meltin.net> commit 3cc878bc97fdac764a60ed805f64d649eaab06e8 Author: Martin Schwenke <mar...@meltin.net> Date: Thu Oct 11 15:17:54 2012 +1100 recoverd: Verifying local IPs should only check for unhosted available IPs Currently it checks for unhosted IPs among the known IPs rather than available IPs. This means that a takeover run can be flagged even when that takeover run will be unable to assign a known, unhosted IP. Pair-programmed-with: Amitay Isaacs <ami...@gmail.com> Signed-off-by: Martin Schwenke <mar...@meltin.net> commit 16aba4eb620844626a1c71c58b51658caf44dea6 Author: Martin Schwenke <mar...@meltin.net> Date: Thu Oct 11 14:34:37 2012 +1100 Revert "Eventscripts - add facility to 10.interface to delete unmanaged IPs" This reverts commit 88f88d86b0d08240f749fb721b8c401c2eeb1099. This is dangerous and, on reflection, I can't see it being useful. There are often permanent IPs on interfaces that CTDB shares with its public IPs. commit eaa7c165f58abd7e259c37d76b7dd37c91e13d9f Author: Martin Schwenke <mar...@meltin.net> Date: Wed Sep 26 14:37:49 2012 +1000 Eventscripts: "recovered" event should not fail on NATGW failure The recovery process has no protection against the "recovered" event failing, so this can cause a recovery loop. Instead of failing the "recovered" event, add a "monitor" event and fail that instead. In this case the failure semantics are well defined. A separate patch should ban nodes if the "recovered" event fails for an unknown reason. Signed-off-by: Martin Schwenke <mar...@meltin.net> commit 0e56e2dad1861892aa8ba59494ad244f2498314e Author: Martin Schwenke <mar...@meltin.net> Date: Fri Sep 28 09:39:12 2012 +1000 Logging: Map TEVENT_DEBUG_FATAL to DEBUG_CRIT This is currently mapped to DEBUG_EMERG. CTDB really has no business logging anything at EMERG level since the whole system is not about to abort or catch fire. EMERG causes the message to appear on the console and on every terminal. That's a bit overzealous! There would be very few situations where logs are being filtered at level below ERROR, so CRIT should certainly suffice. The trigger for this was curious messages saying "No event for <n> seconds!" logged in a user's terminal. Pair-programmed-with: Amitay Isaacs <ami...@gmail.com> Signed-off-by: Martin Schwenke <mar...@meltin.net> commit 7895bc003f087ab2f3181df3c464386f59bfcc39 Author: Martin Schwenke <mar...@meltin.net> Date: Thu Sep 6 20:22:38 2012 +1000 common: Debug ctdb_addr_to_str() using new function ctdb_external_trace() We've seen this function report "Unknown family, 0" and then CTDB disappeared without a trace. If we can reproduce it then this might help us to debug it. The idea is that you do something like the following in /etc/sysconfig/ctdb: export CTDB_EXTERNAL_TRACE="/etc/ctdb/config/gcore_trace.sh" When we hit this error than we call out to gcore to get a core file so we can do forensics. This might block CTDB for a few seconds. Signed-off-by: Martin Schwenke <mar...@meltin.net> ----------------------------------------------------------------------- Summary of changes: Makefile.in | 1 + common/ctdb_util.c | 25 +++++++++++ config/ctdb.init | 18 +------- config/events.d/10.interface | 29 ------------ config/events.d/11.natgw | 30 +++++++++++-- config/functions | 31 ++++++++++--- config/gcore_trace.sh | 3 + include/ctdb_private.h | 1 + packaging/RPM/ctdb.spec.in | 1 + server/ctdb_logging.c | 4 +- server/ctdb_recoverd.c | 55 +++++++++++++++-------- server/eventscript.c | 4 +- tests/eventscripts/10.interface.monitor.015.sh | 22 --------- tools/ctdb.c | 4 -- tools/ctdb_diagnostics | 1 + 15 files changed, 122 insertions(+), 107 deletions(-) create mode 100755 config/gcore_trace.sh delete mode 100755 tests/eventscripts/10.interface.monitor.015.sh Changeset truncated at 500 lines: diff --git a/Makefile.in b/Makefile.in index 48cb57c..6c82260 100755 --- a/Makefile.in +++ b/Makefile.in @@ -359,6 +359,7 @@ install: all $(PMDA_INSTALL) if [ ! -f $(DESTDIR)$(etcdir)/ctdb/notify.sh ];then ${INSTALLCMD} -m 755 config/notify.sh $(DESTDIR)$(etcdir)/ctdb; fi ${INSTALLCMD} -m 755 config/debug-hung-script.sh $(DESTDIR)$(etcdir)/ctdb if [ ! -f $(DESTDIR)$(etcdir)/ctdb/ctdb-crash-cleanup.sh ];then ${INSTALLCMD} -m 755 config/ctdb-crash-cleanup.sh $(DESTDIR)$(etcdir)/ctdb; fi + if [ ! -f $(DESTDIR)$(etcdir)/ctdb/gcore_trace.sh ];then ${INSTALLCMD} -m 755 config/gcore_trace.sh $(DESTDIR)$(etcdir)/ctdb; fi install_pmda: $(INSTALLCMD) -m 755 -d $(PMDA_DEST_DIR) diff --git a/common/ctdb_util.c b/common/ctdb_util.c index ed322ac..71dee2b 100644 --- a/common/ctdb_util.c +++ b/common/ctdb_util.c @@ -59,6 +59,30 @@ void ctdb_fatal(struct ctdb_context *ctdb, const char *msg) abort(); } +/* Invoke an external program to do some sort of tracing on the CTDB + * process. This might block for a little while. The external + * program is specified by the environment variable + * CTDB_EXTERNAL_TRACE. This program should take one argument: the + * pid of the process to trace. Commonly, the program would be a + * wrapper script around gcore. + */ +void ctdb_external_trace(void) +{ + + const char * t = getenv("CTDB_EXTERNAL_TRACE"); + char * cmd; + + if (t == NULL) { + return; + } + + cmd = talloc_asprintf(NULL, "%s %lu", t, (unsigned long) getpid()); + DEBUG(DEBUG_WARNING,("begin external trace: %s\n", cmd)); + system(cmd); + DEBUG(DEBUG_WARNING,("end external trace: %s\n", cmd)); + talloc_free(cmd); +} + /* parse a IP:port pair */ @@ -555,6 +579,7 @@ char *ctdb_addr_to_str(ctdb_sock_addr *addr) break; default: DEBUG(DEBUG_ERR, (__location__ " ERROR, unknown family %u\n", addr->sa.sa_family)); + ctdb_external_trace(); } return cip; diff --git a/config/ctdb.init b/config/ctdb.init index 372affb..b8ff733 100755 --- a/config/ctdb.init +++ b/config/ctdb.init @@ -111,21 +111,7 @@ build_ctdb_options () { # Log given message or stdin to either syslog or a CTDB log file do_log () { - if [ "$CTDB_SYSLOG" = "yes" -o \ - "${CTDB_OPTIONS#*--syslog}" != "$CTDB_OPTIONS" ] ; then - - logger -t "ctdb.init" "$@" - else - _l="${CTDB_LOGFILE:-/var/log/log.ctdb}" - { - date - if [ -n "$*" ] ; then - echo "$*" - else - cat - fi - } >>"$_l" - fi + script_log "ctdb.init" "$@" } select_tdb_checker () @@ -392,7 +378,7 @@ status() { } -[ -f "$CTDB_BASE/rc.ctdb" ] && "$CTDB_BASE/rc.ctdb" $1 +[ -x "$CTDB_BASE/rc.ctdb" ] && "$CTDB_BASE/rc.ctdb" $1 case "$1" in start) diff --git a/config/events.d/10.interface b/config/events.d/10.interface index a425e27..dd54f1e 100755 --- a/config/events.d/10.interface +++ b/config/events.d/10.interface @@ -49,39 +49,10 @@ get_all_interfaces () all_interfaces=$(echo $all_interfaces $ctdb_ifaces | tr ' ' '\n' | sort -u) } -delete_unexpected_ips () -{ - [ "$CTDB_DELETE_UNEXPECTED_IPS" = "yes" ] || return - - for _i in $all_interfaces ; do - # Get the IPs actually on this interface - _ips=$(ip addr show dev "$_i" | \ - sed -n -e 's@.*inet[[:space:]]*\([^[:space:]]*\).*scope global.*@\1@p') - for _ip in $_ips ; do - - # The NATGW address is OK - if [ "$CTDB_NATGW_PUBLIC_IP" = "$_ip" -a \ - "$CTDB_NATGW_PUBLIC_IFACE" = "$_i" ] ; then - continue - fi - - # If CTDB knows about the address then it is OK - if ctdb ipinfo "${_ip%/*}" >/dev/null 2>&1 ; then - continue - fi - - echo "WARNING: Removing unmanaged IP address $_ip from interface $_i" - delete_ip_from_iface "$_i" "${_ip%/*}" "${_ip#*/}" - done - done -} - monitor_interfaces() { get_all_interfaces - delete_unexpected_ips - fail=false up_interfaces_found=false diff --git a/config/events.d/11.natgw b/config/events.d/11.natgw index 3eb3dad..30b8c70 100755 --- a/config/events.d/11.natgw +++ b/config/events.d/11.natgw @@ -34,6 +34,26 @@ delete_all() { iptables -D INPUT -p tcp --syn -d $_ip/32 -j REJECT 2>/dev/null } +ensure_natgwmaster () +{ + _event="$1" + + set -- $(ctdb natgwlist) + natgwmaster="${1:--1}" # Default is -1 if natgwlist fails + natgwip="$2" + + if [ "$natgwmaster" = "-1" ]; then + echo "There is no NATGW master node" + # The recovered event should never fail - we'll catch this + # failure in the monitor event. + if [ "$_event" = "recovered" ] ; then + exit 0 + else + exit 1 + fi + fi +} + case "$1" in startup) # Error if CTDB_NATGW_PUBLIC_IP is listed in public addresses @@ -47,11 +67,7 @@ case "$1" in recovered|updatenatgw|ipreallocated) mypnn=$(ctdb pnn | cut -d: -f2) - set -- $(ctdb natgwlist) - natgwmaster="${1:--1}" # Default is -1 if natgwlist fails - natgwip="$2" - - [ "$natgwmaster" = "-1" ] && die "There is no NATGW master node" + ensure_natgwmaster "$1" delete_all @@ -83,6 +99,10 @@ case "$1" in delete_all ;; + monitor) + ensure_natgwmaster "$1" + ;; + *) ctdb_standard_event_handler "@" ;; diff --git a/config/functions b/config/functions index 5a86882..078b50b 100755 --- a/config/functions +++ b/config/functions @@ -95,10 +95,12 @@ die () exit $_rc } -# When things are run in the background in an eventscript then logging -# output might get lost. This is the "solution". :-) -background_with_logging () +# Log given message or stdin to either syslog or a CTDB log file +# $1 is the tag passed to logger if syslog is in use. +script_log () { + _tag="$1" ; shift + _using_syslog=false if [ "$CTDB_SYSLOG" = "yes" -o -z "$CTDB_LOGFILE" ] ; then _using_syslog=true @@ -107,13 +109,26 @@ background_with_logging () *--syslog*) _using_syslog=true ;; esac + if $_using_syslog ; then + logger -t "$_tag" + else + { + if [ -n "$*" ] ; then + echo "$*" + else + cat + fi + } >>"${CTDB_LOGFILE:-/var/log/log.ctdb}" + fi +} + +# When things are run in the background in an eventscript then logging +# output might get lost. This is the "solution". :-) +background_with_logging () +{ ( "$@" 2>&1 </dev/null | - if $_using_syslog ; then - logger -t "ctdbd: ${script_name}&" - else - cat >>"$CTDB_LOGFILE" - fi + script_log "ctdbd: ${script_name}&" )& return 0 diff --git a/config/gcore_trace.sh b/config/gcore_trace.sh new file mode 100755 index 0000000..4d3e1d1 --- /dev/null +++ b/config/gcore_trace.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +gcore -o "/var/log/core" "$1" 2>&1 | logger -t "ctdb:gcore_trace" diff --git a/include/ctdb_private.h b/include/ctdb_private.h index 94b45c0..6f6d898 100644 --- a/include/ctdb_private.h +++ b/include/ctdb_private.h @@ -666,6 +666,7 @@ struct ctdb_fetch_handle { /* internal prototypes */ void ctdb_set_error(struct ctdb_context *ctdb, const char *fmt, ...) PRINTF_ATTRIBUTE(2,3); void ctdb_fatal(struct ctdb_context *ctdb, const char *msg); +void ctdb_external_trace(void); bool ctdb_same_address(struct ctdb_address *a1, struct ctdb_address *a2); int ctdb_parse_address(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx, const char *str, diff --git a/packaging/RPM/ctdb.spec.in b/packaging/RPM/ctdb.spec.in index 6a6398b..48cd0ab 100644 --- a/packaging/RPM/ctdb.spec.in +++ b/packaging/RPM/ctdb.spec.in @@ -123,6 +123,7 @@ rm -rf $RPM_BUILD_ROOT %config(noreplace) %{_sysconfdir}/ctdb/notify.sh %config(noreplace) %{_sysconfdir}/ctdb/debug-hung-script.sh %config(noreplace) %{_sysconfdir}/ctdb/ctdb-crash-cleanup.sh +%config(noreplace) %{_sysconfdir}/ctdb/gcore_trace.sh %config(noreplace) %{_sysconfdir}/ctdb/functions %attr(755,root,root) %{initdir}/ctdb diff --git a/server/ctdb_logging.c b/server/ctdb_logging.c index 9455ff1..7cf8b9f 100644 --- a/server/ctdb_logging.c +++ b/server/ctdb_logging.c @@ -563,11 +563,11 @@ static void ctdb_tevent_logging(void *private_data, const char *fmt, va_list ap) { - enum debug_level lvl = DEBUG_EMERG; + enum debug_level lvl = DEBUG_CRIT; switch (level) { case TEVENT_DEBUG_FATAL: - lvl = DEBUG_EMERG; + lvl = DEBUG_CRIT; break; case TEVENT_DEBUG_ERROR: lvl = DEBUG_ERR; diff --git a/server/ctdb_recoverd.c b/server/ctdb_recoverd.c index 55d878b..82382d5 100644 --- a/server/ctdb_recoverd.c +++ b/server/ctdb_recoverd.c @@ -2778,7 +2778,6 @@ static int verify_local_ip_allocation(struct ctdb_context *ctdb, struct ctdb_rec { TALLOC_CTX *mem_ctx = talloc_new(NULL); struct ctdb_control_get_ifaces *ifaces = NULL; - struct ctdb_all_public_ips *ips = NULL; struct ctdb_uptime *uptime1 = NULL; struct ctdb_uptime *uptime2 = NULL; int ret, j; @@ -2820,14 +2819,6 @@ static int verify_local_ip_allocation(struct ctdb_context *ctdb, struct ctdb_rec need_takeover_run = true; } - /* read the ip allocation from the local node */ - ret = ctdb_ctrl_get_public_ips(ctdb, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE, mem_ctx, &ips); - if (ret != 0) { - DEBUG(DEBUG_ERR, ("Unable to get public ips from local node %u\n", pnn)); - talloc_free(mem_ctx); - return -1; - } - ret = ctdb_ctrl_uptime(ctdb, mem_ctx, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE, &uptime2); if (ret != 0) { @@ -2870,25 +2861,51 @@ static int verify_local_ip_allocation(struct ctdb_context *ctdb, struct ctdb_rec we also request a ip reallocation. */ if (ctdb->tunable.disable_ip_failover == 0) { + struct ctdb_all_public_ips *ips = NULL; + + /* read the *available* IPs from the local node */ + ret = ctdb_ctrl_get_public_ips_flags(ctdb, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE, mem_ctx, CTDB_PUBLIC_IP_FLAGS_ONLY_AVAILABLE, &ips); + if (ret != 0) { + DEBUG(DEBUG_ERR, ("Unable to get available public IPs from local node %u\n", pnn)); + talloc_free(mem_ctx); + return -1; + } + for (j=0; j<ips->num; j++) { - if (ips->ips[j].pnn == -1 && nodemap->nodes[pnn].flags == 0) { - DEBUG(DEBUG_CRIT,("Public address '%s' is not assigned and we could serve this ip\n", - ctdb_addr_to_str(&ips->ips[j].addr))); + if (ips->ips[j].pnn == -1 && + nodemap->nodes[pnn].flags == 0) { + DEBUG(DEBUG_CRIT,("Public IP '%s' is not assigned and we could serve it\n", + ctdb_addr_to_str(&ips->ips[j].addr))); need_takeover_run = true; - } else if (ips->ips[j].pnn == pnn) { + } + } + + talloc_free(ips); + + /* read the *known* IPs from the local node */ + ret = ctdb_ctrl_get_public_ips_flags(ctdb, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE, mem_ctx, 0, &ips); + if (ret != 0) { + DEBUG(DEBUG_ERR, ("Unable to get known public IPs from local node %u\n", pnn)); + talloc_free(mem_ctx); + return -1; + } + + for (j=0; j<ips->num; j++) { + if (ips->ips[j].pnn == pnn) { if (ctdb->do_checkpublicip && !ctdb_sys_have_ip(&ips->ips[j].addr)) { - DEBUG(DEBUG_CRIT,("Public address '%s' is missing and we should serve this ip\n", + DEBUG(DEBUG_CRIT,("Public IP '%s' is assigned to us but not on an interface\n", ctdb_addr_to_str(&ips->ips[j].addr))); need_takeover_run = true; } } else { - if (ctdb->do_checkpublicip && ctdb_sys_have_ip(&ips->ips[j].addr)) { + if (ctdb->do_checkpublicip && + ctdb_sys_have_ip(&ips->ips[j].addr)) { - DEBUG(DEBUG_CRIT,("We are still serving a public address '%s' that we should not be serving. Removing it.\n", + DEBUG(DEBUG_CRIT,("We are still serving a public IP '%s' that we should not be serving. Removing it\n", ctdb_addr_to_str(&ips->ips[j].addr))); if (ctdb_ctrl_release_ip(ctdb, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE, &ips->ips[j]) != 0) { - DEBUG(DEBUG_ERR,("Failed to release local ip address\n")); + DEBUG(DEBUG_ERR,("Failed to release local IP address\n")); } } } @@ -3329,12 +3346,12 @@ static void main_loop(struct ctdb_context *ctdb, struct ctdb_recoverd *rec, ret = ctdb_ctrl_freeze_priority(ctdb, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE, 1); if (ret != 0) { - DEBUG(DEBUG_ERR,(__location__ " Failed to freeze node due to node being STOPPED\n")); + DEBUG(DEBUG_ERR,(__location__ " Failed to freeze node in STOPPED state\n")); return; } ret = ctdb_ctrl_setrecmode(ctdb, CONTROL_TIMEOUT(), CTDB_CURRENT_NODE, CTDB_RECOVERY_ACTIVE); if (ret != 0) { - DEBUG(DEBUG_ERR,(__location__ " Failed to activate recovery mode due to node being stopped\n")); + DEBUG(DEBUG_ERR,(__location__ " Failed to activate recovery mode in STOPPED state\n")); return; } diff --git a/server/eventscript.c b/server/eventscript.c index 3b9ec93..6a75877 100644 --- a/server/eventscript.c +++ b/server/eventscript.c @@ -933,7 +933,7 @@ static void run_eventscripts_callback(struct ctdb_context *ctdb, int status, ctdb_enable_monitoring(ctdb); if (status != 0) { - DEBUG(DEBUG_ERR,(__location__ " Failed to forcibly run eventscripts\n")); + DEBUG(DEBUG_ERR,(__location__ " Failed to run eventscripts\n")); } ctdb_request_control_reply(ctdb, state->c, NULL, status, NULL); @@ -979,7 +979,7 @@ int32_t ctdb_run_eventscripts(struct ctdb_context *ctdb, /* Figure out what call they want. */ options = get_call((const char *)indata.dptr, &call); if (!options) { - DEBUG(DEBUG_ERR, (__location__ " Invalid forced \"%s\"\n", (const char *)indata.dptr)); + DEBUG(DEBUG_ERR, (__location__ " Invalid event name \"%s\"\n", (const char *)indata.dptr)); return -1; } diff --git a/tests/eventscripts/10.interface.monitor.015.sh b/tests/eventscripts/10.interface.monitor.015.sh deleted file mode 100755 index ff54b69..0000000 --- a/tests/eventscripts/10.interface.monitor.015.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/sh - -. "${TEST_SCRIPTS_DIR}/unit.sh" - -define_test "spurious addresses on interface, delete them" - -setup_ctdb - -iface=$(ctdb_get_1_interface) - -ip addr add 192.168.253.253/24 dev $iface -ip addr add 192.168.254.254/24 dev $iface - -export CTDB_DELETE_UNEXPECTED_IPS="yes" - -ok <<EOF -WARNING: Removing unmanaged IP address 192.168.253.253/24 from interface dev123 -Re-adding secondary address 192.168.254.254/24 to dev dev123 -WARNING: Removing unmanaged IP address 192.168.254.254/24 from interface dev123 -EOF - -simple_test diff --git a/tools/ctdb.c b/tools/ctdb.c index e75a922..9a12d1b 100644 --- a/tools/ctdb.c +++ b/tools/ctdb.c @@ -1106,10 +1106,6 @@ static int control_natgwlist(struct ctdb_context *ctdb, int argc, const char **a i++; } - if (options.machinereadable) { - printf(":Node:IP:\n"); - } - ret = 2; /* matches ENOENT */ pnn = -1; ip = "0.0.0.0"; diff --git a/tools/ctdb_diagnostics b/tools/ctdb_diagnostics index e2efb53..e37ed6b 100755 --- a/tools/ctdb_diagnostics +++ b/tools/ctdb_diagnostics @@ -227,6 +227,7 @@ EOF show_all "ctdb status; ctdb ip" show_all "ctdb statistics" show_all "ctdb uptime" +show_all "ctdb listvars" echo "Showing log.ctdb" show_all "test -f /var/log/log.ctdb && tail -100 /var/log/log.ctdb" -- CTDB repository