The branch, master has been updated via 0621f07 ctdb-scripts: New configuration variable CTDB_NODE_ADDRESS via b38137a ctdb-doc: Move --listen documentation from debugging options via 0ae5758 ctdb-scripts: Simplify a command pipeline via 1092f97 ctdb-scripts: Replace uses of "ctdb pnn" with ctdb_get_pnn() via 09b5e49 ctdb-scripts: Changed uses of "ctdb xpnn" to ctdb_get_pnn() via af93ae1 ctdb-tests: New function ctdb_set_pnn() to change PNN via 579dda6 ctdb-scripts: New function ctdb_get_pnn() does cached retrieval of PNN from ec085fe Revert "wafsamba: flags from enviroment are put before our own internal versions"
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 0621f07eb482daf7495f6314b0af32853573cb82 Author: Martin Schwenke <mar...@meltin.net> Date: Mon Apr 20 09:53:23 2015 +1000 ctdb-scripts: New configuration variable CTDB_NODE_ADDRESS Required when automatic address detection can not be used. This can be the case when running multiple ctdbd daemons/nodes on the same physical host (usually for testing), using InfiniBand for the private network or on Linux when sysctl net.ipv4.ip_nonlocal_bind=1. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> Autobuild-User(master): Amitay Isaacs <ami...@samba.org> Autobuild-Date(master): Mon Apr 27 06:10:08 CEST 2015 on sn-devel-104 commit b38137a3898afc86348404af4435beb44d3493be Author: Martin Schwenke <mar...@meltin.net> Date: Mon Apr 20 09:18:08 2015 +1000 ctdb-doc: Move --listen documentation from debugging options There are valid real-world use cases. Improve the documentation. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 0ae57588eb99ef18888a8ace25a49efef1301fff Author: Martin Schwenke <mar...@meltin.net> Date: Sun Apr 19 19:52:55 2015 +1000 ctdb-scripts: Simplify a command pipeline Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 1092f9755fed331251ae508f1e04e85dc47ae902 Author: Martin Schwenke <mar...@meltin.net> Date: Sun Apr 19 19:45:41 2015 +1000 ctdb-scripts: Replace uses of "ctdb pnn" with ctdb_get_pnn() Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 09b5e4978ab1df09f47156147848a6bf099ea665 Author: Martin Schwenke <mar...@meltin.net> Date: Sat Apr 18 22:00:49 2015 +1000 ctdb-scripts: Changed uses of "ctdb xpnn" to ctdb_get_pnn() "ctdb xpnn" does not work when sysctl net.ipv4.ip_nonlocal_bind=1, since it determines the node by attempting to bind to each addres in the nodes file. The solution is to not use "ctdb xpnn". After the initial call, ctdb_get_pnn() will be more efficient that "ctdb xpnn". Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit af93ae1a540003824b32301d3c9f09c713f1fa7a Author: Martin Schwenke <mar...@meltin.net> Date: Sat Apr 18 21:55:50 2015 +1000 ctdb-tests: New function ctdb_set_pnn() to change PNN ctdb_get_pnn() incorrectly caches to the same file regardless of what node is selected via FAKE_CTDB_PNN. Instead, set the PNN using new function ctdb_get_pnn(), which also makes CTDB_VARDIR point to a node-specific subdirectory. This means that ctdb_get_pnn() will correctly cache to the node-specific directory. Fake tickle and TDB files/directories used by the ctdb stub need to be the same across all PNNs, so change these to use $EVENTSCRIPTS_TESTS_VAR_DIR instead of node-specific $CTDB_VARDIR. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> commit 579dda6858f547d360073cd67235e49ab03b355e Author: Martin Schwenke <mar...@meltin.net> Date: Fri Apr 17 20:44:15 2015 +1000 ctdb-scripts: New function ctdb_get_pnn() does cached retrieval of PNN This avoids the expense of establishing a client connection to the daemon just to get the PNN of the current node. Signed-off-by: Martin Schwenke <mar...@meltin.net> Reviewed-by: Amitay Isaacs <ami...@gmail.com> ----------------------------------------------------------------------- Summary of changes: ctdb/config/ctdbd_wrapper | 1 + ctdb/config/events.d/00.ctdb | 3 +- ctdb/config/events.d/11.natgw | 4 +-- ctdb/config/events.d/62.cnfs | 4 +-- ctdb/config/events.d/70.iscsi | 7 ++--- ctdb/config/events.d/91.lvs | 6 ++-- ctdb/config/functions | 19 ++++++++++-- ctdb/config/statd-callout | 8 +++--- ctdb/doc/ctdbd.1.xml | 43 ++++++++++++++-------------- ctdb/doc/ctdbd.conf.5.xml | 23 +++++++++++++++ ctdb/tests/eventscripts/scripts/local.sh | 19 ++++++++---- ctdb/tests/eventscripts/statd-callout.005.sh | 6 ++-- ctdb/tests/eventscripts/statd-callout.006.sh | 6 ++-- ctdb/tests/eventscripts/stubs/ctdb | 4 +-- 14 files changed, 99 insertions(+), 54 deletions(-) Changeset truncated at 500 lines: diff --git a/ctdb/config/ctdbd_wrapper b/ctdb/config/ctdbd_wrapper index f50efe9..aac8369 100755 --- a/ctdb/config/ctdbd_wrapper +++ b/ctdb/config/ctdbd_wrapper @@ -114,6 +114,7 @@ build_ctdb_options () maybe_set "--logging" "$CTDB_LOGGING" maybe_set "--nlist" "$CTDB_NODES" maybe_set "--socket" "$CTDB_SOCKET" + maybe_set "--listen" "$CTDB_NODE_ADDRESS" maybe_set "--public-addresses" "$CTDB_PUBLIC_ADDRESSES" maybe_set "--public-interface" "$CTDB_PUBLIC_INTERFACE" maybe_set "--dbdir" "$CTDB_DBDIR" diff --git a/ctdb/config/events.d/00.ctdb b/ctdb/config/events.d/00.ctdb index 07bc7a7..0688411 100755 --- a/ctdb/config/events.d/00.ctdb +++ b/ctdb/config/events.d/00.ctdb @@ -103,7 +103,8 @@ EOF update_config_from_tdb() { # Pull optional ctdb configuration data out of config.tdb - _key="public_addresses:node#$(ctdb -t 1 xpnn|sed -e 's/.*://')" + ctdb_get_pnn + _key="public_addresses:node#${pnn}" _t="$service_state_dir/public_addresses" rm -f "$_t" diff --git a/ctdb/config/events.d/11.natgw b/ctdb/config/events.d/11.natgw index e107f47..54e6cd9 100755 --- a/ctdb/config/events.d/11.natgw +++ b/ctdb/config/events.d/11.natgw @@ -208,7 +208,7 @@ case "$1" in updatenatgw|ipreallocated) natgw_check_config - mypnn=$(ctdb pnn | cut -d: -f2) + ctdb_get_pnn natgw_set_capability natgw_ensure_master @@ -217,7 +217,7 @@ case "$1" in natgw_clear - if [ "$mypnn" = "$natgwmaster" ]; then + if [ "$pnn" = "$natgwmaster" ]; then natgw_set_master else natgw_set_slave "$natgwip" diff --git a/ctdb/config/events.d/62.cnfs b/ctdb/config/events.d/62.cnfs index a6ca0c4..339eaef 100755 --- a/ctdb/config/events.d/62.cnfs +++ b/ctdb/config/events.d/62.cnfs @@ -52,8 +52,8 @@ case "$1" in ctdb eventscript monitor # Wait until we no longer serve any ip addresses at all - PNN=`ctdb pnn | cut -d: -f2` - while `ctdb -X ip | cut -d'|' -f3 | egrep "^$PNN$" >/dev/null`; do + ctdb_get_pnn + while ctdb -X ip | grep -q "^|.*|${pnn}|\$" ; do sleep 1 done ;; diff --git a/ctdb/config/events.d/70.iscsi b/ctdb/config/events.d/70.iscsi index 42d261b..33b71c4 100755 --- a/ctdb/config/events.d/70.iscsi +++ b/ctdb/config/events.d/70.iscsi @@ -47,15 +47,14 @@ EOF # Stop iSCSI daemon killall -9 tgtd >/dev/null 2>/dev/null - # What node is this? - this_node=$(ctdb xpnn | sed -e 's@PNN:@@') - [ -n "$this_node" ] || die "Failed to get node pnn" + ctdb_get_pnn + [ -n "$pnn" ] || die "Failed to get node pnn" # Start iSCSI daemon tgtd >/dev/null 2>&1 # Run a script for each currently hosted public IP address - ips=$(echo "$all_ips" | awk -F'|' -v pnn=$this_node '$3 == pnn {print $2}') + ips=$(echo "$all_ips" | awk -F'|' -v pnn=$pnn '$3 == pnn {print $2}') for ip in $ips ; do script="${CTDB_START_ISCSI_SCRIPTS}/${ip}.sh" if [ -x "$script" ] ; then diff --git a/ctdb/config/events.d/91.lvs b/ctdb/config/events.d/91.lvs index bdbcfa3..47adf33 100755 --- a/ctdb/config/events.d/91.lvs +++ b/ctdb/config/events.d/91.lvs @@ -46,10 +46,10 @@ case "$1" in ipvsadm -D -u $CTDB_LVS_PUBLIC_IP:0 kill_tcp_connections_local_only $CTDB_LVS_PUBLIC_IP - PNN=`ctdb pnn | sed -e "s/.*PNN://"` + ctdb_get_pnn LVSMASTER=`ctdb lvsmaster | sed -e "s/.*Node //" -e "s/ .*//"` - [ "$PNN" != "$LVSMASTER" ] && { + [ "$pnn" != "$LVSMASTER" ] && { # we are not the lvs master so we have to # change the ip address to have scope host so we wont respond # to arps @@ -66,7 +66,7 @@ case "$1" in ipvsadm -A -u $CTDB_LVS_PUBLIC_IP:0 -p 1999999 -s lc # add all nodes (except ourselves) to the lvs config - ctdb lvs | egrep -v "^$PNN:" | sed -e "s/.*://" | while read IP; do + ctdb lvs | egrep -v "^${pnn}:" | sed -e "s/.*://" | while read IP; do ipvsadm -a -t $CTDB_LVS_PUBLIC_IP:0 -r $IP -g ipvsadm -a -u $CTDB_LVS_PUBLIC_IP:0 -r $IP -g done diff --git a/ctdb/config/functions b/ctdb/config/functions index 1b2384e..96da817 100755 --- a/ctdb/config/functions +++ b/ctdb/config/functions @@ -199,6 +199,20 @@ nice_service() } ###################################################### +# Cached retrieval of PNN from local node. This never changes so why +# open a client connection to the server each time this is needed? +# This sets $pnn - this avoid an unnecessary subprocess. +ctdb_get_pnn () +{ + _pnn_file="$CTDB_VARDIR/state/my-pnn" + if [ ! -f "$_pnn_file" ] ; then + ctdb pnn | sed -e 's@.*:@@' >"$_pnn_file" + fi + + read pnn <"$_pnn_file" +} + +###################################################### # wrapper around /proc/ settings to allow them to be hooked # for testing # 1st arg is relative path under /proc/, 2nd arg is value to set @@ -1441,11 +1455,10 @@ update_tickles () tickledir="$CTDB_VARDIR/state/tickles" mkdir -p "$tickledir" - # Who am I? - _pnn=$(ctdb pnn) ; _pnn=${_pnn#PNN:} + ctdb_get_pnn # What public IPs do I hold? - _ips=$(ctdb -X ip | awk -F'|' -v pnn=$_pnn '$3 == pnn {print $2}') + _ips=$(ctdb -X ip | awk -F'|' -v pnn=$pnn '$3 == pnn {print $2}') # IPs as a regexp choice _ipschoice="($(echo $_ips | sed -e 's/ /|/g' -e 's/\./\\\\./g'))" diff --git a/ctdb/config/statd-callout b/ctdb/config/statd-callout index 4a331ac..347af41 100755 --- a/ctdb/config/statd-callout +++ b/ctdb/config/statd-callout @@ -47,7 +47,7 @@ case "$1" in # statd does not tell us to which IP the client connected so # we must add it to all the IPs that we serve cip="$2" - pnn=$(ctdb xpnn | sed -e 's/.*://') + ctdb_get_pnn date=$(date '+%s') ctdb ip -X | tail -n +2 | @@ -62,7 +62,7 @@ case "$1" in # statd does not tell us from which IP the client disconnected # so we must add it to all the IPs that we serve cip="$2" - pnn=$(ctdb xpnn | sed -e 's/.*://') + ctdb_get_pnn ctdb ip -X | tail -n +2 | while IFS="|" read x sip node x ; do @@ -80,7 +80,7 @@ case "$1" in fi # Filter out lines for any IP addresses that are not currently # hosted public IP addresses. - pnn=$(ctdb xpnn | sed -e 's/.*://') + ctdb_get_pnn ctdb_ips=$(ctdb ip | tail -n +2) sed_expr=$(echo "$ctdb_ips" | awk -v pnn=$pnn 'pnn == $2 { \ @@ -156,7 +156,7 @@ case "$1" in # probability that the client will accept the statd notify packet and # not just ignore it. # For all IPs we serve, collect info and push to the config database - pnn=$(ctdb xpnn | sed -e 's/.*://') + ctdb_get_pnn # Construct a sed expression to take catdb output and produce pairs of: # server-IP client-IP diff --git a/ctdb/doc/ctdbd.1.xml b/ctdb/doc/ctdbd.1.xml index b5feea2..558e534 100644 --- a/ctdb/doc/ctdbd.1.xml +++ b/ctdb/doc/ctdbd.1.xml @@ -126,6 +126,28 @@ </varlistentry> <varlistentry> + <term>--listen=<parameter>IPADDR</parameter></term> + <listitem> + <para> + IPADDR is the private IP address that ctdbd will bind to. + </para> + <para> + By default ctdbd will select the first address from the + nodes list that in can bind to. See also + <citetitle>--nlist</citetitle>. + </para> + <para> + This option is only required when automatic address + detection can not be used. This can be the case when + running multiple ctdbd daemons/nodes on the same physical + host (usually for testing), using InfiniBand for the + private network or on Linux when sysctl + net.ipv4.ip_nonlocal_bind=1. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term>--logging=<parameter>STRING</parameter></term> <listitem> <para> @@ -486,27 +508,6 @@ </varlistentry> <varlistentry> - <term>--listen=<parameter>IPADDR</parameter></term> - <listitem> - <para> - This specifies which IP address that ctdbd will bind to. - </para> - <para> - By default ctdbd will bind to the first address it finds in - the <filename>/etc/ctdb/nodes</filename> file that is also - present on the local system. - </para> - <para> - This option is only required when you want to run multiple - ctdbd daemons/nodes on the same physical host in which case - there would be multiple entries in - <filename>/etc/ctdb/nodes</filename> that would match a - local interface. - </para> - </listitem> - </varlistentry> - - <varlistentry> <term>--nopublicipcheck</term> <listitem> <para> diff --git a/ctdb/doc/ctdbd.conf.5.xml b/ctdb/doc/ctdbd.conf.5.xml index 8a62c86..cc56d79 100644 --- a/ctdb/doc/ctdbd.conf.5.xml +++ b/ctdb/doc/ctdbd.conf.5.xml @@ -344,6 +344,29 @@ </varlistentry> <varlistentry> + <term>CTDB_NODE_ADDRESS=<parameter>FILENAME</parameter></term> + <listitem> + <para> + IPADDR is the private IP address that ctdbd will bind to. + Corresponds to <option>--listen</option>. + </para> + <para> + By default ctdbd will select the first address from the + nodes list that in can bind to. See also + <citetitle>CTDB_NODES</citetitle>. + </para> + <para> + This option is only required when automatic address + detection can not be used. This can be the case when + running multiple ctdbd daemons/nodes on the same physical + host (usually for testing), using InfiniBand for the + private network or on Linux when sysctl + net.ipv4.ip_nonlocal_bind=1. + </para> + </listitem> + </varlistentry> + + <varlistentry> <term>CTDB_PUBLIC_ADDRESSES=<parameter>FILENAME</parameter></term> <listitem> <para> diff --git a/ctdb/tests/eventscripts/scripts/local.sh b/ctdb/tests/eventscripts/scripts/local.sh index aba53e8..ae30414 100644 --- a/ctdb/tests/eventscripts/scripts/local.sh +++ b/ctdb/tests/eventscripts/scripts/local.sh @@ -303,6 +303,18 @@ setup_public_addresses () EOF } +# Need to cope with ctdb_get_pnn(). If a test changes PNN then it +# needs to be using a different state directory, otherwise the wrong +# PNN can already be cached in the state directory. +ctdb_set_pnn () +{ + export FAKE_CTDB_PNN="$1" + echo "Setting up PNN ${FAKE_CTDB_PNN}" + + export CTDB_VARDIR="$EVENTSCRIPTS_TESTS_VAR_DIR/ctdb/${FAKE_CTDB_PNN}" + mkdir -p "$CTDB_VARDIR" +} + setup_ctdb () { setup_generic @@ -310,8 +322,7 @@ setup_ctdb () export FAKE_CTDB_NUMNODES="${1:-3}" echo "Setting up CTDB with ${FAKE_CTDB_NUMNODES} fake nodes" - export FAKE_CTDB_PNN="${2:-0}" - echo "Setting up CTDB with PNN ${FAKE_CTDB_PNN}" + ctdb_set_pnn "${2:-0}" setup_public_addresses @@ -747,10 +758,6 @@ setup_samba () export FAKE_TCP_LISTEN="" export FAKE_WBINFO_FAIL="yes" fi - - # This is ugly but if this file isn't removed before each test - # then configuration changes between tests don't stick. - rm -f "$CTDB_VARDIR/state/samba/smb.conf.cache" } setup_winbind () diff --git a/ctdb/tests/eventscripts/statd-callout.005.sh b/ctdb/tests/eventscripts/statd-callout.005.sh index ceb4445..06d4a1f 100755 --- a/ctdb/tests/eventscripts/statd-callout.005.sh +++ b/ctdb/tests/eventscripts/statd-callout.005.sh @@ -12,16 +12,16 @@ ok_null simple_test_event "add-client" "192.168.123.45" simple_test_event "update" -FAKE_CTDB_PNN=1 +ctdb_set_pnn 1 ok_null simple_test_event "add-client" "192.168.123.46" simple_test_event "update" -FAKE_CTDB_PNN=0 +ctdb_set_pnn 0 check_statd_callout_smnotify "192.168.123.45" -FAKE_CTDB_PNN=1 +ctdb_set_pnn 1 check_ctdb_tdb_statd_state "192.168.123.46" diff --git a/ctdb/tests/eventscripts/statd-callout.006.sh b/ctdb/tests/eventscripts/statd-callout.006.sh index 0db86fe..edeeda8 100755 --- a/ctdb/tests/eventscripts/statd-callout.006.sh +++ b/ctdb/tests/eventscripts/statd-callout.006.sh @@ -12,17 +12,17 @@ ok_null simple_test_event "add-client" "192.168.123.45" simple_test_event "update" -FAKE_CTDB_PNN=1 +ctdb_set_pnn 1 ok_null simple_test_event "add-client" "192.168.123.46" simple_test_event "update" -FAKE_CTDB_PNN=0 +ctdb_set_pnn 0 check_statd_callout_smnotify "192.168.123.45" -FAKE_CTDB_PNN=1 +ctdb_set_pnn 1 check_statd_callout_smnotify "192.168.123.46" diff --git a/ctdb/tests/eventscripts/stubs/ctdb b/ctdb/tests/eventscripts/stubs/ctdb index 7dbb6b4..aa3ac73 100755 --- a/ctdb/tests/eventscripts/stubs/ctdb +++ b/ctdb/tests/eventscripts/stubs/ctdb @@ -54,7 +54,7 @@ done setup_tickles () { # Make sure tickles file exists. - tickles_file="$CTDB_VARDIR/fake-ctdb/tickles" + tickles_file="$EVENTSCRIPTS_TESTS_VAR_DIR/fake-ctdb/tickles" mkdir -p $(dirname "$tickles_file") touch "$tickles_file" } @@ -336,7 +336,7 @@ ctdb_setvar () _t_setup () { - _t_dir="$CTDB_VARDIR/fake-ctdb/fake-tdb/$1" + _t_dir="$EVENTSCRIPTS_TESTS_VAR_DIR/fake-ctdb/fake-tdb/$1" mkdir -p "$_t_dir" } -- Samba Shared Repository