[SCM] Samba Shared Repository - branch master updated

[email protected] (Amitay Isaacs)
Newsgroups gmane.network.samba.cvs
Message-ID <[email protected]>
The branch, master has been updated
       via  7275e0c ctdb-tests: Use a separate directory for each local daemon
       via  429377a ctdb-ipalloc: Optimise check to see if IP is available on a node
       via  24db438 ctdb-daemon: Exit early if there are trailing command-line arguments
       via  df2d651 ctdb-daemon: Don't call ctdb_local_node_got_banned() on flag changes
      from  943c6ee s3-libads: Fix canonicalization support with MIT Kerberos

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


- Log -----------------------------------------------------------------
commit 7275e0ceff8e1d85aed22b69b31b5269e1ec5d03
Author: Martin Schwenke <[email protected]>
Date:   Thu Nov 24 16:37:26 2016 +1100

    ctdb-tests: Use a separate directory for each local daemon
    
    Separate directory contains configuration file, PID file, public
    addresses file, socket, databases and log file.
    
    Signed-off-by: Martin Schwenke <[email protected]>
    Reviewed-by: Amitay Isaacs <[email protected]>
    
    Autobuild-User(master): Amitay Isaacs <[email protected]>
    Autobuild-Date(master): Fri Dec  2 04:19:18 CET 2016 on sn-devel-144

commit 429377a2426fdfc8c3f7d8854fa2189ad36ff78c
Author: Martin Schwenke <[email protected]>
Date:   Fri Nov 18 16:08:13 2016 +1100

    ctdb-ipalloc: Optimise check to see if IP is available on a node
    
    Use a "bitmap" of available IPs for each IP address instead of walking
    the list of available IP addresses.
    
    For ctdb/tests/takeover/lcp2.030.sh, this improves the time taken on
    my laptop from:
    
      real	0m11.997s
      user	0m11.960s
      sys	0m0.000s
    
    to
    
      real	0m8.571s
      user	0m8.544s
      sys	0m0.000s
    
    So, when assigning all 900 IP addresses the improvement is about 25%.
    
    For the no-op case (where all IPs are already assigned to nodes), the
    extra setup adds a small fraction of a second for 900 IPs.
    Intermediate cases result in intermediate improvements.
    
    Signed-off-by: Martin Schwenke <[email protected]>
    Reviewed-by: Amitay Isaacs <[email protected]>

commit 24db43839f8a17c4498454d4bbd24411f647defa
Author: Martin Schwenke <[email protected]>
Date:   Mon Nov 28 09:51:48 2016 +1100

    ctdb-daemon: Exit early if there are trailing command-line arguments
    
    Signed-off-by: Martin Schwenke <[email protected]>
    Reviewed-by: Amitay Isaacs <[email protected]>

commit df2d6518e7cb715e6eadb712f1ee79759254b27f
Author: Martin Schwenke <[email protected]>
Date:   Tue Nov 8 16:37:24 2016 +1100

    ctdb-daemon: Don't call ctdb_local_node_got_banned() on flag changes
    
    This function is currently called twice each time a node is banned.
    
    ctdb_local_node_got_banned() is already called from the banning code,
    either due to a received banning control or a node banning itself.
    Given that other nodes can't set a node's BANNED flag, a node can only
    be banned via the above mechanisms, so drop the redundant call.
    
    Signed-off-by: Martin Schwenke <[email protected]>
    Reviewed-by: Amitay Isaacs <[email protected]>

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

Summary of changes:
 ctdb/server/ctdb_monitor.c                   |  5 --
 ctdb/server/ctdbd.c                          |  8 +--
 ctdb/server/ipalloc.c                        | 37 +++++++++++++
 ctdb/server/ipalloc.h                        |  1 +
 ctdb/server/ipalloc_common.c                 | 17 +-----
 ctdb/tests/simple/scripts/local_daemons.bash | 77 +++++++++++++++++++++-------
 6 files changed, 102 insertions(+), 43 deletions(-)


Changeset truncated at 500 lines:

