offsetof(struct ctdb_tunable_list, deferred_attach_timeout) },
{ "AllowClientDBAttach", 1, false,
offsetof(struct ctdb_tunable_list, allow_client_db_attach) },
- { "RecoverPDBBySeqNum", 1, false,
+ { "RecoverPDBBySeqNum", 1, true,
offsetof(struct ctdb_tunable_list, recover_pdb_by_seqnum) },
{ "DeferredRebalanceOnNodeAdd", 300, true,
offsetof(struct ctdb_tunable_list, deferred_rebalance_on_node_add) },
</para>
</refsect2>
- <refsect2>
- <title>RecoverPDBBySeqNum</title>
- <para>Default: 1</para>
- <para>
- When set to zero, database recovery for persistent databases is
- record-by-record and recovery process simply collects the most
- recent version of every individual record.
- </para>
- <para>
- When set to non-zero, persistent databases will instead be
- recovered as a whole db and not by individual records. The
- node that contains the highest value stored in the record
- "__db_sequence_number__" is selected and the copy of that nodes
- database is used as the recovered database.
- </para>
- <para>
- By default, recovery of persistent databses is done using
- __db_sequence_number__ record.
- </para>
- </refsect2>
-
<refsect2>
<title>RecoverTimeout</title>
<para>Default: 120</para>
test_info()
{
cat <<EOF
-The tunable RecoverPDBBySeqNum controls how we perform recovery
-on persistent databases.
-The default is that persistent databases are recovered exactly the same
-way as normal databases. That is that we recover record by record.
-
-If RecoverPDBBySeqNum is set to 1 AND if a record with the key
-"__db_sequence_number__" can be found in the database, then instead we will
-perform the recovery by picking the copy of the database from the node
-that has the highest sequence number and ignore the content on all other
-nodes.
+The persistent databases are recovered using sequence number.
+The recovery is performed by picking the copy of the database from the
+node that has the highest sequence number and ignore the content on all
+other nodes.
Prerequisites:
1. Verify that the status on all of the ctdb nodes is 'OK'.
2. create a persistent test database
-3. test that RecoveryPDBBySeqNum==0 and no seqnum record blends the database
- during recovery
-4. test that RecoveryPDBBySeqNum==0 and seqnum record blends the database
- during recovery
-5. test that RecoveryPDBBySeqNum==1 and no seqnum record blends the database
- during recovery
-6. test that RecoveryPDBBySeqNum==1 and seqnum record does not blend the database
- during recovery
+3. test that no seqnum record blends the database during recovery
+4. test that seqnum record does not blend the database during recovery
Expected results:
-* that 3,4,5 will blend the databases and that 6 will recovery the highest seqnum
- database
+* that 3,4 will recover the highest seqnum database
EOF
}
echo "Create persistent test database \"$test_db\""
try_command_on_node 0 $CTDB attach "$test_db" persistent
-
-echo "Setting RecoverPDBBySeqNum=0"
-try_command_on_node all $CTDB setvar "RecoverPDBBySeqNum" 0
-
-# 3.
-# If RecoverPDBBySeqNum==0 and no __db_sequence_number__
-# recover record by record
+# 3,
+# If no __db_sequence_number__ recover whole database
#
-# wipe database
-echo
-echo "Test that RecoverPDBBySeqNum=0 and no __db_sequence_number__ blends the database during recovery"
-
-echo "Wipe test database"
-try_command_on_node 0 $CTDB wipedb "$test_db"
-
-add_record_per_node
-
-# force a recovery
-echo "Force a recovery"
-try_command_on_node 0 $CTDB recover
-
-# check that we now have both records on node 0
-num_records=$(db_ctdb_cattdb_count_records 0 "$test_db")
-if [ $num_records = "$num_nodes" ] ; then
- echo "OK: databases were blended"
-else
- echo "BAD: we did not end up with the expected $num_nodes records after the recovery"
- exit 1
-fi
-
-# 4.
-# If RecoverPDBBySeqNum==0 and __db_sequence_number__
-# recover record by record
-#
-# wipe database
-echo
-echo "Test that RecoverPDBBySeqNum=0 and __db_sequence_number__ blends the database during recovery"
-
-echo "Wipe the test database"
-try_command_on_node 0 $CTDB wipedb persistent_test.tdb
-
-add_record_per_node
-
-echo "Add __db_sequence_number__==5 record to all nodes"
-pnn=0
-while [ $pnn -lt $num_nodes ] ; do
- db_ctdb_tstore_dbseqnum $pnn "$test_db" 5
- pnn=$(($pnn + 1))
-done
-
-echo "Set __db_sequence_number__ to 7 on node 0"
-db_ctdb_tstore_dbseqnum 0 "$test_db" 7
-echo "Set __db_sequence_number__ to 8 on node 1"
-db_ctdb_tstore_dbseqnum 1 "$test_db" 8
-
-# force a recovery
-echo "Force a recovery"
-try_command_on_node 0 $CTDB recover
-
-# check that we now have both records on node 0
-num_records=$(db_ctdb_cattdb_count_records 0 "$test_db")
-if [ $num_records = "$num_nodes" ] ; then
- echo "OK: databases were blended"
-else
- echo "BAD: we did not end up with the expected $num_nodes records after the recovery"
- try_command_on_node -v 0 $CTDB cattdb "$test_db"
- exit 1
-fi
-
-
-# set RecoverPDBBySeqNum=1
echo
-echo "Setting RecoverPDBBySeqNum to 1"
-try_command_on_node all $CTDB setvar "RecoverPDBBySeqNum" 1
-
+echo "Test that no __db_sequence_number__ does not blend the database during recovery"
-# 5,
-# If RecoverPDBBySeqNum==1 and no __db_sequence_number__
-# recover whole database
-#
# wipe database
-echo
-echo "Test that RecoverPDBBySeqNum=1 and no __db_sequence_number__ does not blend the database during recovery"
echo "Wipe the test database"
try_command_on_node 0 $CTDB wipedb "$test_db"
fi
-
-# 6,
-# If RecoverPDBBySeqNum==1 and __db_sequence_number__
-# recover whole database
+# 4,
+# If __db_sequence_number__ recover whole database
#
-# wipe database
+
echo
-echo test that RecoverPDBBySeqNum==1 and __db_sequence_number__ does not blend the database during recovery
+echo test that __db_sequence_number__ does not blend the database during recovery
+
+# wipe database
echo wipe the test database
try_command_on_node 0 $CTDB wipedb persistent_test.tdb
test_info()
{
cat <<EOF
-The recovery process based on RSN for persistent databases is defective.
-For persistent databases sequence number based recovery method should be
-used. This test checks for the defect in the RSN based recovery method
-for persistent databases and confirms that the same issue is not observed
-when using sequence number based recovery method.
+This test confirms that the deleted records are not resurrected after recovery.
Steps:
Expected results:
-* Check that the record is deleted (RSN based recovery) and record is
- present (sequence number based recovery)
+* Check that the deleted record is present after recovery.
EOF
}
echo "create persistent test database $TESTDB"
try_command_on_node 0 $CTDB attach $TESTDB persistent
-echo "set RecoverPDBBySeqNum to 0"
-try_command_on_node all $CTDB setvar RecoverPDBBySeqNum 0
-
-do_test
-if try_command_on_node 0 $CTDB pfetch $TESTDB test1 ; then
- echo "GOOD: Record was not deleted (recovery by RSN worked)"
-else
- echo "BAD: Record was deleted"
- status=1
-fi
-
-# Set RecoverPDBBySeqNum = 1
-echo "set RecoverPDBBySeqNum to 1"
-try_command_on_node all $CTDB setvar RecoverPDBBySeqNum 1
-
do_test
if try_command_on_node 0 $CTDB pfetch $TESTDB test1 ; then
echo "GOOD: Record was not deleted (recovery by sequence number worked)"