[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