diff --git a/ctdb/server/ctdb_monitor.c b/ctdb/server/ctdb_monitor.c
index 00f6524..f0a427b 100644
--- a/ctdb/server/ctdb_monitor.c
+++ b/ctdb/server/ctdb_monitor.c
@@ -529,11 +529,6 @@ int32_t ctdb_control_modflags(struct ctdb_context *ctdb, TDB_DATA indata)
 	ctdb_daemon_send_message(ctdb, ctdb->pnn,
 				 CTDB_SRVID_SET_NODE_FLAGS, indata);
 
-	/* if we have become banned, we should go into recovery mode */
-	if ((node->flags & NODE_FLAGS_BANNED) && !(c->old_flags & NODE_FLAGS_BANNED) && (node->pnn == ctdb->pnn)) {
-		ctdb_local_node_got_banned(ctdb);
-	}
-	
 	return 0;
 }
 
diff --git a/ctdb/server/ctdbd.c b/ctdb/server/ctdbd.c
index 99bb715..b0cbc8c 100644
--- a/ctdb/server/ctdbd.c
+++ b/ctdb/server/ctdbd.c
@@ -152,7 +152,6 @@ int main(int argc, const char *argv[])
 	};
 	int opt, ret;
 	const char **extra_argv;
-	int extra_argc = 0;
 	poptContext pc;
 	struct tevent_context *ev;
 	enum debug_level log_level;
@@ -168,11 +167,14 @@ int main(int argc, const char *argv[])
 		}
 	}
 
-	/* setup the remaining options for the main program to use */
+	/* If there are extra arguments then exit with usage message */
 	extra_argv = poptGetArgs(pc);
 	if (extra_argv) {
 		extra_argv++;
-		while (extra_argv[extra_argc]) extra_argc++;
+		if (extra_argv[0])  {
+			poptPrintHelp(pc, stdout, 0);
+			exit(1);
+		}
 	}
 
 	talloc_enable_null_tracking();
diff --git a/ctdb/server/ipalloc.c b/ctdb/server/ipalloc.c
index 37804ea..819add1 100644
--- a/ctdb/server/ipalloc.c
+++ b/ctdb/server/ipalloc.c
@@ -29,6 +29,8 @@
 #include "common/logging.h"
 #include "common/rb_tree.h"
 
+#include "protocol/protocol_api.h"
+
 #include "server/ipalloc_private.h"
 
 /* Initialise main ipalloc state and sub-structures */
@@ -160,6 +162,37 @@ create_merged_ip_list(struct ipalloc_state *ipalloc_state)
 	return ip_list;
 }
 
+static bool populate_bitmap(struct ipalloc_state *ipalloc_state)
+{
+	struct public_ip_list *ip = NULL;
+	int i, j;
+
+	for (ip = ipalloc_state->all_ips; ip != NULL; ip = ip->next) {
+
+		ip->available_on = talloc_zero_array(ip, bool,
+						     ipalloc_state->num);
+		if (ip->available_on == NULL) {
+			return false;
+		}
+
+		for (i = 0; i < ipalloc_state->num; i++) {
+			struct ctdb_public_ip_list *avail =
+				&ipalloc_state->available_public_ips[i];
+
+			/* Check to see if "ip" is available on node "i" */
+			for (j = 0; j < avail->num; j++) {
+				if (ctdb_sock_addr_same_ip(
+					    &ip->addr, &avail->ip[j].addr)) {
+					ip->available_on[i] = true;
+					break;
+				}
+			}
+		}
+	}
+
+	return true;
+}
+
 static bool all_nodes_are_disabled(struct ctdb_node_map *nodemap)
 {
 	int i;
@@ -283,6 +316,10 @@ struct public_ip_list *ipalloc(struct ipalloc_state *ipalloc_state)
 		return NULL;
 	}
 
