[SCM] Samba Shared Repository - branch master updated

Amitay Isaacs amitay at samba.org
Wed May 28 22:00:04 MDT 2014


The branch, master has been updated
       via  4dd3822 ctdb-tools-ctdb: Make natgwlist and lvsmaster more resilient
       via  f2ef23c ctdb-ib: Make infiniband transport compile again
       via  a27e59e ctdb-pmda: Do not hardcode include paths
      from  96c7e9b libcli/security: remove sec_ace_equal

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 4dd382296d3e78000713ab0ac1f8e531e25857cc
Author: Martin Schwenke <martin at meltin.net>
Date:   Fri May 23 21:58:55 2014 +1000

    ctdb-tools-ctdb: Make natgwlist and lvsmaster more resilient
    
    Recent changes have caused these commands to attempt to get
    capabilities from all nodes before doing further filtering.  This
    means that capabilities are unnecessarily fetched from nodes that are
    unlikely to be the master.  If such a node does not answer the control
    then many nodes can fail to calculate the master node.  In the case of
    natgwlist this will cause "monitor" events to fail resulting in
    unhealthy nodes.
    
    Restore the behaviour where capabilities are only fetched for a node
    that will be the master if it has the desired flags.
    
    Although this masks a problem where a connected node is not replying,
    it can help to avoid an outage in some cases.
    
    Add supporting tests and infrastructure.  Infrastructure just lets a
    timeout be faked - just for ctdb_ctrl_getcapabilities_stub() so far.
    First test checks that this infrastructure works if the first node
    times out in natgwlist.  Second test checks the case worked around by
    the above fix - that is, no failure when a node with PNN beyond the
    NATGW master can time out.
    
    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): Thu May 29 05:59:37 CEST 2014 on sn-devel-104

