mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 10:14:19 +01:00
2f6f08ed88
Changed info->s -> share to get more efficent code Updated arguments to page accessor functions to use MARIA_SHARE * instead of MARIA_HA *. Tested running tests in quick mode (no balance page on insert and only when critical on delete) Fixed bug in underflow handling in quick mode Fixed bug in log handler where it accessed not initialized variable Fixed bug in log handler where it didn't free mutex in unlikely error condition Removed double write of page in case of of some underflow conditions Added DBUG_PRINT in safemutex lock/unlock dbug/dbug.c: Compile without SAFE_MUTEX (to be able to use DBUG_PRINT in safe_mutex code) Use calls to get/set my_thread_var->dbug. (Make dbug independent of compile time options for mysys) include/my_pthread.h: Added prototypes for my_thread_var_get_dbug() & my_thread_var_set_dbug() mysql-test/lib/mtr_report.pl: Don't check warnings in log files if we are using --extern mysys/my_thr_init.c: Added my_thread_var_get_dbug() & my_thread_var_set_dbug() mysys/thr_mutex.c: Added DBUG printing of addresses to mutex for lock/unlock storage/maria/ma_blockrec.c: Fixed comment storage/maria/ma_check.c: Added MARIA_SHARE *share to a lot of places to make code simpler info->s -> share Updated arguments to page accessor functions storage/maria/ma_close.c: Indentation fixes storage/maria/ma_create.c: Calculate min_key_length correctly storage/maria/ma_dbug.c: Indentation fixes storage/maria/ma_delete.c: Added MARIA_SHARE *share to a lot of places to make code simpler info->s -> share Updated arguments to page accessor functions Removed some writing of key pages that underflow (will be written by caller) Fixed crashing bug in underflow handling when using quick mode storage/maria/ma_delete_all.c: Indentation fixes storage/maria/ma_dynrec.c: Indentation fixes storage/maria/ma_extra.c: Fixed indentation Removed old useless code Reset share->changed if we have written state storage/maria/ma_ft_update.c: Added MARIA_SHARE *share to a lot of places to make code simpler info->s -> share Updated arguments to page accessor functions storage/maria/ma_info.c: Indentation fixes storage/maria/ma_key_recover.c: Added MARIA_SHARE *share to a lot of places to make code simpler info->s -> share Updated arguments to page accessor functions storage/maria/ma_locking.c: Indentation fixes storage/maria/ma_loghandler.c: Removed wrapper functions translog_mutex_lock and translog_mutex_unlock (safemutex now does same kind of printing) Renamed LOGREC_REDO_INSERT_ROW_BLOB to LOGREC_REDO_INSERT_NOT_USED to mark it free Fixed some DBUG_PRINT to ensure that convert-dbug-for-diff works Fixed bug in translog_flush() that caused log to stop syncing to disk Added missing mutex_unlock in case of error storage/maria/ma_loghandler.h: Renamed LOGREC_REDO_INSERT_ROW_BLOB to LOGREC_REDO_INSERT_NOT_USED to mark it free storage/maria/ma_open.c: Indentation fixes storage/maria/ma_packrec.c: Indentation fixes storage/maria/ma_page.c: Added MARIA_SHARE *share to a lot of places to make code simpler info->s -> share Updated arguments to page accessor functions Added check that we never write a key page without content (except in recovery where a key page may temporary be without content) storage/maria/ma_preload.c: Updated arguments to page accessor functions storage/maria/ma_range.c: Updated arguments to page accessor functions storage/maria/ma_rkey.c: Indentation fixes storage/maria/ma_rprev.c: Indentation fixes storage/maria/ma_rt_index.c: Added MARIA_SHARE *share to a lot of places to make code simpler info->s -> share Updated arguments to page accessor functions storage/maria/ma_rt_index.h: Updated arguments to page accessor functions storage/maria/ma_rt_key.c: Added MARIA_SHARE *share to a lot of places to make code simpler info->s -> share Updated arguments to page accessor functions storage/maria/ma_rt_mbr.c: Added MARIA_SHARE *share to a lot of places to make code simpler info->s -> share Updated arguments to page accessor functions storage/maria/ma_rt_split.c: Added MARIA_SHARE *share to a lot of places to make code simpler info->s -> share Updated arguments to page accessor functions storage/maria/ma_search.c: Added MARIA_SHARE *share to a lot of places to make code simpler info->s -> share Updated arguments to page accessor functions storage/maria/ma_sort.c: Indentation fixes storage/maria/ma_statrec.c: Indentation fixes storage/maria/ma_test1.c: Added extra undo test Flush also keys in -u1, to ensure that the full log is flushed storage/maria/ma_test2.c: Added extra undo test Flush also keys in -u1, to ensure that the full log is flushed storage/maria/ma_test_recovery.expected: Updated results storage/maria/ma_test_recovery: Added extra undo test storage/maria/ma_update.c: Indentation fixes storage/maria/ma_write.c: Added MARIA_SHARE *share to a lot of places to make code simpler info->s -> share Updated arguments to page accessor functions Prepare for quick mode for insert (don't balance page) storage/maria/maria_chk.c: Added MARIA_SHARE *share to a lot of places to make code simpler info->s -> share Updated arguments to page accessor functions storage/maria/maria_def.h: Updated arguments to page accessor functions
203 lines
6.8 KiB
Bash
Executable file
203 lines
6.8 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
#set -x -v
|
|
set -e
|
|
silent="-s"
|
|
if [ -z "$maria_path" ]
|
|
then
|
|
maria_path="."
|
|
fi
|
|
|
|
# test data is always put in the current directory or a tmp subdirectory of it
|
|
tmp="./tmp"
|
|
|
|
if test '!' -d $tmp
|
|
then
|
|
mkdir $tmp
|
|
fi
|
|
|
|
echo "MARIA RECOVERY TESTS"
|
|
|
|
check_table_is_same()
|
|
{
|
|
# Computes checksum of new table and compares to checksum of old table
|
|
# Shows any difference in table's state (info from the index's header)
|
|
|
|
$maria_path/maria_chk -dvv $table | grep -v "Creation time:" > $tmp/maria_chk_message.txt 2>&1
|
|
|
|
$maria_path/maria_chk -s -e --read-only $table
|
|
checksum2=`$maria_path/maria_chk -dss $table`
|
|
if test "$checksum" != "$checksum2"
|
|
then
|
|
echo "checksum differs for $table before and after recovery"
|
|
return 1;
|
|
fi
|
|
|
|
diff $tmp/maria_chk_message.good.txt $tmp/maria_chk_message.txt > $tmp/maria_chk_diff.txt || true
|
|
if [ -s $tmp/maria_chk_diff.txt ]
|
|
then
|
|
echo "Differences in maria_chk -dvv, recovery not yet perfect !"
|
|
echo "========DIFF START======="
|
|
cat $tmp/maria_chk_diff.txt
|
|
echo "========DIFF END======="
|
|
fi
|
|
}
|
|
|
|
apply_log()
|
|
{
|
|
# applies log, can verify if applying did write to log or not
|
|
|
|
shouldchangelog=$1
|
|
if [ "$shouldchangelog" != "shouldnotchangelog" ] &&
|
|
[ "$shouldchangelog" != "shouldchangelog" ] &&
|
|
[ "$shouldchangelog" != "dontknow" ]
|
|
then
|
|
echo "bad argument '$shouldchangelog'"
|
|
return 1
|
|
fi
|
|
log_md5=`md5sum maria_log.*`
|
|
echo "applying log"
|
|
$maria_path/maria_read_log -a > $tmp/maria_read_log_$table.txt
|
|
log_md5_2=`md5sum maria_log.*`
|
|
if [ "$log_md5" != "$log_md5_2" ]
|
|
then
|
|
if [ "$shouldchangelog" == "shouldnotchangelog" ]
|
|
then
|
|
echo "maria_read_log should not have modified the log"
|
|
return 1
|
|
fi
|
|
else
|
|
if [ "$shouldchangelog" == "shouldchangelog" ]
|
|
then
|
|
echo "maria_read_log should have modified the log"
|
|
return 1
|
|
fi
|
|
fi
|
|
}
|
|
|
|
# To not flood the screen, we redirect all the commands below to a text file
|
|
# and just give a final error if their output is not as expected
|
|
|
|
(
|
|
|
|
echo "Testing the REDO PHASE ALONE"
|
|
# runs a program inserting/deleting rows, then moves the resulting table
|
|
# elsewhere; applies the log and checks that the data file is
|
|
# identical to the saved original.
|
|
# Does not test the index file as we don't have logging for it yet.
|
|
|
|
set -- "ma_test1 $silent -M -T -c" "ma_test2 $silent -L -K -W -P -M -T -c" "ma_test2 $silent -M -T -c -b65000"
|
|
while [ $# != 0 ]
|
|
do
|
|
prog=$1
|
|
rm -f maria_log.* maria_log_control
|
|
echo "TEST WITH $prog"
|
|
$maria_path/$prog
|
|
# derive table's name from program's name
|
|
table=`echo $prog | sed -e 's;.*ma_\(test[0-9]\).*;\1;' `
|
|
$maria_path/maria_chk -dvv $table | grep -v "Creation time:"> $tmp/maria_chk_message.good.txt 2>&1
|
|
checksum=`$maria_path/maria_chk -dss $table`
|
|
mv $table.MAD $tmp/$table-good.MAD
|
|
mv $table.MAI $tmp/$table-good.MAI
|
|
apply_log "shouldnotchangelog"
|
|
cmp $table.MAD $tmp/$table-good.MAD
|
|
cmp $table.MAI $tmp/$table-good.MAI
|
|
check_table_is_same
|
|
echo "testing idempotency"
|
|
apply_log "shouldnotchangelog"
|
|
cmp $table.MAD $tmp/$table-good.MAD
|
|
cmp $table.MAI $tmp/$table-good.MAI
|
|
check_table_is_same
|
|
shift
|
|
done
|
|
|
|
echo "Testing the REDO AND UNDO PHASE"
|
|
# The test programs look like:
|
|
# work; commit (time T1); work; exit-without-commit (time T2)
|
|
# We first run the test program and let it exit after T1's commit.
|
|
# Then we run it again and let it exit at T2. Then we compare
|
|
# and expect identity.
|
|
|
|
for take_checkpoint in "no" "yes"
|
|
do
|
|
for blobs in "" "-b" # we test table without blobs and then table with blobs
|
|
do
|
|
for test_undo in 1 2 3 4
|
|
do
|
|
# first iteration tests rollback of insert, second tests rollback of delete
|
|
set -- "ma_test1 $silent -M -T -c -N $blobs -H1" "--testflag=1" "--testflag=2 --test-undo=" "ma_test1 $silent -M -T -c -N $blobs -H2" "--testflag=3" "--testflag=4 --test-undo=" "ma_test1 $silent -M -T -c -N $blobs -H2 " "--testflag=2" "--testflag=3 --test-undo=" "ma_test2 $silent -L -K -W -P -M -T -c $blobs -H1" "-t1" "-t2 -u"
|
|
# -N (create NULL fields) is needed because --test-undo adds it anyway
|
|
while [ $# != 0 ]
|
|
do
|
|
prog=$1
|
|
if [ "$take_checkpoint" == "no" ]
|
|
then
|
|
prog=`echo $prog | sed 's/ -H[0-9]//'`
|
|
fi
|
|
commit_run_args=$2
|
|
abort_run_args=$3;
|
|
rm -f maria_log.* maria_log_control
|
|
echo "TEST WITH $prog $commit_run_args (commit at end)"
|
|
$maria_path/$prog $commit_run_args
|
|
# derive table's name from program's name
|
|
table=`echo $prog | sed -e 's;.*ma_\(test[0-9]\).*;\1;' `
|
|
$maria_path/maria_chk -dvv $table | grep -v "Creation time:"> $tmp/maria_chk_message.good.txt 2>&1
|
|
checksum=`$maria_path/maria_chk -dss $table`
|
|
mv $table.MAD $tmp/$table-good.MAD
|
|
mv $table.MAI $tmp/$table-good.MAI
|
|
rm maria_log.* maria_log_control
|
|
echo "TEST WITH $prog $abort_run_args$test_undo (additional aborted work)"
|
|
$maria_path/$prog $abort_run_args$test_undo
|
|
cp $table.MAD $tmp/$table.MAD.before_undo
|
|
|
|
# We have to copy and restore logs, as running maria_read_log will
|
|
# change the maria_control_file
|
|
rm -f $tmp/maria_log.* $tmp/maria_log_control
|
|
cp $maria_path/maria_log* $tmp
|
|
|
|
if [ "$test_undo" != "3" ]
|
|
then
|
|
apply_log "shouldchangelog" # should undo aborted work
|
|
else
|
|
# probably nothing to undo went to log or data file
|
|
apply_log "dontknow"
|
|
fi
|
|
cp $table.MAD $tmp/$table.MAD.after_undo
|
|
|
|
# It is impossible to do a "cmp" between .good and .after_undo,
|
|
# because the UNDO phase generated log
|
|
# records whose LSN tagged pages. Another reason is that rolling back
|
|
# INSERT only marks the rows free, does not empty them (optimization), so
|
|
# traces of the INSERT+rollback remain.
|
|
|
|
check_table_is_same
|
|
echo "testing idempotency"
|
|
apply_log "shouldnotchangelog"
|
|
cmp $table.MAD $tmp/$table.MAD.after_undo
|
|
check_table_is_same
|
|
echo "testing applying of CLRs to recreate table"
|
|
rm $table.MA?
|
|
cp $tmp/maria_log* $maria_path
|
|
apply_log "dontknow"
|
|
cmp $table.MAD $tmp/$table.MAD.after_undo
|
|
check_table_is_same
|
|
shift 3
|
|
done
|
|
rm -f $table.* $tmp/$table* $tmp/maria_chk_*.txt $tmp/maria_read_log_$table.txt
|
|
done
|
|
done
|
|
done
|
|
|
|
) 2>&1 > $tmp/ma_test_recovery.output
|
|
|
|
# also note that maria_chk -dvv shows differences for ma_test2 in UNDO phase,
|
|
# this is normal: removing records does not shrink the data/key file,
|
|
# does not put back the "analyzed,optimized keys"(etc) index state.
|
|
diff $maria_path/ma_test_recovery.expected $tmp/ma_test_recovery.output > /dev/null || diff_failed=1
|
|
if [ "$diff_failed" == "1" ]
|
|
then
|
|
echo "UNEXPECTED OUTPUT OF TESTS, FAILED"
|
|
echo "For more info, do diff $maria_path/ma_test_recovery.expected $tmp/ma_test_recovery.output"
|
|
exit 1
|
|
fi
|
|
echo "ALL RECOVERY TESTS OK"
|