Merge lp:~akopytov/percona-xtrabackup/bug805593 into lp:percona-xtrabackup/2.0

Proposed by Alexey Kopytov
Status: Merged
Approved by: Stewart Smith
Approved revision: no longer in the source branch.
Merged at revision: 288
Proposed branch: lp:~akopytov/percona-xtrabackup/bug805593
Merge into: lp:percona-xtrabackup/2.0
Diff against target: 168 lines (+86/-42)
3 files modified
test/run.sh (+1/-1)
test/t/xb_log_overwrap.sh (+38/-0)
xtrabackup.c (+47/-41)
To merge this branch: bzr merge lp:~akopytov/percona-xtrabackup/bug805593
Reviewer Review Type Date Requested Status
Stewart Smith (community) Approve
Review via email: mp+66852@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Stewart Smith (stewart) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'test/run.sh'
2--- test/run.sh 2011-06-29 05:38:02 +0000
3+++ test/run.sh 2011-07-05 05:31:07 +0000
4@@ -290,7 +290,7 @@
5 echo "========================================================================"
6 echo
7
8-if [ -z "$force" -o $failed_count -eq 0 ]
9+if [ -n "$force" -o $failed_count -eq 0 ]
10 then
11 kill_leftovers
12 fi
13
14=== added file 'test/t/xb_log_overwrap.sh'
15--- test/t/xb_log_overwrap.sh 1970-01-01 00:00:00 +0000
16+++ test/t/xb_log_overwrap.sh 2011-07-05 05:31:07 +0000
17@@ -0,0 +1,38 @@
18+. inc/common.sh
19+
20+init
21+run_mysqld --innodb_log_file_size=1M --innodb_thread_concurrency=1
22+load_dbase_schema sakila
23+load_dbase_data sakila
24+mkdir $topdir/backup
25+
26+run_cmd_expect_failure $XB_BIN $XB_ARGS --datadir=$mysql_datadir --backup \
27+ --innodb_log_file_size=1M --target-dir=$topdir/backup --suspend-at-end &
28+
29+xb_pid=$!
30+
31+# Wait for xtrabackup to suspend
32+i=0
33+while [ ! -r $topdir/backup/xtrabackup_suspended ]
34+do
35+ sleep 1
36+ i=$((i+1))
37+ echo "Waited $i seconds for xtrabackup_suspended to be created"
38+done
39+
40+# Stop the xtrabackup process
41+kill -SIGSTOP $xb_pid
42+
43+# Create 2M+ of log data
44+
45+$MYSQL $MYSQL_ARGS -Ns -e "CREATE TABLE tmp1 ENGINE=InnoDB SELECT * FROM payment" sakila
46+$MYSQL $MYSQL_ARGS -Ns -e "CREATE TABLE tmp2 ENGINE=InnoDB SELECT * FROM payment" sakila
47+$MYSQL $MYSQL_ARGS -Ns -e "CREATE TABLE tmp3 ENGINE=InnoDB SELECT * FROM payment" sakila
48+
49+# Resume the xtrabackup process
50+kill -SIGCONT $xb_pid
51+
52+rm -f $topdir/backup/xtrabackup_suspended
53+
54+# wait's return code will be the code returned by the background process
55+wait $xb_pid
56
57=== modified file 'xtrabackup.c'
58--- xtrabackup.c 2011-06-30 02:33:31 +0000
59+++ xtrabackup.c 2011-07-05 05:31:07 +0000
60@@ -3161,7 +3161,6 @@
61 /* reference recv_scan_log_recs() */
62 {
63 byte* log_block;
64- ulint no;
65 LSN64 scanned_lsn;
66 ulint data_len;
67
68@@ -3173,39 +3172,51 @@
69 scanned_lsn = start_lsn;
70
71 while (log_block < log_sys->buf + RECV_SCAN_SIZE && !finished) {
72-
73- no = log_block_get_hdr_no(log_block);
74-
75- if (no != log_block_convert_lsn_to_no(scanned_lsn)
76- || !log_block_checksum_is_ok_or_old_format(log_block)) {
77-
78- if (no > log_block_convert_lsn_to_no(scanned_lsn)
79- && log_block_checksum_is_ok_or_old_format(log_block)) {
80- fprintf(stderr,
81-">> ###Warning###: The copying transaction log migh be overtaken already by the target.\n"
82-">> : Waiting log block no %lu, but the bumber is already %lu.\n"
83-">> : If the number equals %lu + n * %lu, it should be overtaken already.\n",
84- (ulong) log_block_convert_lsn_to_no(scanned_lsn),
85- (ulong) no,
86- (ulong) log_block_convert_lsn_to_no(scanned_lsn),
87- (ulong) (log_block_convert_lsn_to_no(
88-#ifndef INNODB_VERSION_SHORT
89- ut_dulint_create(0, log_group_get_capacity(group))
90-#else
91- log_group_get_capacity(group)
92-#endif
93- ) - 1));
94-
95- } else if (no == log_block_convert_lsn_to_no(scanned_lsn)
96- && !log_block_checksum_is_ok_or_old_format(
97- log_block)) {
98- fprintf(stderr,
99-#ifndef INNODB_VERSION_SHORT
100-"xtrabackup: Log block no %lu at lsn %lu %lu has\n"
101-#else
102-"xtrabackup: Log block no %lu at lsn %llu has\n"
103-#endif
104-"xtrabackup: ok header, but checksum field contains %lu, should be %lu\n",
105+ ulint no = log_block_get_hdr_no(log_block);
106+ ulint scanned_no = log_block_convert_lsn_to_no(scanned_lsn);
107+ ibool checksum_is_ok =
108+ log_block_checksum_is_ok_or_old_format(log_block);
109+
110+ if (no != scanned_no && checksum_is_ok) {
111+ ulint blocks_in_group =
112+ log_block_convert_lsn_to_no(
113+#ifndef INNODB_VERSION_SHORT
114+ ut_dulint_create(0, log_group_get_capacity(group))
115+#else
116+ log_group_get_capacity(group)
117+#endif
118+ ) - 1;
119+
120+ fprintf(stderr,
121+ "xtrabackup: error:"
122+ " log block numbers mismatch:\n"
123+ "xtrabackup: error: expected log block no. %lu,"
124+ " but got no. %lu from the log file.\n",
125+ (ulong) scanned_no, (ulong) no);
126+
127+ if ((no - scanned_no) % blocks_in_group == 0) {
128+ fprintf(stderr,
129+ "xtrabackup: error:"
130+ " it looks like InnoDB log has wrapped"
131+ " around before xtrabackup could"
132+ " process all records due to either"
133+ " log copying being too slow, or "
134+ " log files being too small.\n");
135+ }
136+
137+ goto error;
138+ } else if (!checksum_is_ok) {
139+ /* Garbage or an incompletely written log block */
140+
141+ fprintf(stderr,
142+ "xtrabackup: error:"
143+ " Log block checksum mismatch"
144+#ifndef INNODB_VERSION_SHORT
145+ " (block no %lu at lsn %lu %lu): \n"
146+#else
147+ " (block no %lu at lsn %llu): \n"
148+#endif
149+ "expected %lu, calculated checksum %lu\n",
150 (ulong) no,
151 #ifndef INNODB_VERSION_SHORT
152 (ulong) ut_dulint_get_high(scanned_lsn),
153@@ -3215,13 +3226,8 @@
154 #endif
155 (ulong) log_block_get_checksum(log_block),
156 (ulong) log_block_calc_checksum(log_block));
157- }
158-
159- /* Garbage or an incompletely written log block */
160-
161- finished = TRUE;
162-
163- break;
164+
165+ goto error;
166 }
167
168 if (log_block_get_flush_bit(log_block)) {

Subscribers

People subscribed via source and target branches