commit f2ef23cd5f227d2da2f032a2a56fbdd4d105b137
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Wed May 28 10:40:29 2014 +1000

    ctdb-ib: Make infiniband transport compile again
    
    Update included header files and fix compilation warnings.
    
      ib/ibwrapper.c: In function ‘ibw_stop’:
      ib/ibwrapper.c:1015:17: warning: comparison between ‘enum ibw_state_ctx’ and ‘enum ibw_state_conn’ [-Wenum-compare]
         if (ctx->state==IBWC_ERROR || ctx->state==IBWC_CONNECTED) {
                     ^
      ib/ibwrapper.c:1015:43: warning: comparison between ‘enum ibw_state_ctx’ and ‘enum ibw_state_conn’ [-Wenum-compare]
         if (ctx->state==IBWC_ERROR || ctx->state==IBWC_CONNECTED) {
    
    The current logic just seems wrong.  The context of this line and the
    error checking in ibw_disconnect() suggest that these comparisons
    should use p->state rather than ctx->state, so do that.
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

commit a27e59e8ecb622de826323c048107ab75acd0928
Author: Amitay Isaacs <amitay at gmail.com>
Date:   Wed May 28 08:09:02 2014 +1000

    ctdb-pmda: Do not hardcode include paths
    
    Signed-off-by: Amitay Isaacs <amitay at gmail.com>
    Reviewed-by: Martin Schwenke <martin at meltin.net>

-----------------------------------------------------------------------

Summary of changes:
 ctdb/Makefile.in                                   |   12 ++-
 ctdb/ib/config.m4                                  |    2 +-
 ctdb/ib/ibw_ctdb_init.c                            |    3 +-
 ctdb/ib/ibwrapper.c                                |    3 +-
 ctdb/ib/ibwrapper_test.c                           |    2 +-
 ctdb/tests/src/ctdb_test_stubs.c                   |   23 ++++++
 ctdb/tests/tool/stubby.natgwlist.009.sh            |   36 +++++++++
 ...by.natgwlist.001.sh => stubby.natgwlist.010.sh} |   14 ++--
 ctdb/tools/ctdb.c                                  |   80 ++++++++++++--------
 ctdb/utils/pmda/pmda_ctdb.c                        |    8 +-
 10 files changed, 129 insertions(+), 54 deletions(-)
 create mode 100755 ctdb/tests/tool/stubby.natgwlist.009.sh
 copy ctdb/tests/tool/{stubby.natgwlist.001.sh => stubby.natgwlist.010.sh} (81%)


Changeset truncated at 500 lines:

diff --git a/ctdb/Makefile.in b/ctdb/Makefile.in
index f3cd70c..0843a96 100755
--- a/ctdb/Makefile.in
+++ b/ctdb/Makefile.in
@@ -92,6 +92,8 @@ CTDB_COMMON_OBJ =  common/ctdb_io.o common/ctdb_util.o \
 
 CTDB_TCP_OBJ = tcp/tcp_connect.o tcp/tcp_io.o tcp/tcp_init.o
 
+CTDB_IB_OBJ = @INFINIBAND_WRAPPER_OBJ@
+
 CTDB_EXTERNAL_OBJ = $(POPT_OBJ) $(TALLOC_OBJ) $(TDB_OBJ) \
 	$(REPLACE_OBJ) $(EXTRA_OBJ) $(TEVENT_OBJ) $(SOCKET_WRAPPER_OBJ)
 
@@ -107,7 +109,7 @@ CTDB_SERVER_OBJ = server/ctdbd.o server/ctdb_daemon.o \
 	server/ctdb_keepalive.o server/ctdb_logging.o server/ctdb_uptime.o \
 	server/ctdb_vacuum.o server/ctdb_banning.o server/ctdb_statistics.o \
 	server/ctdb_update_record.o server/ctdb_lock.o \
-	$(CTDB_CLIENT_OBJ) $(CTDB_TCP_OBJ) @INFINIBAND_WRAPPER_OBJ@
+	$(CTDB_CLIENT_OBJ) $(CTDB_TCP_OBJ) $(CTDB_IB_OBJ)
 
 TEST_BINS=tests/bin/ctdb_bench tests/bin/ctdb_fetch tests/bin/ctdb_fetch_one \
 	tests/bin/ctdb_fetch_readonly_once tests/bin/ctdb_fetch_readonly_loop \
@@ -282,9 +284,9 @@ CTDB_TEST_OBJ =  $(TALLOC_OBJ) $(TDB_OBJ) \
 
 tests/src/ctdb_takeover_tests.o: tests/src/ctdb_takeover_tests.c $(CTDBD_TEST_C)
 
-tests/bin/ctdb_takeover_tests: $(CTDB_TEST_OBJ) tests/src/ctdb_takeover_tests.o
+tests/bin/ctdb_takeover_tests: $(CTDB_TEST_OBJ) tests/src/ctdb_takeover_tests.o $(CTDB_IB_OBJ)
 	@echo Linking $@
-	$(WRAPPER) $(CC) $(CFLAGS) -o $@ tests/src/ctdb_takeover_tests.o $(CTDB_TEST_OBJ) $(LIB_FLAGS)
+	$(WRAPPER) $(CC) $(CFLAGS) -o $@ tests/src/ctdb_takeover_tests.o $(CTDB_IB_OBJ) $(CTDB_TEST_OBJ) $(LIB_FLAGS)
 
 tests/src/ctdb_functest.o: tests/src/ctdb_functest.c tests/src/ctdb_test.c $(CTDB_TEST_C)
 
@@ -302,9 +304,9 @@ tests/bin/ctdb_lock_tdb: tests/src/ctdb_lock_tdb.o $(CTDB_CLIENT_OBJ)
 	@echo Linking $@
 	$(WRAPPER) $(CC) $(CFLAGS) -o $@ $^ $(LIB_FLAGS)
 
-tests/bin/ibwrapper_test: $(CTDB_CLIENT_OBJ) ib/ibwrapper_test.o
+tests/bin/ibwrapper_test: $(CTDB_CLIENT_OBJ) ib/ibwrapper_test.o $(CTDB_IB_OBJ)
 	@echo Linking $@
-	$(WRAPPER) $(CC) $(CFLAGS) -o $@ ib/ibwrapper_test.o $(CTDB_CLIENT_OBJ) $(LIB_FLAGS)
+	$(WRAPPER) $(CC) $(CFLAGS) -o $@ ib/ibwrapper_test.o $(CTDB_CLIENT_OBJ) $(CTDB_IB_OBJ) $(LIB_FLAGS)
 
 manpages:
 	$(MAKE) -C doc
diff --git a/ctdb/ib/config.m4 b/ctdb/ib/config.m4
index 47d6fac..6c626bd 100644
--- a/ctdb/ib/config.m4
+++ b/ctdb/ib/config.m4
@@ -1,4 +1,4 @@
-AC_ARG_ENABLE(--enable-infiniband, 
+AC_ARG_ENABLE(infiniband,
 [  --enable-infiniband         Turn on infiniband support (default=no)])
 
 HAVE_INFINIBAND=no
diff --git a/ctdb/ib/ibw_ctdb_init.c b/ctdb/ib/ibw_ctdb_init.c
index 066814d..63deff2 100644
--- a/ctdb/ib/ibw_ctdb_init.c
+++ b/ctdb/ib/ibw_ctdb_init.c
@@ -26,6 +26,7 @@
 #include "ctdb_private.h"
 #include "ibwrapper.h"
 #include "ibw_ctdb.h"
+#include "lib/util/dlinklist.h"
 
 static int ctdb_ibw_listen(struct ctdb_context *ctdb, int backlog)
 {
@@ -99,7 +100,7 @@ static int ctdb_ibw_initialise(struct ctdb_context *ctdb)
  */
 static int ctdb_ibw_start(struct ctdb_context *ctdb)
 {
-	int i, ret;
+	int i;
 
 	/* everything async here */
 	for (i=0;i<ctdb->num_nodes;i++) {
diff --git a/ctdb/ib/ibwrapper.c b/ctdb/ib/ibwrapper.c
index f6e7168..3daab3e 100644
--- a/ctdb/ib/ibwrapper.c
+++ b/ctdb/ib/ibwrapper.c
@@ -34,7 +34,6 @@
 #include <unistd.h>
 
 #include "includes.h"
-#include "lib/events/events.h"
 #include "ibwrapper.h"
 
 #include <infiniband/kern-abi.h>
@@ -1013,7 +1012,7 @@ int ibw_stop(struct ibw_ctx *ctx)
 	DEBUG(DEBUG_DEBUG, ("ibw_stop\n"));
 
 	for(p=ctx->conn_list; p!=NULL; p=p->next) {
-		if (ctx->state==IBWC_ERROR || ctx->state==IBWC_CONNECTED) {
+		if (p->state==IBWC_ERROR || p->state==IBWC_CONNECTED) {
 			if (ibw_disconnect(p))
 				return -1;
 		}
diff --git a/ctdb/ib/ibwrapper_test.c b/ctdb/ib/ibwrapper_test.c
index ba54286..48162c3 100644
--- a/ctdb/ib/ibwrapper_test.c
+++ b/ctdb/ib/ibwrapper_test.c
@@ -325,7 +325,7 @@ int ibwtest_receive_handler(struct ibw_conn *conn, void *buf, int n)
 				n - sizeof(uint32_t) - 2);
 			DEBUG(DEBUG_DEBUG, ("[%d]msg varsize %u/sum %u from %s\n",
 				op,
-				n - sizeof(uint32_t) - 2,
+				(uint32_t)(n - sizeof(uint32_t) - 2),
 				(uint32_t)sum,
 				tconn->id ? tconn->id : "NULL"));
 			if (sum!=((unsigned char *)buf)[n-1]) {
diff --git a/ctdb/tests/src/ctdb_test_stubs.c b/ctdb/tests/src/ctdb_test_stubs.c
index 6149b3d..d36fe81 100644
--- a/ctdb/tests/src/ctdb_test_stubs.c
+++ b/ctdb/tests/src/ctdb_test_stubs.c
@@ -30,6 +30,10 @@ static struct ctdb_context *ctdb_global;
  * -CTDB_CAP_RECMASTER.  LVS can be faked on by adding
  * CTDB_CAP_LVS.
  */
+
+/* A fake flag that is only supported by some functions */
+#define NODE_FLAGS_FAKE_TIMEOUT 0x80000000
+
 void ctdb_test_stubs_read_nodemap(struct ctdb_context *ctdb)
 {
 	char line[1024];
@@ -95,6 +99,12 @@ void ctdb_test_stubs_read_nodemap(struct ctdb_context *ctdb)
 				capabilities &= ~CTDB_CAP_NATGW;
 			} else if (strcmp(tok, "CTDB_CAP_LVS") == 0) {
 				capabilities |= CTDB_CAP_LVS;
+			} else if (strcmp(tok, "TIMEOUT") == 0) {
+				/* This can be done with just a flag
+				 * value but it is probably clearer
+				 * and less error-prone to fake this
+				 * with an explicit token */
+				flags |= NODE_FLAGS_FAKE_TIMEOUT;
 			}
 			tok = strtok(NULL, " \t");
 		}
@@ -550,6 +560,19 @@ 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_FAKE_TIMEOUT) {
+		/* Placeholder for line#, instead of __location__ */
+		DEBUG(DEBUG_ERR,
+		      ("__LOCATION__ control timed out."
+		       " reqid:1234567890 opcode:80 dstnode:%d\n", destnode));
+		DEBUG(DEBUG_ERR,
+		      ("__LOCATION__ ctdb_control_recv failed\n"));
+		DEBUG(DEBUG_ERR,
+		      ("__LOCATION__ ctdb_ctrl_getcapabilities_recv failed\n"));
+		return -1;
+	}
+
 	if (ctdb->nodes[destnode]->flags & NODE_FLAGS_DISCONNECTED) {
 		DEBUG(DEBUG_ERR,
 		      ("ctdb_control error: 'ctdb_control to disconnected node\n"));
diff --git a/ctdb/tests/tool/stubby.natgwlist.009.sh b/ctdb/tests/tool/stubby.natgwlist.009.sh
new file mode 100755
index 0000000..7534fd2
--- /dev/null
+++ b/ctdb/tests/tool/stubby.natgwlist.009.sh
@@ -0,0 +1,36 @@
+#!/bin/sh
+
+. "${TEST_SCRIPTS_DIR}/unit.sh"
+
+define_test "3 nodes, all in natgw group, 1 actual time-out"
+
+setup_natgw <<EOF
+192.168.20.41
+192.168.20.42
+192.168.20.43
+EOF
+
+required_result 255 <<EOF
+DATE TIME [PID]: __LOCATION__ control timed out. reqid:1234567890 opcode:80 dstnode:0
+DATE TIME [PID]: __LOCATION__ ctdb_control_recv failed
+DATE TIME [PID]: __LOCATION__ ctdb_ctrl_getcapabilities_recv failed
+DATE TIME [PID]: Unable to get capabilities from node 0
+EOF
+
+simple_test <<EOF
+NODEMAP
+0       192.168.20.41   0x0     TIMEOUT
+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/tests/tool/stubby.natgwlist.001.sh b/ctdb/tests/tool/stubby.natgwlist.010.sh
similarity index 81%
copy from ctdb/tests/tool/stubby.natgwlist.001.sh
copy to ctdb/tests/tool/stubby.natgwlist.010.sh
index f1d2d37..aaa3161 100755
--- a/ctdb/tests/tool/stubby.natgwlist.001.sh
+++ b/ctdb/tests/tool/stubby.natgwlist.010.sh
@@ -2,7 +2,7 @@
 
 . "${TEST_SCRIPTS_DIR}/unit.sh"
 
-define_test "3 nodes, all in natgw group, all ok"
+define_test "3 nodes, all in natgw group, 1 potential time-out"
 
 setup_natgw <<EOF
 192.168.20.41
@@ -22,16 +22,16 @@ simple_test <<EOF
 NODEMAP
 0       192.168.20.41   0x0     CURRENT RECMASTER
 1       192.168.20.42   0x0
-2       192.168.20.43   0x0
-
-IFACES
-:Name:LinkStatus:References:
-:eth2:1:2:
-:eth1:1:4:
+2       192.168.20.43   0x0     TIMEOUT
 
 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 8033fcb..4704726 100644
--- a/ctdb/tools/ctdb.c
+++ b/ctdb/tools/ctdb.c
@@ -1179,7 +1179,8 @@ filter_nodemap_by_addrs(struct ctdb_context *ctdb,
 static struct ctdb_node_map *
 filter_nodemap_by_capabilities(struct ctdb_context *ctdb,
 			       struct ctdb_node_map *nodemap,
-			       uint32_t required_capabilities)
+			       uint32_t required_capabilities,
+			       bool first_only)
 {
 	int i;
 	uint32_t capabilities;
@@ -1213,6 +1214,9 @@ filter_nodemap_by_capabilities(struct ctdb_context *ctdb,
 
 		ret->nodes[ret->num] = nodemap->nodes[i];
 		ret->num++;
+		if (first_only) {
+			break;
+		}
 	}
 
 	return ret;
@@ -1252,7 +1256,7 @@ static int control_natgwlist(struct ctdb_context *ctdb, int argc, const char **a
 	int i, ret;
 	struct pnn_node *natgw_nodes = NULL;
 	struct ctdb_node_map *orig_nodemap=NULL;
-	struct ctdb_node_map *cnodemap, *nodemap;
+	struct ctdb_node_map *nodemap;
 	uint32_t mypnn, pnn;
 	const char *ip;
 
@@ -1293,21 +1297,15 @@ static int control_natgwlist(struct ctdb_context *ctdb, int argc, const char **a
 		goto done;
 	}
 
-	/* Get a nodemap that includes only the nodes with the NATGW
-	 * capability */
-	cnodemap = filter_nodemap_by_capabilities(ctdb, nodemap,
-						  CTDB_CAP_NATGW);
-	if (cnodemap == NULL) {
-		ret = -1;
-		goto done;
-	}
-
 	ret = 2; /* matches ENOENT */
 	pnn = -1;
 	ip = "0.0.0.0";
+	/* For each flag mask... */
 	for (i = 0; exclude_flags[i] != 0; i++) {
+		/* ... get a nodemap that excludes nodes with with
+		 * masked flags... */
 		struct ctdb_node_map *t =
-			filter_nodemap_by_flags(ctdb, cnodemap,
+			filter_nodemap_by_flags(ctdb, nodemap,
 						exclude_flags[i]);
 		if (t == NULL) {
 			/* No memory */
@@ -1315,10 +1313,23 @@ static int control_natgwlist(struct ctdb_context *ctdb, int argc, const char **a
 			goto done;
 		}
 		if (t->num > 0) {
-			ret = 0;
-			pnn = t->nodes[0].pnn;
-			ip = ctdb_addr_to_str(&t->nodes[0].addr);
-			break;
+			/* ... and find the first node with the NATGW
+			 * capability */
+			struct ctdb_node_map *n;
+			n = filter_nodemap_by_capabilities(ctdb, t,
+							   CTDB_CAP_NATGW,
+							   true);
+			if (n == NULL) {
+				/* No memory */
+				ret = -1;
+				goto done;
+			}
+			if (n->num > 0) {
+				ret = 0;
+				pnn = n->nodes[0].pnn;
+				ip = ctdb_addr_to_str(&n->nodes[0].addr);
+				break;
+			}
 		}
 		talloc_free(t);
 	}
@@ -3569,7 +3580,7 @@ static int control_lvs(struct ctdb_context *ctdb, int argc, const char **argv)
 	}
 
 	nodemap = filter_nodemap_by_capabilities(ctdb, orig_nodemap,
-						 CTDB_CAP_LVS);
+						 CTDB_CAP_LVS, false);
 	if (nodemap == NULL) {
 		/* No memory */
 		ret = -1;
@@ -3609,26 +3620,17 @@ done:
 static int control_lvsmaster(struct ctdb_context *ctdb, int argc, const char **argv)
 {
 	TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
-	struct ctdb_node_map *orig_nodemap=NULL;
-	struct ctdb_node_map *nodemap;
+	struct ctdb_node_map *nodemap=NULL;
 	int i, ret;
 
 	ret = ctdb_ctrl_getnodemap(ctdb, TIMELIMIT(), options.pnn,
-				   tmp_ctx, &orig_nodemap);
+				   tmp_ctx, &nodemap);
 	if (ret != 0) {
 		DEBUG(DEBUG_ERR, ("Unable to get nodemap from node %u\n", options.pnn));
 		talloc_free(tmp_ctx);
 		return -1;
 	}
 
-	nodemap = filter_nodemap_by_capabilities(ctdb, orig_nodemap,
-						 CTDB_CAP_LVS);
-	if (nodemap == NULL) {
-		/* No memory */
-		ret = -1;
-		goto done;
-	}
-
 	for (i = 0; lvs_exclude_flags[i] != 0; i++) {
 		struct ctdb_node_map *t =
 			filter_nodemap_by_flags(ctdb, nodemap,
@@ -3639,11 +3641,23 @@ static int control_lvsmaster(struct ctdb_context *ctdb, int argc, const char **a
 			goto done;
 		}
 		if (t->num > 0) {
-			ret = 0;
-			printf(options.machinereadable ?
-			       "%d\n" : "Node %d is LVS master\n",
-				t->nodes[0].pnn);
-			goto done;
+			struct ctdb_node_map *n;
+			n = filter_nodemap_by_capabilities(ctdb,
+							   t,
+							   CTDB_CAP_LVS,
+							   true);
+			if (n == NULL) {
+				/* No memory */
+				ret = -1;
+				goto done;
+			}
+			if (n->num > 0) {
+				ret = 0;
+				printf(options.machinereadable ?
+				       "%d\n" : "Node %d is LVS master\n",
+				       n->nodes[0].pnn);
+				goto done;
+			}
 		}
 		talloc_free(t);
 	}
diff --git a/ctdb/utils/pmda/pmda_ctdb.c b/ctdb/utils/pmda/pmda_ctdb.c
index 6e034ba..a686389 100644
--- a/ctdb/utils/pmda/pmda_ctdb.c
+++ b/ctdb/utils/pmda/pmda_ctdb.c
@@ -22,10 +22,10 @@
 #include <pcp/pmapi.h>
 #include <pcp/impl.h>
 #include <pcp/pmda.h>
-#include "../../include/includes.h"
-#include "../../include/ctdb.h"
-#include "../../include/ctdb_private.h"
-#include "../../include/ctdb_protocol.h"
+#include "includes.h"
+#include "ctdb.h"
+#include "ctdb_private.h"
+#include "ctdb_protocol.h"
 #include "domain.h"
 
 /*


-- 
Samba Shared Repository


More information about the samba-cvs mailing list