summaryrefslogtreecommitdiffstats
path: root/ctdb/tests/INTEGRATION/database/vacuum.003.recreate.sh
blob: acb7b135e5577177993b3f15faa4bf53526804de (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
137
138
139
#!/usr/bin/env bash

# Ensure that vacuuming does not delete a record that is recreated
# before vacuuming completes.  This needs at least 3 nodes.

. "${TEST_SCRIPTS_DIR}/integration.bash"

set -e

ctdb_test_init

db="vacuum_test.tdb"

echo "Stall vacuuming on all nodes"
ctdb_onnode -p all "setvar VacuumInterval 99999"

echo
echo "Getting list of nodes..."
ctdb_get_all_pnns

# all_pnns is set above by ctdb_get_all_pnns()
# shellcheck disable=SC2154
first=$(echo "$all_pnns" | sed -n -e '1p')

echo
echo "Create/wipe test database ${db}"
ctdb_onnode "$first" "attach ${db}"
ctdb_onnode "$first" "wipedb ${db}"

echo
echo "Create a record in ${db}"
ctdb_onnode "$first" "writekey ${db} key value1"

echo
echo "Migrate record to all nodes"
ctdb_onnode all "readkey ${db} key"

echo
echo "Confirm that all nodes have the record"
check_cattdb_num_records "$db" 1 "$all_pnns"

echo
echo "Determine lmaster node for key"
testprog_onnode "$first" "ctdb-db-test get-lmaster key"
# $out is set above by testprog_onnode()
# shellcheck disable=SC2154
lmaster="$out"
echo "lmaster=${lmaster}"

non_lmaster=""
# Find a non-lmaster node
for i in $all_pnns ; do
	if [ "$i" != "$lmaster" ] ; then
		non_lmaster="$i"
		break
	fi
done
if [ -z "$non_lmaster" ] ; then
	ctdb_test_fail "Could not find non-lmaster node for key"
fi

another_non_lmaster=""
# Find another non-lmaster node
for i in $all_pnns ; do
	if [ "$i" != "$lmaster" ] && [ "$i" != "$non_lmaster" ] ; then
		another_non_lmaster="$i"
		break
	fi
done
if [ -z "$another_non_lmaster" ] ; then
	ctdb_test_fail "Could not find another non-lmaster node for key"
fi

vacuum_test ()
{
	local db="$1"
	local key="$2"
	local val="$3"
	local dnode="$4"
	local rnode="$5"
	local rrun="$6"

	echo
	echo '............................................................'
	printf 'Delete key %s on node %d\n' "$key" "$dnode"
	printf 'Recreate on node %d after %d vacuuming run(s)\n' \
	       "$rnode" "$rrun"
	echo '............................................................'

	echo
	echo "Delete key \"${key}\" from node ${dnode}"
	ctdb_onnode "$dnode" "deletekey ${db} ${key}"

	if [ "$rrun" -eq 0 ] ; then
		echo "Recreate record on node ${rnode}"
		ctdb_onnode "$rnode" "writekey ${db} ${key} ${val}"
	fi

	echo "Do a fast vacuuming run on node ${dnode}"
	testprog_onnode "$dnode" "ctdb-db-test vacuum ${db}"

	if [ "$rrun" -eq 1 ] ; then
		echo "Recreate record on node ${rnode}"
		ctdb_onnode "$rnode" "writekey ${db} ${key} ${val}"
	fi

	echo "Do a fast vacuuming run on lmaster node ${lmaster}"
	testprog_onnode "$lmaster" "ctdb-db-test vacuum ${db}"

	if [ "$rrun" -eq 2 ] ; then
		echo "Recreate record on node ${rnode}"
		ctdb_onnode "$rnode" "writekey ${db} ${key} ${val}"
	fi

	echo "Do a fast vacuuming run on lmaster node ${lmaster}"
	testprog_onnode "$lmaster" "ctdb-db-test vacuum ${db}"

	echo
	echo "Confirm the record still exists on all nodes"
	check_cattdb_num_records "$db" 1 "$all_pnns"

	echo
	echo "Confirm the record contains correct value"
	db_confirm_key_has_value "$first" "$db" "$key" "$val"
}

vacuum_test "$db" "key" "value01" "$non_lmaster" "$non_lmaster" 0
vacuum_test "$db" "key" "value02" "$non_lmaster" "$another_non_lmaster" 0
vacuum_test "$db" "key" "value03" "$non_lmaster" "$lmaster" 0
vacuum_test "$db" "key" "value04" "$lmaster" "$non_lmaster" 0
vacuum_test "$db" "key" "value05" "$lmaster" "$lmaster" 0

vacuum_test "$db" "key" "value06" "$non_lmaster" "$non_lmaster" 1
vacuum_test "$db" "key" "value07" "$non_lmaster" "$lmaster" 1
vacuum_test "$db" "key" "value08" "$non_lmaster" "$another_non_lmaster" 1

vacuum_test "$db" "key" "value09" "$non_lmaster" "$non_lmaster" 2
vacuum_test "$db" "key" "value10" "$non_lmaster" "$lmaster" 2
vacuum_test "$db" "key" "value11" "$non_lmaster" "$another_non_lmaster" 2