#!/usr/bin/env bash

# Ensure recovery doesn't resurrect deleted records from recently
# inactive nodes

. "${TEST_SCRIPTS_DIR}/integration.bash"

set -e

ctdb_test_init

testdb="rec_test.tdb"

echo "Getting list of nodes..."
ctdb_get_all_pnns

first=$(echo "$all_pnns" | sed -n -e '1p')
second=$(echo "$all_pnns" | sed -n -e '2p')
notfirst=$(echo "$all_pnns" | tail -n +2)

echo "Create/wipe test database ${testdb}"
try_command_on_node $first $CTDB attach "$testdb"
try_command_on_node $first $CTDB wipedb "$testdb"

echo "store key(test1) data(value1)"
try_command_on_node $first $CTDB writekey "$testdb" test1 value1

echo "Migrate key(test1) to all nodes"
try_command_on_node all $CTDB readkey "$testdb" test1

echo "Stop node ${first}"
try_command_on_node $first $CTDB stop
wait_until_node_has_status $first stopped

echo "Delete key(test1)"
try_command_on_node $second $CTDB deletekey "$testdb" test1

database_has_zero_records ()
{
	# shellcheck disable=SC2086
	# $notfirst can be multi-word
	check_cattdb_num_records "$testdb" 0 "$notfirst"
}

echo "Trigger a recovery"
try_command_on_node "$second" $CTDB recover

echo "Checking that database has 0 records"
database_has_zero_records

echo "Continue node ${first}"
try_command_on_node $first $CTDB continue
wait_until_node_has_status $first notstopped

echo "Get database contents"
try_command_on_node -v $first $CTDB catdb "$testdb"

if grep -q '^key(' "$outfile" ; then
	echo "BAD: Deleted record has been resurrected"
	exit 1
fi

echo "GOOD: Deleted record is still gone"
