mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
fix for bug: if a crash happened right after writing a REDO like this: REDO - UNDO - REDO*, then recovery would ignore the last REDO* (ok), rollback: REDO - UNDO - REDO* - REDO - CLR, and a next recovery would thus execute REDO* instead of skipping it again. Recovery now logs LOGREC_INCOMPLETE_GROUP when it meets REDO* for the first time, to draw a boundary and ensure it is always skipped. Tested by hand. Note: ma_test_all fails "maria_chk: error: Key 1 - Found too many records" not due to this patch (failed before). BitKeeper/triggers/post-commit: no truncation of the commit mail, or how to review patches? mysql-test/include/maria_verify_recovery.inc: let caller choose the statement used to crash (sometimes we want the crash to happen at special places) mysql-test/t/maria-recovery.test: user of maria_verify_recovery.inc now specifies statement which the script should use for crashing. storage/maria/ma_bitmap.c: it's easier to search for all places using functions from the bitmap module (like in ma_blockrec.c) if those exported functions all start with "_ma_bitmap": renaming some of them. Assertion that when we read a bitmap page, overwriting bitmap->map, we are not losing information (i.e. bitmap->changed is false). storage/maria/ma_blockrec.c: update to new names. Adding code (disabled, protected by a #ifdef) that I use to test certain crash scenarios (more to come). storage/maria/ma_blockrec.h: update to new names storage/maria/ma_checkpoint.c: update to new names storage/maria/ma_extra.c: update to new names storage/maria/ma_loghandler.c: new LOGREC_INCOMPLETE_GROUP storage/maria/ma_loghandler.h: new LOGREC_INCOMPLETE_GROUP storage/maria/ma_recovery.c: When at the end of the REDO phase we have identified some transactions with incomplete REDO groups (REDOs without an UNDO or CLR_END), for each of them we log LOGREC_INCOMPLETE_GROUP. This way, the upcoming UNDO phase can write more records for such transaction, a future recovery won't pair the incomplete group with the CLR_END (as there is LOGREC_INCOMPLETE_GROUP to draw a boundary).
129 lines
2.8 KiB
Bash
Executable File
129 lines
2.8 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
#shift
|
|
FROM=$USER@mysql.com
|
|
COMMITS=commits@lists.mysql.com
|
|
DOCS=docs-commit@mysql.com
|
|
LIMIT=10000
|
|
VERSION="maria"
|
|
BKROOT=`bk root`
|
|
|
|
if [ -x /usr/sbin/sendmail ]; then
|
|
SENDMAIL=/usr/sbin/sendmail
|
|
else
|
|
SENDMAIL=sendmail
|
|
fi
|
|
|
|
if [ "$REAL_EMAIL" = "" ]
|
|
then
|
|
echo "Warning: you must set REAL_EMAIL in your profile"
|
|
else
|
|
FROM=$REAL_EMAIL
|
|
fi
|
|
|
|
BK_STATUS=$BK_STATUS$BK_COMMIT
|
|
|
|
if [ "$BK_STATUS" = OK ]
|
|
then
|
|
|
|
HAS_ACTUAL_CHANGES=`bk cset -r+ -d | grep -v "^#"`
|
|
if [ "$HAS_ACTUAL_CHANGES" = "" ]
|
|
then
|
|
echo ChangeSet had no real changes, not sending emails
|
|
exit
|
|
fi
|
|
|
|
IS_MERGE=`bk changes -r+ -k -m`
|
|
if [ "$IS_MERGE" = "" ]
|
|
then
|
|
echo Merge changeset, not sending mails
|
|
exit
|
|
fi
|
|
|
|
CHANGESET=`bk -R prs -r+ -h -d':P:::I:' ChangeSet`
|
|
CSETKEY=`bk -R prs -r+ -h -d':KEY:' ChangeSet`
|
|
#
|
|
# composing subject lines of commit mails.
|
|
# if a fix targets to a WL and there is a bug referred
|
|
# then X-Bug mail header will contain the first found bug's number
|
|
#
|
|
BUG=`bk -R prs -r+ -h -d':C:' ChangeSet | \
|
|
sed -ne 's/[Bb][Uu][Gg] *# *\([0-9][0-9]*\).*$/BUG#\1/
|
|
s/.*BUG#\([0-9][0-9]*\)/\1/p'`
|
|
WL=`bk -R prs -r+ -h -d':C:' ChangeSet | \
|
|
sed -ne 's/[Ww][Ll] *# *\([0-9][0-9]*\).*$/WL#\1/
|
|
s/.*\(WL#[0-9][0-9]*\)/ \1/p'`
|
|
if [ "$BUG" = "" ]
|
|
then
|
|
# TO=dev-public@mysql.com
|
|
BS=""
|
|
BH=""
|
|
else
|
|
# TO=dev-bugs@mysql.com
|
|
BS=" BUG#$BUG"
|
|
# need newline here
|
|
BH="X-Bug: $BUG
|
|
"
|
|
fi
|
|
|
|
#++
|
|
# commits@ or dev-private@ mail
|
|
#--
|
|
|
|
LIST="commits"
|
|
TO="commits@lists.mysql.com"
|
|
if [ -f .tree-is-private ]
|
|
then
|
|
LIST="dev-private"
|
|
TO="dev-private@mysql.com"
|
|
fi
|
|
|
|
echo "Notifying $LIST list at $TO"
|
|
(
|
|
cat <<EOF
|
|
List-ID: <bk.mysql-$VERSION>
|
|
From: $FROM
|
|
To: $TO
|
|
Subject: bk commit into $VERSION tree ($CHANGESET)$BS
|
|
X-CSetKey: <$CSETKEY>
|
|
$BH
|
|
Below is the list of changes that have just been committed into a local
|
|
$VERSION repository of $USER. When $USER does a push these changes will
|
|
be propagated to the main repository and, within 24 hours after the
|
|
push, to the public repository.
|
|
For information on how to access the public repository
|
|
see http://dev.mysql.com/doc/mysql/en/installing-source-tree.html
|
|
|
|
EOF
|
|
bk changes -v -r+
|
|
bk rset -r+ -ah | bk gnupatch -h -dup -T
|
|
) > $BKROOT/BitKeeper/tmp/commits.txt
|
|
|
|
$SENDMAIL -t < $BKROOT/BitKeeper/tmp/commits.txt
|
|
|
|
#++
|
|
# docs-commit@ mail
|
|
# Picks up anything under the Docs subdirectory (relevant for docs team).
|
|
#--
|
|
bk changes -v -r+ | grep -q " Docs/"
|
|
if [ $? -eq 0 ]
|
|
then
|
|
echo "Notifying docs list at $DOCS"
|
|
(
|
|
cat <<EOF
|
|
List-ID: <bk.mysql-$VERSION>
|
|
From: $FROM
|
|
To: $DOCS
|
|
Subject: bk commit - $VERSION tree (Manual) ($CHANGESET)$BS
|
|
|
|
EOF
|
|
bk changes -v -r+
|
|
bk rset -r+ -ah | bk gnupatch -h -dup -T
|
|
) > $BKROOT/BitKeeper/tmp/docs.txt
|
|
$SENDMAIL -t < $BKROOT/BitKeeper/tmp/docs.txt
|
|
fi
|
|
|
|
else
|
|
echo "commit failed because '$BK_STATUS', you may need to re-clone..."
|
|
fi
|