Merge lp:~percona-toolkit-dev/percona-toolkit/fix-ptc-diffs-bug-1030031 into lp:percona-toolkit/2.1

Proposed by Daniel Nichter
Status: Merged
Merged at revision: 327
Proposed branch: lp:~percona-toolkit-dev/percona-toolkit/fix-ptc-diffs-bug-1030031
Merge into: lp:percona-toolkit/2.1
Diff against target: 126 lines (+65/-6)
3 files modified
bin/pt-table-checksum (+9/-2)
t/pt-table-checksum/bugs.t (+46/-4)
t/pt-table-checksum/samples/a-z.sql (+10/-0)
To merge this branch: bzr merge lp:~percona-toolkit-dev/percona-toolkit/fix-ptc-diffs-bug-1030031
Reviewer Review Type Date Requested Status
Brian Fraser (community) Approve
Daniel Nichter Approve
Review via email: mp+117105@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Daniel Nichter (daniel-nichter) :
review: Approve
330. By Daniel Nichter

Switch bugs.t to use done_testing.

331. By Daniel Nichter

Add code comment to new %diff_chunks code.

Revision history for this message
Brian Fraser (fraserbn) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bin/pt-table-checksum'
2--- bin/pt-table-checksum 2012-07-21 16:13:58 +0000
3+++ bin/pt-table-checksum 2012-07-27 17:56:19 +0000
4@@ -7690,6 +7690,7 @@
5 );
6
7 # Check each slave for checksum diffs.
8+ my %diff_chunks;
9 foreach my $slave ( @$slaves ) {
10 eval {
11 my $diffs = $rc->find_replication_differences(
12@@ -7699,8 +7700,13 @@
13 );
14 PTDEBUG && _d(scalar @$diffs, 'checksum diffs on',
15 $slave->name());
16- if ( @$diffs ) {
17- $tbl->{checksum_results}->{diffs} = scalar @$diffs;
18+ # Save unique chunks that differ.
19+ # https://bugs.launchpad.net/percona-toolkit/+bug/1030031
20+ if ( scalar @$diffs ) {
21+ # "chunk" is the chunk number. See the SELECT
22+ # statement in RowChecksum::find_replication_differences()
23+ # for the full list of columns.
24+ map { $diff_chunks{ $_->{chunk} }++ } @$diffs;
25 }
26 };
27 if ($EVAL_ERROR) {
28@@ -7714,6 +7720,7 @@
29 $tbl->{checksum_results}->{errors}++;
30 }
31 }
32+ $tbl->{checksum_results}->{diffs} = scalar keys %diff_chunks;
33 }
34
35 # Print table's checksum results if we're not being quiet,
36
37=== modified file 't/pt-table-checksum/bugs.t'
38--- t/pt-table-checksum/bugs.t 2012-06-07 14:25:44 +0000
39+++ t/pt-table-checksum/bugs.t 2012-07-27 17:56:19 +0000
40@@ -29,16 +29,17 @@
41 my $dp = new DSNParser(opts=>$dsn_opts);
42 my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
43 my $master_dbh = $sb->get_dbh_for('master');
44-my $slave_dbh = $sb->get_dbh_for('slave1');
45+my $slave1_dbh = $sb->get_dbh_for('slave1');
46+my $slave2_dbh = $sb->get_dbh_for('slave2');
47
48 if ( !$master_dbh ) {
49 plan skip_all => 'Cannot connect to sandbox master';
50 }
51-elsif ( !$slave_dbh ) {
52+elsif ( !$slave1_dbh ) {
53 plan skip_all => 'Cannot connect to sandbox slave1';
54 }
55-else {
56- plan tests => 8;
57+elsif ( !$slave2_dbh ) {
58+ plan skip_all => 'Cannot connect to sandbox slave2';
59 }
60
61 # The sandbox servers run with lock_wait_timeout=3 and it's not dynamic
62@@ -135,8 +136,49 @@
63 );
64
65 # #############################################################################
66+# https://bugs.launchpad.net/percona-toolkit/+bug/1030031
67+# pt-table-checksum reports wrong number of DIFFS
68+# #############################################################################
69+$sb->load_file('master', "$sample/a-z.sql");
70+$sb->wait_for_slaves();
71+
72+# Create 2 diffs on slave1 and 1 diff on slave2.
73+$slave1_dbh->do("UPDATE test.t SET c='' WHERE id=5"); # diff on slave1 & 2
74+$slave1_dbh->do("SET SQL_LOG_BIN=0");
75+$slave1_dbh->do("UPDATE test.t SET c='' WHERE id=20"); # diff only on slave1
76+
77+# Restore sql_log_bin on slave1 in case later tests use it.
78+$slave1_dbh->do("SET SQL_LOG_BIN=1");
79+
80+$output = output(
81+ sub { pt_table_checksum::main(@args, qw(-t test.t --chunk-size 10)) },
82+);
83+
84+is(
85+ PerconaTest::count_checksum_results($output, 'diffs'),
86+ 2,
87+ "Bug 1030031 (wrong DIFFS): 2 diffs"
88+);
89+
90+# Restore slave2, but then give it 1 diff that's not the same chunk#
91+# as slave1, so there's 3 unique chunk that differ.
92+$slave2_dbh->do("UPDATE test.t SET c='e' WHERE id=5");
93+$slave2_dbh->do("UPDATE test.t SET c='' WHERE id=26");
94+
95+$output = output(
96+ sub { pt_table_checksum::main(@args, qw(-t test.t --chunk-size 10)) },
97+);
98+
99+is(
100+ PerconaTest::count_checksum_results($output, 'diffs'),
101+ 3,
102+ "Bug 1030031 (wrong DIFFS): 3 diffs"
103+);
104+
105+# #############################################################################
106 # Done.
107 # #############################################################################
108 $sb->wipe_clean($master_dbh);
109 ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
110+done_testing;
111 exit;
112
113=== added file 't/pt-table-checksum/samples/a-z.sql'
114--- t/pt-table-checksum/samples/a-z.sql 1970-01-01 00:00:00 +0000
115+++ t/pt-table-checksum/samples/a-z.sql 2012-07-27 17:56:19 +0000
116@@ -0,0 +1,10 @@
117+drop database if exists test;
118+create database test;
119+use test;
120+
121+create table t (
122+ id int auto_increment primary key,
123+ c varchar(16) not null
124+) engine=innodb;
125+
126+insert into t values (null, 'a'),(null, 'b'),(null, 'c'),(null, 'd'),(null, 'e'),(null, 'f'),(null, 'g'),(null, 'h'),(null, 'i'),(null, 'j'),(null, 'k'),(null, 'l'),(null, 'm'),(null, 'n'),(null, 'o'),(null, 'p'),(null, 'q'),(null, 'r'),(null, 's'),(null, 't'),(null, 'u'),(null, 'v'),(null, 'w'),(null, 'x'),(null, 'y'),(null, 'z');

Subscribers

People subscribed via source and target branches