summaryrefslogtreecommitdiff
path: root/ctdb
diff options
context:
space:
mode:
Diffstat (limited to 'ctdb')
-rw-r--r--ctdb/tests/src/ctdb_test_stubs.c9
-rwxr-xr-xctdb/tests/tool/stubby.natgwlist.008.sh37
-rw-r--r--ctdb/tools/ctdb.c13
3 files changed, 56 insertions, 3 deletions
diff --git a/ctdb/tests/src/ctdb_test_stubs.c b/ctdb/tests/src/ctdb_test_stubs.c
index 1edbe6aee77..6149b3d334a 100644
--- a/ctdb/tests/src/ctdb_test_stubs.c
+++ b/ctdb/tests/src/ctdb_test_stubs.c
@@ -550,6 +550,15 @@ int ctdb_ctrl_getcapabilities_stub(struct ctdb_context *ctdb,
struct timeval timeout, uint32_t destnode,
uint32_t *capabilities)
{
+ if (ctdb->nodes[destnode]->flags & NODE_FLAGS_DISCONNECTED) {
+ DEBUG(DEBUG_ERR,
+ ("ctdb_control error: 'ctdb_control to disconnected node\n"));
+ /* Placeholder for line#, instead of __location__ */
+ DEBUG(DEBUG_ERR,
+ ("__LOCATION__ ctdb_ctrl_getcapabilities_recv failed\n"));
+ return -1;
+ }
+
*capabilities = ctdb->nodes[destnode]->capabilities;
return 0;
}
diff --git a/ctdb/tests/tool/stubby.natgwlist.008.sh b/ctdb/tests/tool/stubby.natgwlist.008.sh
new file mode 100755
index 00000000000..e213400ff9a
--- /dev/null
+++ b/ctdb/tests/tool/stubby.natgwlist.008.sh
@@ -0,0 +1,37 @@
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "3 nodes, all in natgw group, 1 disconnected"
+
+setup_natgw <<EOF
+192.168.20.41
+192.168.20.42
+192.168.20.43
+EOF
+
+required_result 0 <<EOF
+1 192.168.20.42
+Number of nodes:3
+pnn:0 192.168.20.41 DISCONNECTED|INACTIVE
+pnn:1 192.168.20.42 OK (THIS NODE)
+pnn:2 192.168.20.43 OK
+EOF
+
+simple_test <<EOF
+NODEMAP
+0 192.168.20.41 0x1
+1 192.168.20.42 0x0 CURRENT RECMASTER
+2 192.168.20.43 0x0
+
+VNNMAP
+654321
+0
+1
+2
+
+IFACES
+:Name:LinkStatus:References:
+:eth2:1:2:
+:eth1:1:4:
+EOF
diff --git a/ctdb/tools/ctdb.c b/ctdb/tools/ctdb.c
index ad85f084f29..74cf321fa26 100644
--- a/ctdb/tools/ctdb.c
+++ b/ctdb/tools/ctdb.c
@@ -1191,9 +1191,16 @@ filter_nodemap_by_capabilities(struct ctdb_context *ctdb,
ret->num = 0;
for (i = 0; i < nodemap->num; i++) {
- int res = ctdb_ctrl_getcapabilities(ctdb, TIMELIMIT(),
- nodemap->nodes[i].pnn,
- &capabilities);
+ int res;
+
+ /* Disconnected nodes have no capabilities! */
+ if (nodemap->nodes[i].flags & NODE_FLAGS_DISCONNECTED) {
+ continue;
+ }
+
+ res = ctdb_ctrl_getcapabilities(ctdb, TIMELIMIT(),
+ nodemap->nodes[i].pnn,
+ &capabilities);
if (res != 0) {
DEBUG(DEBUG_ERR, ("Unable to get capabilities from node %u\n",
nodemap->nodes[i].pnn));