+	if (!populate_bitmap(ipalloc_state)) {
+		return NULL;
+	}
+
 	switch (ipalloc_state->algorithm) {
 	case IPALLOC_LCP2:
 		ret = ipalloc_lcp2(ipalloc_state);
diff --git a/ctdb/server/ipalloc.h b/ctdb/server/ipalloc.h
index d116426..4413b2a 100644
--- a/ctdb/server/ipalloc.h
+++ b/ctdb/server/ipalloc.h
@@ -31,6 +31,7 @@ struct public_ip_list {
 	struct public_ip_list *next;
 	uint32_t pnn;
 	ctdb_sock_addr addr;
+	bool *available_on;
 };
 
 #define IP_KEYLEN	4
diff --git a/ctdb/server/ipalloc_common.c b/ctdb/server/ipalloc_common.c
index 1a52ff3..9ccba71 100644
--- a/ctdb/server/ipalloc_common.c
+++ b/ctdb/server/ipalloc_common.c
@@ -61,26 +61,11 @@ static bool can_node_host_ip(struct ipalloc_state *ipalloc_state,
 			     int32_t pnn,
 			     struct public_ip_list *ip)
 {
-	struct ctdb_public_ip_list *public_ips;
-	int i;
-
 	if (ipalloc_state->noiphost[pnn]) {
 		return false;
 	}
-	if (ipalloc_state->available_public_ips == NULL) {
-		return false;
-	}
-
-	public_ips = &ipalloc_state->available_public_ips[pnn];
-
-	for (i=0; i<public_ips->num; i++) {
-		if (ctdb_sock_addr_same(&ip->addr, &public_ips->ip[i].addr)) {
-			/* yes, this node can serve this public ip */
-			return true;
-		}
-	}
 
-	return false;
+	return ip->available_on[pnn];
 }
 
 bool can_node_takeover_ip(struct ipalloc_state *ipalloc_state,
diff --git a/ctdb/tests/simple/scripts/local_daemons.bash b/ctdb/tests/simple/scripts/local_daemons.bash
index 8624cb9..ef93bd9 100644
--- a/ctdb/tests/simple/scripts/local_daemons.bash
+++ b/ctdb/tests/simple/scripts/local_daemons.bash
@@ -1,11 +1,6 @@
 # If we're not running on a real cluster then we need a local copy of
 # ctdb (and other stuff) in $PATH and we will use local daemons.
 
-export CTDB_NODES_SOCKETS=""
-for i in $(seq 0 $(($TEST_LOCAL_DAEMONS - 1))) ; do
-    CTDB_NODES_SOCKETS="${CTDB_NODES_SOCKETS}${CTDB_NODES_SOCKETS:+ }${TEST_VAR_DIR}/sock.${i}"
-done
-
 # Use in-tree binaries if running against local daemons.
 # Otherwise CTDB need to be installed on all nodes.
 if [ -n "$ctdb_dir" -a -d "${ctdb_dir}/bin" ] ; then
@@ -46,10 +41,39 @@ have_ip ()
 	[ -n "$t" ]
 }
 
-setup_ctdb ()
+node_dir ()
+{
+	local pnn="$1"
+
+	echo "${TEST_VAR_DIR}/node.${pnn}"
+}
+
+node_conf ()
+{
+	local pnn="$1"
+
+	local node_dir=$(node_dir "$pnn")
+	echo "${node_dir}/ctdbd.conf"
+}
+
+node_pidfile ()
+{
+	local pnn="$1"
+
+	local node_dir=$(node_dir "$pnn")
+	echo "${node_dir}/ctdbd.pid"
+}
+
+node_socket ()
 {
-    mkdir -p "${TEST_VAR_DIR}/test.db/persistent"
+	local pnn="$1"
 
+	local node_dir=$(node_dir "$pnn")
+	echo "${node_dir}/ctdbd.socket"
+}
+
+setup_ctdb ()
+{
     local public_addresses_all="${TEST_VAR_DIR}/public_addresses_all"
     rm -f $CTDB_NODES $public_addresses_all
 
@@ -103,7 +127,10 @@ setup_ctdb ()
 
     local pnn
     for pnn in $(seq 0 $(($TEST_LOCAL_DAEMONS - 1))) ; do
-	local public_addresses_mine="${TEST_VAR_DIR}/public_addresses.${pnn}"
+	local node_dir=$(node_dir "$pnn")
+	mkdir -p "$node_dir"
+
+	local public_addresses_mine="${node_dir}/public_addresses"
 	local public_addresses
 
 	if  [ "$no_public_ips" = $pnn ] ; then
@@ -116,20 +143,24 @@ setup_ctdb ()
 
 	local node_ip=$(sed -n -e "$(($pnn + 1))p" "$CTDB_NODES")
 
-	local pidfile="${TEST_VAR_DIR}/ctdbd.${pnn}.pid"
-	local conf="${TEST_VAR_DIR}/ctdbd.${pnn}.conf"
+	local conf=$(node_conf "$pnn")
+	local socket=$(node_socket "$pnn")
+
+	local db_dir="${node_dir}/db"
+	mkdir -p "${db_dir}/persistent"
+
 	cat >"$conf" <<EOF
 CTDB_RECOVERY_LOCK="${TEST_VAR_DIR}/rec.lock"
 CTDB_NODES="$CTDB_NODES"
 CTDB_NODE_ADDRESS="${node_ip}"
 CTDB_EVENT_SCRIPT_DIR="${TEST_VAR_DIR}/events.d"
-CTDB_LOGGING="file:${TEST_VAR_DIR}/daemon.${pnn}.log"
+CTDB_LOGGING="file:${node_dir}/log.ctdb"
 CTDB_DEBUGLEVEL=3
-CTDB_DBDIR="${TEST_VAR_DIR}/test.db"
-CTDB_DBDIR_PERSISTENT="${TEST_VAR_DIR}/test.db/persistent"
-CTDB_DBDIR_STATE="${TEST_VAR_DIR}/test.db/state"
+CTDB_DBDIR="${db_dir}"
+CTDB_DBDIR_PERSISTENT="${db_dir}/persistent"
+CTDB_DBDIR_STATE="${db_dir}/state"
 CTDB_PUBLIC_ADDRESSES="${public_addresses}"
-CTDB_SOCKET="${TEST_VAR_DIR}/sock.$pnn"
+CTDB_SOCKET="${socket}"
 CTDB_NOSETSCHED=yes
 EOF
 
@@ -145,8 +176,8 @@ daemons_start ()
 
     local pnn
     for pnn in $(seq 0 $(($TEST_LOCAL_DAEMONS - 1))) ; do
-	local pidfile="${TEST_VAR_DIR}/ctdbd.${pnn}.pid"
-	local conf="${TEST_VAR_DIR}/ctdbd.${pnn}.conf"
+	local pidfile=$(node_pidfile "$pnn")
+	local conf=$(node_conf "$pnn")
 
 	# If there is any CTDB configuration in the environment then
 	# append it to the regular configuration in a temporary
@@ -176,8 +207,8 @@ daemons_stop ()
 
     local pnn
     for pnn in $(seq 0 $(($TEST_LOCAL_DAEMONS - 1))) ; do
-	local pidfile="${TEST_VAR_DIR}/ctdbd.${pnn}.pid"
-	local conf="${TEST_VAR_DIR}/ctdbd.${pnn}.conf"
+	local pidfile=$(node_pidfile "$pnn")
+	local conf=$(node_conf "$pnn")
 
 	CTDBD_CONF="$conf" \
 	     ctdbd_wrapper "$pidfile" stop
@@ -208,3 +239,11 @@ ps_ctdbd ()
 	ps -p $(pgrep -f '\<ctdbd\>' | xargs | sed -e 's| |,|g') -o args ww
 	echo
 }
+
+# onnode will use CTDB_NODES_SOCKETS to help the ctdb tool connection
+# to each daemon
+export CTDB_NODES_SOCKETS=""
+for i in $(seq 0 $(($TEST_LOCAL_DAEMONS - 1))) ; do
+    socket=$(node_socket "$i")
+    CTDB_NODES_SOCKETS="${CTDB_NODES_SOCKETS}${CTDB_NODES_SOCKETS:+ }${socket}"
+done


-- 
Samba Shared Repository
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.