blob: da5ed05f10d18b682caead9ef8f3cc53cb9fa07a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
# 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
PATH="${ctdb_dir}/bin:${PATH}"
export CTDB_LOCK_HELPER="${ctdb_dir}/bin/ctdb_lock_helper"
export CTDB_EVENT_HELPER="${ctdb_dir}/bin/ctdb_event_helper"
fi
export CTDB_NODES="${TEST_VAR_DIR}/nodes.txt"
#######################################
daemons_stop ()
{
echo "Attempting to politely shutdown daemons..."
onnode 1 $CTDB shutdown -n all || true
echo "Sleeping for a while..."
sleep_for 1
local pat="ctdbd --socket=${TEST_VAR_DIR}/.* --nlist .* --nopublicipcheck"
if pgrep -f "$pat" >/dev/null ; then
echo "Killing remaining daemons..."
pkill -f "$pat"
if pgrep -f "$pat" >/dev/null ; then
echo "Once more with feeling.."
pkill -9 -f "$pat"
fi
fi
rm -rf "${TEST_VAR_DIR}/test.db"
}
setup_ctdb ()
{
mkdir -p "${TEST_VAR_DIR}/test.db/persistent"
local public_addresses_all="${TEST_VAR_DIR}/public_addresses_all"
local no_public_addresses="${TEST_VAR_DIR}/no_public_addresses.txt"
rm -f $CTDB_NODES $public_addresses_all $no_public_addresses
# If there are (strictly) greater than 2 nodes then we'll randomly
# choose a node to have no public addresses.
local no_public_ips=-1
[ $TEST_LOCAL_DAEMONS -gt 2 ] && no_public_ips=$(($RANDOM % $TEST_LOCAL_DAEMONS))
echo "$no_public_ips" >$no_public_addresses
# When running certain tests we add and remove eventscripts, so we
# need to be able to modify the events.d/ directory. Therefore,
# we use a temporary events.d/ directory under $TEST_VAR_DIR. We
# copy the actual test eventscript(s) in there from the original
# events.d/ directory that sits alongside $TEST_SCRIPT_DIR.
local top=$(dirname "$TEST_SCRIPTS_DIR")
local events_d="${top}/events.d"
mkdir -p "${TEST_VAR_DIR}/events.d"
cp -p "${events_d}/"* "${TEST_VAR_DIR}/events.d/"
local i
for i in $(seq 1 $TEST_LOCAL_DAEMONS) ; do
if [ "${CTDB_USE_IPV6}x" != "x" ]; then
echo ::$i >>"$CTDB_NODES"
ip addr add ::$i/128 dev lo
else
echo 127.0.0.$i >>"$CTDB_NODES"
# 2 public addresses on most nodes, just to make things interesting.
if [ $(($i - 1)) -ne $no_public_ips ] ; then
echo "192.168.234.$i/24 lo" >>"$public_addresses_all"
echo "192.168.234.$(($i + $TEST_LOCAL_DAEMONS))/24 lo" >>"$public_addresses_all"
fi
fi
done
}
daemons_start_1 ()
{
local pnn="$1"
shift # "$@" gets passed to ctdbd
local public_addresses_all="${TEST_VAR_DIR}/public_addresses_all"
local public_addresses_mine="${TEST_VAR_DIR}/public_addresses.${pnn}"
local no_public_addresses="${TEST_VAR_DIR}/no_public_addresses.txt"
local no_public_ips=-1
[ -r $no_public_addresses ] && read no_public_ips <$no_public_addresses
if [ "$no_public_ips" = $pnn ] ; then
echo "Node $no_public_ips will have no public IPs."
fi
local node_ip=$(sed -n -e "$(($pnn + 1))p" "$CTDB_NODES")
local ctdb_options="--sloppy-start --reclock=${TEST_VAR_DIR}/rec.lock --nlist $CTDB_NODES --nopublicipcheck --listen=${node_ip} --event-script-dir=${TEST_VAR_DIR}/events.d --logfile=${TEST_VAR_DIR}/daemon.${pnn}.log -d 3 --log-ringbuf-size=10000 --dbdir=${TEST_VAR_DIR}/test.db --dbdir-persistent=${TEST_VAR_DIR}/test.db/persistent --dbdir-state=${TEST_VAR_DIR}/test.db/state"
if [ $pnn -eq $no_public_ips ] ; then
ctdb_options="$ctdb_options --public-addresses=/dev/null"
else
cp "$public_addresses_all" "$public_addresses_mine"
ctdb_options="$ctdb_options --public-addresses=$public_addresses_mine"
fi
# We'll use "pkill -f" to kill the daemons with
# "--socket=.* --nlist .* --nopublicipcheck" as context.
$VALGRIND ctdbd --socket="${TEST_VAR_DIR}/sock.$pnn" $ctdb_options "$@" ||return 1
}
daemons_start ()
{
# "$@" gets passed to ctdbd
echo "Starting $TEST_LOCAL_DAEMONS ctdb daemons..."
for i in $(seq 0 $(($TEST_LOCAL_DAEMONS - 1))) ; do
daemons_start_1 $i "$@"
done
}
maybe_stop_ctdb ()
{
if $TEST_CLEANUP ; then
daemons_stop
fi
}
_restart_ctdb_all ()
{
daemons_stop
daemons_start "$@"
}
|