[SCM] Samba Shared Repository - branch master updated
Amitay Isaacs
amitay at samba.org
Fri Dec 2 03:20:03 UTC 2016
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 <martin at meltin.net>
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 <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
Autobuild-User(master): Amitay Isaacs <amitay at samba.org>
Autobuild-Date(master): Fri Dec 2 04:19:18 CET 2016 on sn-devel-144
commit 429377a2426fdfc8c3f7d8854fa2189ad36ff78c
Author: Martin Schwenke <martin at meltin.net>
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 <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit 24db43839f8a17c4498454d4bbd24411f647defa
Author: Martin Schwenke <martin at meltin.net>
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 <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
commit df2d6518e7cb715e6eadb712f1ee79759254b27f
Author: Martin Schwenke <martin at meltin.net>
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 <martin at meltin.net>
Reviewed-by: Amitay Isaacs <amitay at gmail.com>
-----------------------------------------------------------------------
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
More information about the samba-cvs
mailing list