Best reviewed with "git show -w".
Signed-off-by: Martin Schwenke <mschwenke@ddn.com>
Reviewed-by: Andreas Schneider <asn@samba.org>
-setup ()
+setup()
{
setup_dbdir
setup_date
"
}
-result_filter ()
+result_filter()
{
_date="[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]"
_time="[0-9][0-9][0-9][0-9][0-9][0-9]"
-setup ()
+setup()
{
- if [ $# -eq 1 ] ; then
+ if [ $# -eq 1 ]; then
reclock="$1"
else
reclock="${CTDB_TEST_TMP_DIR}/reclock_subdir/rec.lock"
fi
CTDB_RECOVERY_LOCK="$reclock"
- if [ -n "$CTDB_RECOVERY_LOCK" ] ; then
+ if [ -n "$CTDB_RECOVERY_LOCK" ]; then
cat >>"${CTDB_BASE}/ctdb.conf" <<EOF
[cluster]
recovery lock = $CTDB_RECOVERY_LOCK
-set_mem_usage ()
+set_mem_usage()
{
_mem_usage="${1:-10}" # Default is 10%
_swap_usage="${2:-0}" # Default is 0%
_swap_total=5857276
- _swap_free=$(( (100 - $_swap_usage) * $_swap_total / 100 ))
+ _swap_free=$(((100 - $_swap_usage) * $_swap_total / 100))
_mem_total=3940712
_mem_free=225268
_mem_buffers=146120
- _mem_cached=$(( $_mem_total * (100 - $_mem_usage) / 100 -
- $_mem_free - $_mem_buffers ))
+ _mem_cached=$(($_mem_total * (100 - $_mem_usage) / 100 - \
+ $_mem_free - $_mem_buffers))
export FAKE_PROC_MEMINFO="\
MemTotal: ${_mem_total} kB
..."
}
-set_fs_usage ()
+set_fs_usage()
{
- export FAKE_FS_USE="${1:-10}" # Default is 10% usage
+ export FAKE_FS_USE="${1:-10}" # Default is 10% usage
}
-setup ()
+setup()
{
setup_dbdir
-setup ()
+setup()
{
setup_public_addresses
}
-_tcp_connections ()
+_tcp_connections()
{
_count="$1"
_sip="$2"
_cip_prefix="${_cip_base%.*}"
_cip_suffix="${_cip_base##*.}"
- for _i in $(seq 1 $_count) ; do
+ for _i in $(seq 1 $_count); do
_cip_last=$((_cip_suffix + _i))
_cip="${_cip_prefix}.${_cip_last}"
_cport=$((_cport_base + _i))
done
}
-setup_tcp_connections ()
+setup_tcp_connections()
{
_t="${FAKE_NETWORK_STATE}/tcp-established"
export FAKE_NETSTAT_TCP_ESTABLISHED_FILE="$_t"
_tcp_connections "$@" >"$FAKE_NETSTAT_TCP_ESTABLISHED_FILE"
}
-setup_tcp_connections_unkillable ()
+setup_tcp_connections_unkillable()
{
# These connections are listed by the "ss" stub but are not
# killed by the "ctdb killtcp" stub. So killing these
# arg1 is interface name, arg2 is currently active slave (use "None"
# if none), arg3 is MII status ("up" or "down").
-setup_bond ()
+setup_bond()
{
_iface="$1"
_slave="${2:-${_iface}_sl_0}"
-setup ()
+setup()
{
debug "Setting up NAT gateway"
# A separate function for this makes sense because it can be done
# multiple times per test
-setup_ctdb_natgw ()
+setup_ctdb_natgw()
{
# Read from stdin
- while read _ip _opts ; do
+ while read _ip _opts; do
case "$_opts" in
leader)
export FAKE_CTDB_NATGW_LEADER="$_ip"
EOF
}
-ok_natgw_leader_ip_addr_show ()
+ok_natgw_leader_ip_addr_show()
{
_mac=$(echo "$CTDB_NATGW_PUBLIC_IFACE" |
- cksum |
- sed -r -e 's@(..)(..)(..).*@fe:fe:fe:\1:\2:\3@')
+ cksum |
+ sed -r -e 's@(..)(..)(..).*@fe:fe:fe:\1:\2:\3@')
# This is based on CTDB_NATGW_PUBLIC_IP
_brd="10.1.1.255"
EOF
}
-ok_natgw_follower_ip_addr_show ()
+ok_natgw_follower_ip_addr_show()
{
_mac=$(echo "$CTDB_NATGW_PUBLIC_IFACE" |
- cksum |
- sed -r -e 's@(..)(..)(..).*@fe:fe:fe:\1:\2:\3@')
+ cksum |
+ sed -r -e 's@(..)(..)(..).*@fe:fe:fe:\1:\2:\3@')
ok <<EOF
1: ${CTDB_NATGW_PUBLIC_IFACE}: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
EOF
}
-ok_natgw_leader_static_routes ()
+ok_natgw_leader_static_routes()
{
_nl="
"
_t=""
- for _i in $CTDB_NATGW_STATIC_ROUTES ; do
+ for _i in $CTDB_NATGW_STATIC_ROUTES; do
# This is intentionally different to the code in 11.natgw ;-)
case "$_i" in
*@*)
*)
_net="$_i"
_gw="$CTDB_NATGW_DEFAULT_GATEWAY"
+ ;;
esac
[ -n "$_gw" ] || continue
ok "$_t"
}
-ok_natgw_follower_static_routes ()
+ok_natgw_follower_static_routes()
{
_nl="
"
_t=""
- for _i in $CTDB_NATGW_STATIC_ROUTES ; do
+ for _i in $CTDB_NATGW_STATIC_ROUTES; do
# This is intentionally different to the code in 11.natgw ;-)
_net=$(echo "$_i" | sed -e 's|@.*||')
-setup ()
+setup()
{
setup_public_addresses
# Create policy routing configuration in $CTDB_PER_IP_ROUTING_CONF.
# $1 is the number of assigned IPs to use (<num>, all), defaulting to
# 1. If $2 is "default" then a default route is also added.
-create_policy_routing_config ()
+create_policy_routing_config()
{
_num_ips="${1:-1}"
_should_add_default="$2"
ctdb_get_my_public_addresses |
- if [ "$_num_ips" = "all" ] ; then
- cat
- else
- { head -n "$_num_ips" ; cat >/dev/null ; }
- fi |
- while read _dev _ip _bits ; do
- _net=$(ipv4_host_addr_to_net "$_ip" "$_bits")
- _gw="${_net%.*}.254" # a dumb, calculated default
+ if [ "$_num_ips" = "all" ]; then
+ cat
+ else
+ {
+ head -n "$_num_ips"
+ cat >/dev/null
+ }
+ fi |
+ while read _dev _ip _bits; do
+ _net=$(ipv4_host_addr_to_net "$_ip" "$_bits")
+ _gw="${_net%.*}.254" # a dumb, calculated default
- echo "$_ip $_net"
+ echo "$_ip $_net"
- if [ "$_should_add_default" = "default" ] ; then
- echo "$_ip 0.0.0.0/0 $_gw"
- fi
- done >"$CTDB_PER_IP_ROUTING_CONF"
+ if [ "$_should_add_default" = "default" ]; then
+ echo "$_ip 0.0.0.0/0 $_gw"
+ fi
+ done >"$CTDB_PER_IP_ROUTING_CONF"
}
-setup ()
+setup()
{
_failures=""
_devices=""
- for i ; do
+ for i; do
case "$i" in
\!*)
_t="${i#!}"
echo "Marking ${_t} as having no active paths"
_failures="${_failures}${_failures:+ }${_t}"
- ;;
+ ;;
*)
_t="$i"
+ ;;
esac
_devices="${_devices}${_devices:+ }${_t}"
done
-setup ()
+setup()
{
setup_script_options <<EOF
CTDB_CLAMD_SOCKET="/var/run/clamd.sock"
-setup ()
+setup()
{
debug "Setting up VSFTPD environment: service $1, not managed by CTDB"
_service_name="vsftpd"
- if [ "$1" != "down" ] ; then
+ if [ "$1" != "down" ]; then
service "$_service_name" start
else
service "$_service_name" force-stopped
-setup ()
+setup()
{
debug "Setting up HTTPD environment: service $1, not managed by CTDB"
- if [ "$1" != "down" ] ; then
- for _service_name in "apache2" "httpd" ; do
+ if [ "$1" != "down" ]; then
+ for _service_name in "apache2" "httpd"; do
service "$_service_name" start
done
else
- for _service_name in "apache2" "httpd" ; do
+ for _service_name in "apache2" "httpd"; do
service "$_service_name" force-stopped
done
fi
-setup ()
+setup()
{
service_name="netbios"
- if [ "$1" != "down" ] ; then
+ if [ "$1" != "down" ]; then
debug "Marking Netbios name services as up, listening and managed by CTDB"
# All possible service names for all known distros.
- for i in "nmb" "nmbd" ; do
+ for i in "nmb" "nmbd"; do
service "$i" force-started
done
else
debug "Marking Netbios name services as down, not listening and not managed by CTDB"
# All possible service names for all known distros.
- for i in "nmb" "nmbd" ; do
+ for i in "nmb" "nmbd"; do
service "$i" force-stopped
done
fi
-setup ()
+setup()
{
service_name="winbind"
- if [ "$1" != "down" ] ; then
+ if [ "$1" != "down" ]; then
debug "Marking Winbind service as up and managed by CTDB"
fi
}
-wbinfo_down ()
+wbinfo_down()
{
debug "Making wbinfo commands fail"
FAKE_WBINFO_FAIL="yes"
-setup ()
+setup()
{
service_name="samba"
- if [ "$1" != "down" ] ; then
+ if [ "$1" != "down" ]; then
debug "Marking Samba services as up, listening and managed by CTDB"
# All possible service names for all known distros.
- for i in "smb" "samba" "smbd" ; do
+ for i in "smb" "samba" "smbd"; do
service "$i" force-started
done
debug "Marking Samba services as down, not listening and not managed by CTDB"
# All possible service names for all known distros.
- for i in "smb" "samba" "smbd" ; do
+ for i in "smb" "samba" "smbd"; do
service "$i" force-stopped
done
}
-samba_setup_fake_threads ()
+samba_setup_fake_threads()
{
export FAKE_SMBD_THREAD_PIDS="$*"
"
_out=""
_count=0
- for _pid ; do
+ for _pid; do
[ "$_count" -lt 5 ] || break
_t=$(program_stack_trace "smbd" $_pid)
_out="${_out:+${_out}${_nl}}${_t}"
-setup ()
+setup()
{
setup_public_addresses
setup_shares
service_name="nfs"
- if [ -z "$CTDB_NFS_DISTRO_STYLE" ] ; then
+ if [ -z "$CTDB_NFS_DISTRO_STYLE" ]; then
# Currently supported: sysvinit-redhat, systemd-redhat
CTDB_NFS_DISTRO_STYLE="systemd-redhat"
fi
export RPCNFSDCOUNT
- if [ "$1" != "down" ] ; then
+ if [ "$1" != "down" ]; then
debug <<EOF
Setting up NFS environment: all RPC services up, NFS managed by CTDB
EOF
"nlockmgr" "status"
nfs_setup_fake_threads "nfsd"
- nfs_setup_fake_threads "rpc.foobar" # Set the variable to empty
+ nfs_setup_fake_threads "rpc.foobar" # Set the variable to empty
else
debug <<EOF
Setting up NFS environment: all RPC services down, NFS not managed by CTDB
rm "${CTDB_BASE}/statd-callout"
}
-rpc_services_down ()
+rpc_services_down()
{
_out=""
- for _s in $FAKE_RPCINFO_SERVICES ; do
- for _i ; do
- if [ "$_i" = "${_s%%:*}" ] ; then
- debug "Marking RPC service \"${_i}\" as UNAVAILABLE"
- continue 2
+ for _s in $FAKE_RPCINFO_SERVICES; do
+ for _i; do
+ if [ "$_i" = "${_s%%:*}" ]; then
+ debug "Marking RPC service \"${_i}\" as UNAVAILABLE"
+ continue 2
fi
done
_out="${_out}${_out:+ }${_s}"
FAKE_RPCINFO_SERVICES="$_out"
}
-rpc_services_up ()
+rpc_services_up()
{
_out="$FAKE_RPCINFO_SERVICES"
- for _i ; do
+ for _i; do
debug "Marking RPC service \"${_i}\" as available"
case "$_i" in
portmapper) _t="2:4" ;;
- nfs) _t="2:3" ;;
- mountd) _t="1:3" ;;
- rquotad) _t="1:2" ;;
- nlockmgr) _t="3:4" ;;
- status) _t="1:1" ;;
+ nfs) _t="2:3" ;;
+ mountd) _t="1:3" ;;
+ rquotad) _t="1:2" ;;
+ nlockmgr) _t="3:4" ;;
+ status) _t="1:1" ;;
*) die "Internal error - unsupported RPC service \"${_i}\"" ;;
esac
export FAKE_RPCINFO_SERVICES="$_out"
}
-nfs_setup_fake_threads ()
+nfs_setup_fake_threads()
{
- _prog="$1" ; shift
+ _prog="$1"
+ shift
case "$_prog" in
nfsd)
esac
}
-guess_output ()
+guess_output()
{
case "$1" in
$CTDB_NFS_CALLOUT\ start\ nlockmgr)
;;
*)
: # Nothing
+ ;;
esac
}
# if it is incomplete and hacky. So, if the 60.nfs eventscript
# changes and the tests start to fail then it may be due to this
# function being incomplete.
-rpc_set_service_failure_response ()
+rpc_set_service_failure_response()
{
_rpc_service="$1"
_numfails="${2:-1}" # default 1
# Default
ok_null
- if [ $_numfails -eq 0 ] ; then
+ if [ $_numfails -eq 0 ]; then
return
fi
_dir="${CTDB_NFS_CHECKS_DIR:-${CTDB_BASE}/nfs-checks.d}"
_file=$(ls "$_dir"/[0-9][0-9]."${_rpc_service}.check")
- [ -r "$_file" ] || \
+ [ -r "$_file" ] ||
die "RPC check file \"$_file\" does not exist or is not unique"
_out="${CTDB_TEST_TMP_DIR}/rpc_failure_output"
# Just use the first version, or use default. This is
# dumb but handles all the cases that we care about
# now...
- if [ -n "$version" ] ; then
+ if [ -n "$version" ]; then
_ver="${version%% *}"
else
case "$_rpc_service" in
portmapper) _ver="" ;;
- *) _ver=1 ;;
+ *) _ver=1 ;;
esac
fi
_rpc_check_out="\
program $_rpc_service${_ver:+ version }${_ver} is not available"
if [ $unhealthy_after -gt 0 -a \
- $_numfails -ge $unhealthy_after ] ; then
+ $_numfails -ge $unhealthy_after ]; then
_unhealthy=true
echo 1 >"$_rc_file"
echo "ERROR: ${_rpc_check_out}" >>"$_out"
echo 0 >"$_rc_file"
fi
- if [ $restart_every -gt 0 ] && \
- [ $(($_numfails % $restart_every)) -eq 0 ] ; then
- if ! $_unhealthy ; then
+ if [ $restart_every -gt 0 ] &&
+ [ $(($_numfails % $restart_every)) -eq 0 ]; then
+ if ! $_unhealthy; then
echo "WARNING: ${_rpc_check_out}" >>"$_out"
fi
- echo "Trying to restart service \"${_rpc_service}\"..."\
- >>"$_out"
+ echo "Trying to restart service \"${_rpc_service}\"..." \
+ >>"$_out"
guess_output "$service_stop_cmd" >>"$_out"
- if [ -n "$service_debug_cmd" ] ; then
+ if [ -n "$service_debug_cmd" ]; then
$service_debug_cmd 2>&1 >>"$_out"
fi
rm -f "$_out" "$_rc_file"
}
-program_stack_traces ()
+program_stack_traces()
{
_prog="$1"
_max="${2:-1}"
_count=1
- if [ "$_prog" = "nfsd" ] ; then
+ if [ "$_prog" = "nfsd" ]; then
_pids="$FAKE_NFSD_THREAD_PIDS"
else
_pids="$FAKE_RPC_THREAD_PIDS"
fi
- for _pid in $_pids ; do
+ for _pid in $_pids; do
[ $_count -le $_max ] || break
program_stack_trace "$_prog" "$_pid"
# These arguments can allow a service to be started or stopped
# before a particular iteration.
#
-nfs_iterate_test ()
+nfs_iterate_test()
{
_repeats="$1"
_rpc_service="$2"
- if [ -n "$2" ] ; then
+ if [ -n "$2" ]; then
shift 2
else
shift
echo "Running $_repeats iterations of \"$script $event\" $args"
_iterate_failcount=0
- for _iteration in $(seq 1 $_repeats) ; do
+ for _iteration in $(seq 1 $_repeats); do
# This is not a numerical comparison because $1 will
# often not be set.
- if [ "$_iteration" = "$1" ] ; then
+ if [ "$_iteration" = "$1" ]; then
debug <<EOF
##################################################
EOF
EOF
shift 2
fi
- if [ -n "$_rpc_service" ] ; then
+ if [ -n "$_rpc_service" ]; then
_ok=false
- if [ -n "$service_check_cmd" ] ; then
- if eval "$service_check_cmd" ; then
+ if [ -n "$service_check_cmd" ]; then
+ if eval "$service_check_cmd"; then
_ok=true
fi
else
if rpcinfo -T tcp localhost "$_rpc_service" \
- >/dev/null 2>&1 ; then
+ >/dev/null 2>&1; then
_ok=true
fi
fi
- if $_ok ; then
+ if $_ok; then
_iterate_failcount=0
else
_iterate_failcount=$(($_iterate_failcount + 1))
fi
_out=$(simple_test 2>&1)
_ret=$?
- if "$CTDB_TEST_VERBOSE" || [ $_ret -ne 0 ] ; then
+ if "$CTDB_TEST_VERBOSE" || [ $_ret -ne 0 ]; then
cat <<EOF
##################################################
Iteration ${_iteration}:
$_out
EOF
fi
- if [ $_ret -ne 0 ] ; then
+ if [ $_ret -ne 0 ]; then
exit $_ret
fi
done
-setup ()
+setup()
{
_ip="$1"
_iface="$2"
# Read from stdin
_pnn=0
- while read _ip _opts ; do
+ while read _ip _opts; do
case "$_opts" in
leader)
FAKE_CTDB_LVS_LEADER="$_pnn"
done >"$CTDB_LVS_NODES"
}
-check_ipvsadm ()
+check_ipvsadm()
{
- if [ "$1" = "NULL" ] ; then
+ if [ "$1" = "NULL" ]; then
required_result 0 <<EOF
$lvs_header
EOF
simple_test_command ipvsadm -l -n
}
-check_lvs_ip ()
+check_lvs_ip()
{
_scope="$1"
- if [ "$_scope" = "NULL" ] ; then
+ if [ "$_scope" = "NULL" ]; then
required_result 0 <<EOF
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
-setup ()
+setup()
{
setup_dbdir
}
sed -e 's|\( of debug locks PID=\)[0-9]*|\1PID|'
}
-tdb_path ()
+tdb_path()
{
echo "${CTDB_DBDIR}/${1}.${FAKE_CTDB_PNN}"
}
-fake_file_id ()
+fake_file_id()
{
_path="$1"
echo "$FAKE_FILE_ID_MAP" |
- awk -v path="$_path" '$1 == path { print $2 }'
+ awk -v path="$_path" '$1 == path { print $2 }'
}
-fake_stack_trace ()
+fake_stack_trace()
{
_pid="$1"
_command="${2:-smbd}"
esac
}
-do_test ()
+do_test()
{
_holder_scope="$1"
_holder_state="$2"
_lock_helper_pid="4132032"
- FAKE_PS_MAP=$(cat <<EOF
+ FAKE_PS_MAP=$(
+ cat <<EOF
1234567 ctdbd S
2345678 smbd S
4131931 smbd ${_holder_state}
${_lock_helper_pid} ctdb_lock_helpe S+
EOF
- )
+ )
export FAKE_PS_MAP
FAKE_FILE_ID_MAP=""
_tdbs="locking.tdb brlock.tdb test.tdb foo.tdb"
_n=1
- for _t in $_tdbs ; do
+ for _t in $_tdbs; do
_path=$(tdb_path "$_t")
_inode=$((19690818 + _n))
- FAKE_FILE_ID_MAP=$(cat <<EOF
+ FAKE_FILE_ID_MAP=$(
+ cat <<EOF
${FAKE_FILE_ID_MAP}
${_path} 103:04:${_inode}
EOF
- )
+ )
rm -f "$_path"
touch "$_path"
_n=$((_n + 1))
_path=$(tdb_path "locking.tdb")
_locking_tdb_id=$(fake_file_id "$_path")
- _t=$(cat <<EOF
+ _t=$(
+ cat <<EOF
POSIX ADVISORY WRITE 3769740 103:04:24380821 1073741826 1073742335
FLOCK ADVISORY WRITE 3632524 103:02:1059266 0 EOF
FLOCK ADVISORY WRITE 4060231 00:17:17184 0 EOF
POSIX ADVISORY WRITE 4427 103:04:22152494 0 EOF
POSIX ADVISORY READ 4427 103:04:22152702 1073741826 1073742335
EOF
- )
+ )
_holder_lock=""
- if [ "$_holder_scope" = "DB" ] ; then
- if [ "$_lock_type" = "FCNTL" ] ; then
- _holder_lock=$(cat <<EOF
+ if [ "$_holder_scope" = "DB" ]; then
+ if [ "$_lock_type" = "FCNTL" ]; then
+ _holder_lock=$(
+ cat <<EOF
POSIX ADVISORY WRITE 4131931 ${_locking_tdb_id} 168 EOF
EOF
- )
- elif [ "$_lock_type" = "MUTEX" ] ; then
- _holder_lock=$(cat <<EOF
+ )
+ elif [ "$_lock_type" = "MUTEX" ]; then
+ _holder_lock=$(
+ cat <<EOF
POSIX ADVISORY WRITE 4131931 ${_locking_tdb_id} 400172 EOF
EOF
- )
+ )
fi
- elif [ "$_holder_scope" = "RECORD" ] && \
- [ "$_lock_type" = "FCNTL" ] ; then
- _holder_lock=$(cat <<EOF
+ elif [ "$_holder_scope" = "RECORD" ] &&
+ [ "$_lock_type" = "FCNTL" ]; then
+ _holder_lock=$(
+ cat <<EOF
POSIX ADVISORY WRITE 2345678 ${_locking_tdb_id} 112736 112736
POSIX ADVISORY WRITE 4131931 ${_locking_tdb_id} 225472 225472
EOF
- )
+ )
fi
- _t=$(cat <<EOF
+ _t=$(
+ cat <<EOF
$_t
$_holder_lock
EOF
- )
+ )
_helper_lock=""
- if [ "$_helper_scope" = "DB" ] && \
- [ "$_lock_type" = "FCNTL" ] ; then
- _helper_lock=$(cat <<EOF
+ if [ "$_helper_scope" = "DB" ] &&
+ [ "$_lock_type" = "FCNTL" ]; then
+ _helper_lock=$(
+ cat <<EOF
-> POSIX ADVISORY WRITE ${_lock_helper_pid} ${_locking_tdb_id} 168 170
EOF
- )
- elif [ "$_helper_scope" = "RECORD" ] && \
- [ "$_lock_type" = "FCNTL" ] ; then
- _helper_lock=$(cat <<EOF
+ )
+ elif [ "$_helper_scope" = "RECORD" ] &&
+ [ "$_lock_type" = "FCNTL" ]; then
+ _helper_lock=$(
+ cat <<EOF
-> POSIX ADVISORY WRITE ${_lock_helper_pid} ${_locking_tdb_id} 112736 112736
EOF
- )
+ )
fi
- _t=$(cat <<EOF
+ _t=$(
+ cat <<EOF
$_t
$_helper_lock
EOF
- )
+ )
- if [ "$_holder_scope" = "DB" ] ; then
- _t=$(cat <<EOF
+ if [ "$_holder_scope" = "DB" ]; then
+ _t=$(
+ cat <<EOF
$_t
POSIX ADVISORY READ 4131931 ${_locking_tdb_id} 4 4
EOF
- )
- elif [ "$_holder_scope" = "RECORD" ] && \
- [ "$_lock_type" = "FCNTL" ] ; then
- _t=$(cat <<EOF
+ )
+ elif [ "$_holder_scope" = "RECORD" ] &&
+ [ "$_lock_type" = "FCNTL" ]; then
+ _t=$(
+ cat <<EOF
$_t
POSIX ADVISORY READ 2345678 ${_locking_tdb_id} 4 4
POSIX ADVISORY READ 4131931 ${_locking_tdb_id} 4 4
EOF
- )
+ )
fi
- _t=$(cat <<EOF
+ _t=$(
+ cat <<EOF
$_t
POSIX ADVISORY READ 3769740 103:04:24390149 1073741826 1073742335
POSIX ADVISORY WRITE 3769740 103:04:24380839 1073741826 1073742335
FLOCK ADVISORY WRITE 3769302 103:02:1180308 0 EOF
OFDLCK ADVISORY READ -1 00:05:6 0 EOF
EOF
- )
+ )
FAKE_PROC_LOCKS=$(echo "$_t" | awk '{ printf "%d: %s\n", NR, $0 }')
export FAKE_PROC_LOCKS
_holder_mutex_lock=""
- if [ "$_lock_type" = "MUTEX" ] ; then
- if [ "$_holder_scope" = "RECORD" ] ; then
- _holder_mutex_lock=$(cat <<EOF
+ if [ "$_lock_type" = "MUTEX" ]; then
+ if [ "$_holder_scope" = "RECORD" ]; then
+ _holder_mutex_lock=$(
+ cat <<EOF
2345678 28142
4131931 56284
EOF
- )
+ )
fi
fi
'
_db="locking.tdb.${FAKE_CTDB_PNN}"
- if [ -n "$_helper_lock" ] ; then
+ if [ -n "$_helper_lock" ]; then
read -r _ _ _ _ _pid _ _start _end <<EOF
$_helper_lock
EOF
# fake lock info
_pids=''
_out="${_out:+${_out}${_nl}}Lock holders:"
- if [ -n "$_holder_mutex_lock" ] ; then
- while read -r _pid _chain ; do
+ if [ -n "$_holder_mutex_lock" ]; then
+ while read -r _pid _chain; do
_comm="smbd"
_out="${_out}${_nl}"
_out="${_out}${_pid} smbd ${_db} ${_chain}"
$_holder_mutex_lock
EOF
else
- while read -r _ _ _ _pid _ _start _end ; do
+ while read -r _ _ _ _pid _ _start _end; do
_comm="smbd"
_out="${_out}${_nl}"
_out="${_out}${_pid} smbd ${_db} ${_start} ${_end}"
fi
# fake stack traces
- for _pid in $_pids ; do
+ for _pid in $_pids; do
_comm="smbd"
- if [ "$_pid" = "4131931" ] ; then
+ if [ "$_pid" = "4131931" ]; then
_state="$_holder_state"
else
_state="S"
fi
- _out=$(cat <<EOF
+ _out=$(
+ cat <<EOF
$_out
$(fake_stack_trace "$_pid" "$_comm" "$_state")
EOF
- )
+ )
done
ok <<EOF
EOF
script_test "${script_dir}/${script}" \
- "$_lock_helper_pid" \
- "$_helper_scope" \
- "$_path" \
- "$_lock_type"
+ "$_lock_helper_pid" \
+ "$_helper_scope" \
+ "$_path" \
+ "$_lock_type"
}
PATH="${stubs_dir}:${PATH}"
-
export CTDB="ctdb"
# Force this to be absolute - event scripts can change directory
CTDB_TEST_TMP_DIR=$(cd "$CTDB_TEST_TMP_DIR" && echo "$PWD")
export CTDB_LOGGING="file:${CTDB_TEST_TMP_DIR}/log.ctdb"
-touch "${CTDB_LOGGING#file:}" || \
- die "Unable to setup logging for \"$CTDB_LOGGING\""
+touch "${CTDB_LOGGING#file:}" ||
+ die "Unable to setup logging for \"$CTDB_LOGGING\""
-if [ -d "${CTDB_TEST_SUITE_DIR}/etc" ] ; then
- cp -a "${CTDB_TEST_SUITE_DIR}/etc" "$CTDB_TEST_TMP_DIR"
- export CTDB_SYS_ETCDIR="${CTDB_TEST_TMP_DIR}/etc"
+if [ -d "${CTDB_TEST_SUITE_DIR}/etc" ]; then
+ cp -a "${CTDB_TEST_SUITE_DIR}/etc" "$CTDB_TEST_TMP_DIR"
+ export CTDB_SYS_ETCDIR="${CTDB_TEST_TMP_DIR}/etc"
else
- die "Unable to setup \$CTDB_SYS_ETCDIR"
+ die "Unable to setup \$CTDB_SYS_ETCDIR"
fi
setup_ctdb_base "$CTDB_TEST_TMP_DIR" "etc-ctdb" \
- debug_locks.sh \
- functions \
- nfs-checks.d \
- nfs-linux-kernel-callout \
- statd-callout
+ debug_locks.sh \
+ functions \
+ nfs-checks.d \
+ nfs-linux-kernel-callout \
+ statd-callout
export FAKE_CTDB_STATE="${CTDB_TEST_TMP_DIR}/fake-ctdb"
mkdir -p "$FAKE_CTDB_STATE"
######################################################################
-if "$CTDB_TEST_VERBOSE" ; then
- debug ()
+if "$CTDB_TEST_VERBOSE"; then
+ debug()
{
- if [ -n "$1" ] ; then
+ if [ -n "$1" ]; then
echo "$@" >&2
else
cat >&2
fi
}
else
- debug () { : ; }
+ debug()
+ {
+ :
+ }
fi
######################################################################
# Default is to use script name with ".options" appended. With
# arguments, this can specify an alternate script name (and
# component).
-setup_script_options ()
+setup_script_options()
{
- if [ $# -eq 2 ] ; then
+ if [ $# -eq 2 ]; then
_script="$2"
- elif [ $# -eq 0 ] ; then
+ elif [ $# -eq 0 ]; then
_script=""
else
die "usage: setup_script_options [ component script ]"
fi
- if [ -n "$_script" ] ; then
+ if [ -n "$_script" ]; then
_options="${CTDB_BASE}/events/legacy/${_script}.options"
else
_options="${script_dir}/${script%.script}.options"
. "$_options"
}
-setup_dbdir ()
+setup_dbdir()
{
export CTDB_DBDIR_BASE="${CTDB_TEST_TMP_DIR}/db"
CTDB_DBDIR="${CTDB_DBDIR_BASE}/volatile"
mkdir -p "$CTDB_DBDIR_STATE"
}
-setup_date ()
+setup_date()
{
export FAKE_DATE_OUTPUT="$1"
}
-setup_tcp_listen ()
+setup_tcp_listen()
{
export FAKE_TCP_LISTEN="$*"
}
-tcp_port_listening ()
+tcp_port_listening()
{
- for _i ; do
- FAKE_TCP_LISTEN="${FAKE_TCP_LISTEN} ${_i}"
+ for _i; do
+ FAKE_TCP_LISTEN="${FAKE_TCP_LISTEN} ${_i}"
done
}
-tcp_port_down ()
+tcp_port_down()
{
_port="$1"
debug "Marking TCP port \"${_port}\" as not listening"
_t=""
- for _i in $FAKE_TCP_LISTEN ; do
- if [ "$_i" = "$_port" ] ; then
+ for _i in $FAKE_TCP_LISTEN; do
+ if [ "$_i" = "$_port" ]; then
continue
fi
_t="${_t} ${_i}"
FAKE_TCP_LISTEN="$_t"
}
-setup_unix_listen ()
+setup_unix_listen()
{
export FAKE_NETSTAT_UNIX_LISTEN="$*"
}
-unix_socket_listening ()
+unix_socket_listening()
{
_s="$1"
FAKE_NETSTAT_UNIX_LISTEN="${FAKE_NETSTAT_UNIX_LISTEN} ${_s}"
}
-setup_shares ()
+setup_shares()
{
debug "Setting up shares (3 existing shares)"
# Create 3 fake shares/exports.
export FAKE_SHARES=""
- for i in $(seq 1 3) ; do
+ for i in $(seq 1 3); do
_s="${CTDB_TEST_TMP_DIR}/shares/share${i}"
mkdir -p "$_s"
FAKE_SHARES="${FAKE_SHARES}${FAKE_SHARES:+ }${_s}"
done
}
-shares_missing ()
+shares_missing()
{
# Mark some shares as non-existent
- _fmt="$1" ; shift
+ _fmt="$1"
+ shift
_out=""
_nl="
"
_n=1
- for _i in $FAKE_SHARES ; do
- for _j ; do
- if [ $_n -ne "$_j" ] ; then
+ for _i in $FAKE_SHARES; do
+ for _j; do
+ if [ $_n -ne "$_j" ]; then
continue
fi
echo "$_out"
}
-_ethtool_setup ()
+_ethtool_setup()
{
FAKE_ETHTOOL_LINK_DOWN="${FAKE_NETWORK_STATE}/ethtool-link-down"
export FAKE_ETHTOOL_LINK_DOWN
mkdir -p "$FAKE_ETHTOOL_LINK_DOWN"
}
-ethtool_interfaces_down ()
+ethtool_interfaces_down()
{
_ethtool_setup
- for _i ; do
+ for _i; do
echo "Marking interface $_i DOWN for ethtool"
touch "${FAKE_ETHTOOL_LINK_DOWN}/${_i}"
done
}
-ethtool_interfaces_up ()
+ethtool_interfaces_up()
{
_ethtool_setup
- for _i ; do
+ for _i; do
echo "Marking interface $_i UP for ethtool"
rm -f "${FAKE_ETHTOOL_LINK_DOWN}/${_i}"
done
}
-dump_routes ()
+dump_routes()
{
- echo "# ip rule show"
- ip rule show
-
- ip rule show |
- while read _p _x _i _x _t ; do
- # Remove trailing colon after priority/preference.
- _p="${_p%:}"
- # Only remove rules that match our priority/preference.
- [ "$CTDB_PER_IP_ROUTING_RULE_PREF" = "$_p" ] || continue
-
- echo "# ip route show table $_t"
- ip route show table "$_t"
- done
+ echo "# ip rule show"
+ ip rule show
+
+ ip rule show |
+ while read _p _x _i _x _t; do
+ # Remove trailing colon after priority/preference.
+ _p="${_p%:}"
+ # Only remove rules that match our priority/preference.
+ [ "$CTDB_PER_IP_ROUTING_RULE_PREF" = "$_p" ] || continue
+
+ echo "# ip route show table $_t"
+ ip route show table "$_t"
+ done
}
# Copied from 13.per_ip_routing for now... so this is lazy testing :-(
-ipv4_host_addr_to_net ()
+ipv4_host_addr_to_net()
{
- _host="$1"
- _maskbits="$2"
-
- # Convert the host address to an unsigned long by splitting out
- # the octets and doing the math.
- _host_ul=0
- for _o in $(export IFS="." ; echo $_host) ; do
- _host_ul=$(( ($_host_ul << 8) + $_o)) # work around Emacs color bug
- done
-
- # Calculate the mask and apply it.
- _mask_ul=$(( 0xffffffff << (32 - $_maskbits) ))
- _net_ul=$(( $_host_ul & $_mask_ul ))
-
- # Now convert to a network address one byte at a time.
- _net=""
- for _o in $(seq 1 4) ; do
- _net="$(($_net_ul & 255))${_net:+.}${_net}"
- _net_ul=$(($_net_ul >> 8))
- done
-
- echo "${_net}/${_maskbits}"
+ _host="$1"
+ _maskbits="$2"
+
+ # Convert the host address to an unsigned long by splitting out
+ # the octets and doing the math.
+ _host_ul=0
+ for _o in $(
+ export IFS="."
+ echo $_host
+ ); do
+ _host_ul=$((($_host_ul << 8) + $_o)) # work around Emacs color bug
+ done
+
+ # Calculate the mask and apply it.
+ _mask_ul=$((0xffffffff << (32 - $_maskbits)))
+ _net_ul=$(($_host_ul & $_mask_ul))
+
+ # Now convert to a network address one byte at a time.
+ _net=""
+ for _o in $(seq 1 4); do
+ _net="$(($_net_ul & 255))${_net:+.}${_net}"
+ _net_ul=$(($_net_ul >> 8))
+ done
+
+ echo "${_net}/${_maskbits}"
}
######################################################################
# CTDB fakery
-setup_numnodes ()
+setup_numnodes()
{
export FAKE_CTDB_NUMNODES="${1:-3}"
echo "Setting up CTDB with ${FAKE_CTDB_NUMNODES} fake nodes"
# For now this creates the same public addresses each time. However,
# it could be made more flexible.
-setup_public_addresses ()
+setup_public_addresses()
{
_f="${CTDB_BASE}/public_addresses"
10.0.1.3/24 dev456
EOF
- # Needed for IP allocation
- setup_numnodes
+ # Needed for IP allocation
+ setup_numnodes
}
# 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 ()
+ctdb_set_pnn()
{
- export FAKE_CTDB_PNN="$1"
- echo "Setting up PNN ${FAKE_CTDB_PNN}"
+ export FAKE_CTDB_PNN="$1"
+ echo "Setting up PNN ${FAKE_CTDB_PNN}"
- CTDB_SCRIPT_VARDIR="${CTDB_TEST_TMP_DIR}/scripts/${FAKE_CTDB_PNN}"
- export CTDB_SCRIPT_VARDIR
- mkdir -p "$CTDB_SCRIPT_VARDIR"
+ CTDB_SCRIPT_VARDIR="${CTDB_TEST_TMP_DIR}/scripts/${FAKE_CTDB_PNN}"
+ export CTDB_SCRIPT_VARDIR
+ mkdir -p "$CTDB_SCRIPT_VARDIR"
}
-ctdb_get_interfaces ()
+ctdb_get_interfaces()
{
- # The echo/subshell forces all the output onto 1 line.
- echo $(ctdb ifaces -X | awk -F'|' 'FNR > 1 {print $2}')
+ # The echo/subshell forces all the output onto 1 line.
+ echo $(ctdb ifaces -X | awk -F'|' 'FNR > 1 {print $2}')
}
-ctdb_get_1_interface ()
+ctdb_get_1_interface()
{
- _t=$(ctdb_get_interfaces)
- echo ${_t%% *}
+ _t=$(ctdb_get_interfaces)
+ echo ${_t%% *}
}
# Print public addresses on this node as: interface IP maskbits
# Each line is suitable for passing to takeip/releaseip
-ctdb_get_my_public_addresses ()
+ctdb_get_my_public_addresses()
{
- ctdb ip -v -X | {
- read _x # skip header line
-
- while IFS="|" read _x _ip _x _iface _x ; do
- [ -n "$_iface" ] || continue
- while IFS="/$IFS" read _i _maskbits _x ; do
- if [ "$_ip" = "$_i" ] ; then
- echo $_iface $_ip $_maskbits
- break
- fi
- done <"${CTDB_BASE}/public_addresses"
- done
- }
+ ctdb ip -v -X | {
+ read _x # skip header line
+
+ while IFS="|" read _x _ip _x _iface _x; do
+ [ -n "$_iface" ] || continue
+ while IFS="/$IFS" read _i _maskbits _x; do
+ if [ "$_ip" = "$_i" ]; then
+ echo $_iface $_ip $_maskbits
+ break
+ fi
+ done <"${CTDB_BASE}/public_addresses"
+ done
+ }
}
# Prints the 1st public address as: interface IP maskbits
# This is suitable for passing to takeip/releaseip
-ctdb_get_1_public_address ()
+ctdb_get_1_public_address()
{
- ctdb_get_my_public_addresses | { head -n 1 ; cat >/dev/null ; }
+ ctdb_get_my_public_addresses | {
+ head -n 1
+ cat >/dev/null
+ }
}
# Check the routes against those that are expected. $1 is the number
# of assigned IPs to use (<num>, all), defaulting to 1. If $2 is
# "default" then expect default routes to have been added.
-check_routes ()
+check_routes()
{
- _num_ips="${1:-1}"
- _should_add_default="$2"
-
- _policy_rules=""
- _policy_routes=""
-
- ctdb_get_my_public_addresses |
- if [ "$_num_ips" = "all" ] ; then
- cat
- else
- { head -n "$_num_ips" ; cat >/dev/null ; }
- fi | {
- while read _dev _ip _bits ; do
- _net=$(ipv4_host_addr_to_net "$_ip" "$_bits")
- _gw="${_net%.*}.254" # a dumb, calculated default
-
- _policy_rules="${_policy_rules}
+ _num_ips="${1:-1}"
+ _should_add_default="$2"
+
+ _policy_rules=""
+ _policy_routes=""
+
+ ctdb_get_my_public_addresses |
+ if [ "$_num_ips" = "all" ]; then
+ cat
+ else
+ {
+ head -n "$_num_ips"
+ cat >/dev/null
+ }
+ fi | {
+ while read _dev _ip _bits; do
+ _net=$(ipv4_host_addr_to_net "$_ip" "$_bits")
+ _gw="${_net%.*}.254" # a dumb, calculated default
+
+ _policy_rules="${_policy_rules}
${CTDB_PER_IP_ROUTING_RULE_PREF}: from $_ip lookup ctdb.$_ip "
- _policy_routes="${_policy_routes}
+ _policy_routes="${_policy_routes}
# ip route show table ctdb.$_ip
$_net dev $_dev scope link "
- if [ "$_should_add_default" = "default" ] ; then
- _policy_routes="${_policy_routes}
+ if [ "$_should_add_default" = "default" ]; then
+ _policy_routes="${_policy_routes}
default via $_gw dev $_dev "
- fi
- done
+ fi
+ done
- ok <<EOF
+ ok <<EOF
# ip rule show
0: from all lookup local ${_policy_rules}
32766: from all lookup main
32767: from all lookup default ${_policy_routes}
EOF
- simple_test_command dump_routes
- } || test_fail
+ simple_test_command dump_routes
+ } || test_fail
}
######################################################################
-
-nfs_load_config ()
+nfs_load_config()
{
- _etc="$CTDB_SYS_ETCDIR" # shortcut for readability
- for _c in "$_etc/sysconfig/nfs" "$_etc/default/nfs" "$_etc/ctdb/sysconfig/nfs" ; do
- if [ -r "$_c" ] ; then
- . "$_c"
- break
- fi
- done
+ _etc="$CTDB_SYS_ETCDIR" # shortcut for readability
+ for _c in "$_etc/sysconfig/nfs" "$_etc/default/nfs" "$_etc/ctdb/sysconfig/nfs"; do
+ if [ -r "$_c" ]; then
+ . "$_c"
+ break
+ fi
+ done
}
setup_nfs_callout()
export NFS_FAKE_CALLOUT_MAGIC="$1"
}
-program_stack_trace ()
+program_stack_trace()
{
_prog="$1"
_pid="$2"
# Result and test functions
-
############################################################
-setup ()
+setup()
{
die "setup() is not defined"
}
# Set some globals and print the summary.
-define_test ()
+define_test()
{
desc="$1"
# Symlink target needs to be absolute
case "$CTDB_SCRIPTS_DATA_DIR" in
/*) _data_dir="${CTDB_SCRIPTS_DATA_DIR}/${_subdir}" ;;
- *) _data_dir="${PWD}/${CTDB_SCRIPTS_DATA_DIR}/${_subdir}"
+ *) _data_dir="${PWD}/${CTDB_SCRIPTS_DATA_DIR}/${_subdir}" ;;
esac
mkdir -p "$script_dir"
ln -s "${_data_dir}/${script}" "$script_dir"
script="$_f"
unset event
script_dir="${CTDB_BASE}"
+ ;;
esac
_s="${script_dir}/${script}"
- [ -r "$_s" ] || \
+ [ -r "$_s" ] ||
die "Internal error - unable to find script \"${_s}\""
case "$script" in
esac
printf "%-17s %-10s %-4s - %s\n\n" \
- "$script_short" "$event" "$_num" "$desc"
+ "$script_short" "$event" "$_num" "$desc"
_f="${CTDB_TEST_SUITE_DIR}/scripts/${script_short}.sh"
- if [ -r "$_f" ] ; then
+ if [ -r "$_f" ]; then
. "$_f"
fi
# Any args are passed to the eventscript.
-simple_test ()
+simple_test()
{
- [ -n "$event" ] || die 'simple_test: $event not set'
+ [ -n "$event" ] || die 'simple_test: $event not set'
- args="$@"
+ args="$@"
- test_header ()
- {
- echo "Running script \"$script $event${args:+ }$args\""
- }
+ test_header()
+ {
+ echo "Running script \"$script $event${args:+ }$args\""
+ }
- extra_header ()
- {
- cat <<EOF
+ extra_header()
+ {
+ cat <<EOF
##################################################
CTDB_BASE="$CTDB_BASE"
ctdb client is "$(which ctdb)"
ip command is "$(which ip)"
EOF
- }
+ }
- script_test "${script_dir}/${script}" "$event" "$@"
+ script_test "${script_dir}/${script}" "$event" "$@"
- reset_test_header
- reset_extra_header
+ reset_test_header
+ reset_extra_header
}
-simple_test_event ()
+simple_test_event()
{
- # If something has previously failed then don't continue.
- : ${_passed:=true}
- $_passed || return 1
-
- event="$1" ; shift
- echo "=================================================="
- simple_test "$@"
+ # If something has previously failed then don't continue.
+ : ${_passed:=true}
+ $_passed || return 1
+
+ event="$1"
+ shift
+ echo "=================================================="
+ simple_test "$@"
}
-simple_test_command ()
+simple_test_command()
{
- unit_test_notrace "$@"
+ unit_test_notrace "$@"
}
-setup ()
+setup()
{
ctdb_set_pnn
setup_public_addresses
setup_date "123456789"
}
-ctdb_catdb_format_pairs ()
+ctdb_catdb_format_pairs()
{
_count=0
- while read _k _v ; do
+ while read _k _v; do
_kn=$(echo -n "$_k" | wc -c)
_vn=$(echo -n "$_v" | wc -c)
cat <<EOF
echo "Dumped ${_count} records"
}
-check_ctdb_tdb_statd_state ()
+check_ctdb_tdb_statd_state()
{
ctdb_get_my_public_addresses |
- while read _x _sip _x ; do
- for _cip ; do
+ while read _x _sip _x; do
+ for _cip; do
cat <<EOF
statd-state@${_sip}@${_cip} $(date)
EOF
} || exit $?
}
-check_statd_callout_smnotify ()
+check_statd_callout_smnotify()
{
_state_even=$(( $(date '+%s') / 2 * 2))
_state_odd=$(($_state_even + 1))
nfs_load_config
ctdb_get_my_public_addresses |
- while read _x _sip _x ; do
- for _cip ; do
+ while read _x _sip _x; do
+ for _cip; do
cat <<EOF
SM_NOTIFY: ${_sip} -> ${_cip}, MON_NAME=${_sip}, STATE=${_state_even}
SM_NOTIFY: ${_sip} -> ${_cip}, MON_NAME=${NFS_HOSTNAME}, STATE=${_state_even}