[SCM] Samba Shared Repository - branch master updated
Amitay Isaacs
amitay at samba.org
Tue Jun 28 10:17:01 UTC 2022
The branch, master has been updated
via be293a125fc ctdb-tests: Add new tool unit tests to cover UNKNOWN state
via 794f1258029 ctdb-tool: Add UNKNOWN pseudo state
via 428bc71f98f ctdb-tests: Add runstate handling to fake ctdbd
via 05601cebc91 ctdb-tests: Return error on empty fake ctdbd configuration blocks
from fbf134c8d9e s3:libads: Check if we have a valid sockaddr
https://git.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit be293a125fc222867ca1c96e3898073e58f5fa0c
Author: Martin Schwenke <martin at meltin.net>
Date: Fri May 27 08:38:11 2022 +1000
ctdb-tests: Add new tool unit tests to cover UNKNOWN state
Signed-off-by: Vinit Agnihotri <vagnihotri at ddn.com>
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
Autobuild-User(master): Amitay Isaacs <amitay at samba.org>
Autobuild-Date(master): Tue Jun 28 10:16:59 UTC 2022 on sn-devel-184
commit 794f125802969a6b99f2758f70d7c2318309d924
Author: Vinit Agnihotri <vagnihotri at ddn.com>
Date: Tue Apr 26 17:20:21 2022 +1000
ctdb-tool: Add UNKNOWN pseudo state
When a node is starting, CTDB reports remote nodes as unhealthy by
default. This can be misleading.
To hide this, report an "UNKNOWN" pseudo state when a remote node is
not disconnected and the runstate is less than or equal to
"FIRST_RECOVERY".
Signed-off-by: Vinit Agnihotri <vagnihotri at ddn.com>
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 428bc71f98fd560e1d8ea17fd76b4a34ac9421c6
Author: Vinit Agnihotri <vagnihotri at ddn.com>
Date: Tue Apr 26 17:20:21 2022 +1000
ctdb-tests: Add runstate handling to fake ctdbd
Signed-off-by: Vinit Agnihotri <vagnihotri at ddn.com>
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 05601cebc91e21a65837fcd8fc4635660f7d6ca1
Author: Martin Schwenke <martin at meltin.net>
Date: Mon Jun 27 10:34:13 2022 +1000
ctdb-tests: Return error on empty fake ctdbd configuration blocks
These would be unintended errors. The block should be omitted to keep
the default value.
Signed-off-by: Martin Schwenke <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
-----------------------------------------------------------------------
Summary of changes:
ctdb/tests/UNIT/tool/ctdb.nodestatus.001.sh | 8 +--
ctdb/tests/UNIT/tool/ctdb.nodestatus.002.sh | 8 +--
ctdb/tests/UNIT/tool/ctdb.nodestatus.003.sh | 8 +--
ctdb/tests/UNIT/tool/ctdb.nodestatus.004.sh | 4 +-
ctdb/tests/UNIT/tool/ctdb.nodestatus.005.sh | 4 +-
ctdb/tests/UNIT/tool/ctdb.nodestatus.006.sh | 4 +-
ctdb/tests/UNIT/tool/ctdb.nodestatus.007.sh | 36 ++++++++++
ctdb/tests/UNIT/tool/ctdb.status.001.sh | 8 +--
ctdb/tests/UNIT/tool/ctdb.status.002.sh | 8 +--
.../{ctdb.status.002.sh => ctdb.status.003.sh} | 15 ++--
ctdb/tests/scripts/integration.bash | 16 ++---
ctdb/tests/src/fake_ctdbd.c | 70 ++++++++++++++++--
ctdb/tools/ctdb.c | 83 ++++++++++++++++++++--
ctdb/tools/ctdb_lvs | 8 +--
ctdb/tools/ctdb_natgw | 10 +--
15 files changed, 232 insertions(+), 58 deletions(-)
create mode 100755 ctdb/tests/UNIT/tool/ctdb.nodestatus.007.sh
copy ctdb/tests/UNIT/tool/{ctdb.status.002.sh => ctdb.status.003.sh} (65%)
Changeset truncated at 500 lines:
diff --git a/ctdb/tests/UNIT/tool/ctdb.nodestatus.001.sh b/ctdb/tests/UNIT/tool/ctdb.nodestatus.001.sh
index 2217afcc0b9..3c754e2a838 100755
--- a/ctdb/tests/UNIT/tool/ctdb.nodestatus.001.sh
+++ b/ctdb/tests/UNIT/tool/ctdb.nodestatus.001.sh
@@ -25,9 +25,9 @@ EOF
simple_test all
required_result 0 <<EOF
-|Node|IP|Disconnected|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
-|0|192.168.20.41|0|0|0|0|0|0|0|N|
-|1|192.168.20.42|0|0|0|0|0|0|0|N|
-|2|192.168.20.43|0|0|0|0|0|0|0|Y|
+|Node|IP|Disconnected|Unknown|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
+|0|192.168.20.41|0|0|0|0|0|0|0|0|N|
+|1|192.168.20.42|0|0|0|0|0|0|0|0|N|
+|2|192.168.20.43|0|0|0|0|0|0|0|0|Y|
EOF
simple_test -X all
diff --git a/ctdb/tests/UNIT/tool/ctdb.nodestatus.002.sh b/ctdb/tests/UNIT/tool/ctdb.nodestatus.002.sh
index c1706fd98e7..a5981dffa52 100755
--- a/ctdb/tests/UNIT/tool/ctdb.nodestatus.002.sh
+++ b/ctdb/tests/UNIT/tool/ctdb.nodestatus.002.sh
@@ -25,9 +25,9 @@ EOF
simple_test all
required_result 1 <<EOF
-|Node|IP|Disconnected|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
-|0|192.168.20.41|0|0|0|0|0|0|0|N|
-|1|192.168.20.42|1|0|0|0|0|1|0|N|
-|2|192.168.20.43|0|0|0|0|0|0|0|Y|
+|Node|IP|Disconnected|Unknown|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
+|0|192.168.20.41|0|0|0|0|0|0|0|0|N|
+|1|192.168.20.42|1|0|0|0|0|0|1|0|N|
+|2|192.168.20.43|0|0|0|0|0|0|0|0|Y|
EOF
simple_test -X all
diff --git a/ctdb/tests/UNIT/tool/ctdb.nodestatus.003.sh b/ctdb/tests/UNIT/tool/ctdb.nodestatus.003.sh
index 5912e6501aa..52c2691876f 100755
--- a/ctdb/tests/UNIT/tool/ctdb.nodestatus.003.sh
+++ b/ctdb/tests/UNIT/tool/ctdb.nodestatus.003.sh
@@ -25,9 +25,9 @@ EOF
simple_test all
required_result 2 <<EOF
-|Node|IP|Disconnected|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
-|0|192.168.20.41|0|0|0|1|0|0|0|N|
-|1|192.168.20.42|0|0|0|0|0|0|0|N|
-|2|192.168.20.43|0|0|0|0|0|0|0|Y|
+|Node|IP|Disconnected|Unknown|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
+|0|192.168.20.41|0|0|0|0|1|0|0|0|N|
+|1|192.168.20.42|0|0|0|0|0|0|0|0|N|
+|2|192.168.20.43|0|0|0|0|0|0|0|0|Y|
EOF
simple_test -X all
diff --git a/ctdb/tests/UNIT/tool/ctdb.nodestatus.004.sh b/ctdb/tests/UNIT/tool/ctdb.nodestatus.004.sh
index 01ccd5129b4..c060fb98b90 100755
--- a/ctdb/tests/UNIT/tool/ctdb.nodestatus.004.sh
+++ b/ctdb/tests/UNIT/tool/ctdb.nodestatus.004.sh
@@ -22,7 +22,7 @@ EOF
simple_test
required_result 0 <<EOF
-|Node|IP|Disconnected|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
-|2|192.168.20.43|0|0|0|0|0|0|0|Y|
+|Node|IP|Disconnected|Unknown|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
+|2|192.168.20.43|0|0|0|0|0|0|0|0|Y|
EOF
simple_test -X
diff --git a/ctdb/tests/UNIT/tool/ctdb.nodestatus.005.sh b/ctdb/tests/UNIT/tool/ctdb.nodestatus.005.sh
index 0cd24ba9cab..59f6905b059 100755
--- a/ctdb/tests/UNIT/tool/ctdb.nodestatus.005.sh
+++ b/ctdb/tests/UNIT/tool/ctdb.nodestatus.005.sh
@@ -22,7 +22,7 @@ EOF
simple_test 0
required_result 2 <<EOF
-|Node|IP|Disconnected|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
-|0|192.168.20.41|0|0|0|1|0|0|0|N|
+|Node|IP|Disconnected|Unknown|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
+|0|192.168.20.41|0|0|0|0|1|0|0|0|N|
EOF
simple_test -X 0
diff --git a/ctdb/tests/UNIT/tool/ctdb.nodestatus.006.sh b/ctdb/tests/UNIT/tool/ctdb.nodestatus.006.sh
index ec189fc4690..7d744510d53 100755
--- a/ctdb/tests/UNIT/tool/ctdb.nodestatus.006.sh
+++ b/ctdb/tests/UNIT/tool/ctdb.nodestatus.006.sh
@@ -22,8 +22,8 @@ EOF
simple_test 0
required_result 36 <<EOF
-|Node|IP|Disconnected|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
-|0|192.168.20.41|0|0|1|0|1|1|0|N|
+|Node|IP|Disconnected|Unknown|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
+|0|192.168.20.41|0|0|0|1|0|1|1|0|N|
EOF
simple_test -X 0
diff --git a/ctdb/tests/UNIT/tool/ctdb.nodestatus.007.sh b/ctdb/tests/UNIT/tool/ctdb.nodestatus.007.sh
new file mode 100755
index 00000000000..c96df4d9616
--- /dev/null
+++ b/ctdb/tests/UNIT/tool/ctdb.nodestatus.007.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "all, 3 nodes, 1 unhealthy, runstate init"
+
+setup_ctdbd <<EOF
+NODEMAP
+0 192.168.20.41 0x2
+1 192.168.20.42 0x0
+2 192.168.20.43 0x0 CURRENT RECMASTER
+
+IFACES
+:Name:LinkStatus:References:
+:eth2:1:2:
+:eth1:1:4:
+
+RUNSTATE
+INIT
+EOF
+
+required_result 64 <<EOF
+Number of nodes:3
+pnn:0 192.168.20.41 UNKNOWN
+pnn:1 192.168.20.42 UNKNOWN
+pnn:2 192.168.20.43 OK (THIS NODE)
+EOF
+simple_test all
+
+required_result 64 <<EOF
+|Node|IP|Disconnected|Unknown|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
+|0|192.168.20.41|0|1|0|0|0|0|0|0|N|
+|1|192.168.20.42|0|1|0|0|0|0|0|0|N|
+|2|192.168.20.43|0|0|0|0|0|0|0|0|Y|
+EOF
+simple_test -X all
diff --git a/ctdb/tests/UNIT/tool/ctdb.status.001.sh b/ctdb/tests/UNIT/tool/ctdb.status.001.sh
index 0742bd870a2..62c1dc7c98a 100755
--- a/ctdb/tests/UNIT/tool/ctdb.status.001.sh
+++ b/ctdb/tests/UNIT/tool/ctdb.status.001.sh
@@ -38,9 +38,9 @@ EOF
simple_test
required_result 0 <<EOF
-|Node|IP|Disconnected|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
-|0|192.168.20.41|0|0|0|0|0|0|0|Y|
-|1|192.168.20.42|0|0|0|0|0|0|0|N|
-|2|192.168.20.43|0|0|0|0|0|0|0|N|
+|Node|IP|Disconnected|Unknown|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
+|0|192.168.20.41|0|0|0|0|0|0|0|0|Y|
+|1|192.168.20.42|0|0|0|0|0|0|0|0|N|
+|2|192.168.20.43|0|0|0|0|0|0|0|0|N|
EOF
simple_test -X
diff --git a/ctdb/tests/UNIT/tool/ctdb.status.002.sh b/ctdb/tests/UNIT/tool/ctdb.status.002.sh
index 259e91438db..0cce4435ee4 100755
--- a/ctdb/tests/UNIT/tool/ctdb.status.002.sh
+++ b/ctdb/tests/UNIT/tool/ctdb.status.002.sh
@@ -38,9 +38,9 @@ EOF
simple_test
required_result 0 <<EOF
-|Node|IP|Disconnected|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
-|0|192.168.20.41|0|0|0|1|0|0|0|N|
-|1|192.168.20.42|0|0|0|0|0|0|0|Y|
-|2|192.168.20.43|0|0|0|0|0|0|0|N|
+|Node|IP|Disconnected|Unknown|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
+|0|192.168.20.41|0|0|0|0|1|0|0|0|N|
+|1|192.168.20.42|0|0|0|0|0|0|0|0|Y|
+|2|192.168.20.43|0|0|0|0|0|0|0|0|N|
EOF
simple_test -X
diff --git a/ctdb/tests/UNIT/tool/ctdb.status.002.sh b/ctdb/tests/UNIT/tool/ctdb.status.003.sh
similarity index 65%
copy from ctdb/tests/UNIT/tool/ctdb.status.002.sh
copy to ctdb/tests/UNIT/tool/ctdb.status.003.sh
index 259e91438db..67a2966ea4d 100755
--- a/ctdb/tests/UNIT/tool/ctdb.status.002.sh
+++ b/ctdb/tests/UNIT/tool/ctdb.status.003.sh
@@ -20,13 +20,16 @@ IFACES
:Name:LinkStatus:References:
:eth2:1:2:
:eth1:1:4:
+
+RUNSTATE
+FIRST_RECOVERY
EOF
required_result 0 <<EOF
Number of nodes:3
-pnn:0 192.168.20.41 UNHEALTHY
+pnn:0 192.168.20.41 UNKNOWN
pnn:1 192.168.20.42 OK (THIS NODE)
-pnn:2 192.168.20.43 OK
+pnn:2 192.168.20.43 UNKNOWN
Generation:654321
Size:3
hash:0 lmaster:0
@@ -38,9 +41,9 @@ EOF
simple_test
required_result 0 <<EOF
-|Node|IP|Disconnected|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
-|0|192.168.20.41|0|0|0|1|0|0|0|N|
-|1|192.168.20.42|0|0|0|0|0|0|0|Y|
-|2|192.168.20.43|0|0|0|0|0|0|0|N|
+|Node|IP|Disconnected|Unknown|Banned|Disabled|Unhealthy|Stopped|Inactive|PartiallyOnline|ThisNode|
+|0|192.168.20.41|0|1|0|0|0|0|0|0|N|
+|1|192.168.20.42|0|0|0|0|0|0|0|0|Y|
+|2|192.168.20.43|0|1|0|0|0|0|0|0|N|
EOF
simple_test -X
diff --git a/ctdb/tests/scripts/integration.bash b/ctdb/tests/scripts/integration.bash
index eb3db1e1849..dbf9af0b346 100644
--- a/ctdb/tests/scripts/integration.bash
+++ b/ctdb/tests/scripts/integration.bash
@@ -446,16 +446,16 @@ node_has_status ()
local bits
case "$status" in
- unhealthy) bits="?|?|?|1|*" ;;
- healthy) bits="?|?|?|0|*" ;;
+ unhealthy) bits="?|?|?|?|1|*" ;;
+ healthy) bits="?|?|?|?|0|*" ;;
disconnected) bits="1|*" ;;
connected) bits="0|*" ;;
- banned) bits="?|1|*" ;;
- unbanned) bits="?|0|*" ;;
- disabled) bits="?|?|1|*" ;;
- enabled) bits="?|?|0|*" ;;
- stopped) bits="?|?|?|?|1|*" ;;
- notstopped) bits="?|?|?|?|0|*" ;;
+ banned) bits="?|?|1|*" ;;
+ unbanned) bits="?|?|0|*" ;;
+ disabled) bits="?|?|?|1|*" ;;
+ enabled) bits="?|?|?|0|*" ;;
+ stopped) bits="?|?|?|?|?|1|*" ;;
+ notstopped) bits="?|?|?|?|?|0|*" ;;
*)
echo "node_has_status: unknown status \"$status\""
return 1
diff --git a/ctdb/tests/src/fake_ctdbd.c b/ctdb/tests/src/fake_ctdbd.c
index 4d5c41f3fd2..a04ad853306 100644
--- a/ctdb/tests/src/fake_ctdbd.c
+++ b/ctdb/tests/src/fake_ctdbd.c
@@ -272,6 +272,10 @@ static bool nodemap_parse(struct node_map *node_map)
node_map->num_nodes += 1;
}
+ if (node_map->num_nodes == 0) {
+ goto fail;
+ }
+
DEBUG(DEBUG_INFO, ("Parsing nodemap done\n"));
return true;
@@ -521,6 +525,10 @@ static bool interfaces_parse(struct interface_map *iface_map)
iface_map->num += 1;
}
+ if (iface_map->num == 0) {
+ goto fail;
+ }
+
DEBUG(DEBUG_INFO, ("Parsing interfaces done\n"));
return true;
@@ -588,6 +596,10 @@ static bool vnnmap_parse(struct vnn_map *vnn_map)
vnn_map->size += 1;
}
+ if (vnn_map->size == 0) {
+ goto fail;
+ }
+
DEBUG(DEBUG_INFO, ("Parsing vnnmap done\n"));
return true;
@@ -606,8 +618,7 @@ static bool reclock_parse(struct ctdbd_context *ctdb)
}
if (line[0] == '\n') {
- /* Recovery lock remains unset */
- goto ok;
+ goto fail;
}
/* Get rid of pesky newline */
@@ -619,7 +630,7 @@ static bool reclock_parse(struct ctdbd_context *ctdb)
if (ctdb->reclock == NULL) {
goto fail;
}
-ok:
+
/* Swallow possible blank line following section. Picky
* compiler settings don't allow the return value to be
* ignored, so make the compiler happy.
@@ -745,6 +756,10 @@ static bool dbmap_parse(struct database_map *db_map)
DLIST_ADD_END(db_map->db, db);
}
+ if (db_map->db == NULL) {
+ goto fail;
+ }
+
DEBUG(DEBUG_INFO, ("Parsing dbmap done\n"));
return true;
@@ -1046,7 +1061,7 @@ static bool public_ips_parse(struct ctdbd_context *ctdb,
ctdb->known_ips = ipalloc_read_known_ips(ctdb, numnodes, false);
- status = (ctdb->known_ips != NULL);
+ status = (ctdb->known_ips != NULL && ctdb->known_ips->num != 0);
if (status) {
D_INFO("Parsing public IPs done\n");
@@ -1139,6 +1154,10 @@ static bool control_failures_parse(struct ctdbd_context *ctdb)
DLIST_ADD(ctdb->control_failures, failure);
}
+ if (ctdb->control_failures == NULL) {
+ goto fail;
+ }
+
D_INFO("Parsing fake control failures done\n");
return true;
@@ -1147,6 +1166,44 @@ fail:
return false;
}
+static bool runstate_parse(struct ctdbd_context *ctdb)
+{
+ char line[1024];
+ char *t;
+
+ if (fgets(line, sizeof(line), stdin) == NULL) {
+ goto fail;
+ }
+
+ if (line[0] == '\n') {
+ goto fail;
+ }
+
+ /* Get rid of pesky newline */
+ if ((t = strchr(line, '\n')) != NULL) {
+ *t = '\0';
+ }
+
+ ctdb->runstate = ctdb_runstate_from_string(line);
+ if (ctdb->runstate == CTDB_RUNSTATE_UNKNOWN) {
+ goto fail;
+ }
+
+ /* Swallow possible blank line following section. Picky
+ * compiler settings don't allow the return value to be
+ * ignored, so make the compiler happy.
+ */
+ if (fgets(line, sizeof(line), stdin) == NULL) {
+ ;
+ }
+ D_INFO("Parsing runstate done\n");
+ return true;
+
+fail:
+ D_ERR("Parsing runstate failed\n");
+ return false;
+}
+
/*
* Manage clients
*/
@@ -1246,6 +1303,8 @@ static struct ctdbd_context *ctdbd_setup(TALLOC_CTX *mem_ctx,
goto fail;
}
+ ctdb->runstate = CTDB_RUNSTATE_RUNNING;
+
while (fgets(line, sizeof(line), stdin) != NULL) {
char *t;
@@ -1268,6 +1327,8 @@ static struct ctdbd_context *ctdbd_setup(TALLOC_CTX *mem_ctx,
status = reclock_parse(ctdb);
} else if (strcmp(line, "CONTROLFAILS") == 0) {
status = control_failures_parse(ctdb);
+ } else if (strcmp(line, "RUNSTATE") == 0) {
+ status = runstate_parse(ctdb);
} else {
fprintf(stderr, "Unknown line %s\n", line);
status = false;
@@ -1288,7 +1349,6 @@ static struct ctdbd_context *ctdbd_setup(TALLOC_CTX *mem_ctx,
ctdb->recovery_end_time = tevent_timeval_current();
ctdb->log_level = DEBUG_ERR;
- ctdb->runstate = CTDB_RUNSTATE_RUNNING;
ctdb_tunable_set_defaults(&ctdb->tun_list);
diff --git a/ctdb/tools/ctdb.c b/ctdb/tools/ctdb.c
index b5303289f38..dd2245ecfa6 100644
--- a/ctdb/tools/ctdb.c
+++ b/ctdb/tools/ctdb.c
@@ -52,6 +52,8 @@
#define SRVID_CTDB_TOOL (CTDB_SRVID_TOOL_RANGE | 0x0001000000000000LL)
#define SRVID_CTDB_PUSHDB (CTDB_SRVID_TOOL_RANGE | 0x0002000000000000LL)
+#define NODE_FLAGS_UNKNOWN 0x00000040
+
static struct {
const char *debuglevelstr;
int timelimit;
@@ -111,6 +113,7 @@ static const char *pretty_print_flags(TALLOC_CTX *mem_ctx, uint32_t flags)
const char *name;
} flag_names[] = {
{ NODE_FLAGS_DISCONNECTED, "DISCONNECTED" },
+ { NODE_FLAGS_UNKNOWN, "UNKNOWN" },
{ NODE_FLAGS_PERMANENTLY_DISABLED, "DISABLED" },
{ NODE_FLAGS_BANNED, "BANNED" },
{ NODE_FLAGS_UNHEALTHY, "UNHEALTHY" },
@@ -367,6 +370,64 @@ done:
return true;
}
+/*
+ * Remote nodes are initialised as UNHEALTHY in the daemon and their
+ * true status is udpated after they are connected. However, there
+ * is a small window when a healthy node may be shown as unhealthy
+ * between connecting and the status update. Hide this for nodes
+ * that are not DISCONNECTED nodes by reporting them as UNKNOWN until
+ * the runstate passes FIRST_RECOVERY. Code paths where this is used
+ * do not make any control decisions depending upon unknown/unhealthy
+ * state.
+ */
+static struct ctdb_node_map *get_nodemap_unknown(
+ TALLOC_CTX *mem_ctx,
+ struct ctdb_context *ctdb,
+ struct ctdb_node_map *nodemap_in)
+{
+ unsigned int i;
+ int ret;
+ enum ctdb_runstate runstate;
+ struct ctdb_node_map *nodemap;
+
+ ret = ctdb_ctrl_get_runstate(mem_ctx,
+ ctdb->ev,
+ ctdb->client,
+ ctdb->cmd_pnn,
+ TIMEOUT(),
+ &runstate);
+ if (ret != 0 ) {
+ printf("Unable to get runstate");
+ return NULL;
+ }
+
+ nodemap = talloc_nodemap(mem_ctx, nodemap_in);
+ if (nodemap == NULL) {
+ printf("Unable to get nodemap");
+ return NULL;
+ }
+
+ nodemap->num = nodemap_in->num;
+ for (i=0; i<nodemap->num; i++) {
+ struct ctdb_node_and_flags *node_in = &nodemap_in->node[i];
+ struct ctdb_node_and_flags *node = &nodemap->node[i];
+
+ *node = *node_in;
+
+ if (node->flags & NODE_FLAGS_DELETED) {
+ continue;
+ }
+
+ if ((runstate <= CTDB_RUNSTATE_FIRST_RECOVERY) &&
+ !(node->flags & NODE_FLAGS_DISCONNECTED) &&
+ (node->pnn != ctdb->cmd_pnn)) {
+ node->flags = NODE_FLAGS_UNKNOWN;
+ }
+ }
+
+ return nodemap;
+}
+
/* Compare IP address */
static bool ctdb_same_ip(ctdb_sock_addr *ip1, ctdb_sock_addr *ip2)
{
@@ -826,11 +887,12 @@ static void print_nodemap_machine(TALLOC_CTX *mem_ctx,
struct ctdb_node_and_flags *node;
unsigned int i;
- printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
+ printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
options.sep,
"Node", options.sep,
"IP", options.sep,
"Disconnected", options.sep,
+ "Unknown", options.sep,
"Banned", options.sep,
--
Samba Shared Repository
More information about the samba-cvs
mailing list