~percona-toolkit-dev/percona-toolkit/fix-password-comma-bug-886077

« back to all changes in this revision

Viewing changes to t/pt-table-checksum/chunk_size.t

  • Committer: Daniel Nichter
  • Date: 2012-02-07 20:10:11 UTC
  • mfrom: (174 2.0)
  • mto: This revision was merged to the branch mainline in revision 189.
  • Revision ID: daniel@percona.com-20120207201011-sok2c1f2ay9qr3gm
Merge trunk r174.

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
 
14
14
use PerconaTest;
15
15
use Sandbox;
 
16
shift @INC;  # our unshift (above)
 
17
shift @INC;  # PerconaTest's unshift
16
18
require "$trunk/bin/pt-table-checksum";
17
19
 
18
20
my $dp = new DSNParser(opts=>$dsn_opts);
19
21
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
20
22
my $master_dbh = $sb->get_dbh_for('master');
 
23
my $slave_dbh  = $sb->get_dbh_for('slave1');
21
24
 
22
25
if ( !$master_dbh ) {
23
26
   plan skip_all => 'Cannot connect to sandbox master';
24
27
}
25
28
else {
26
 
   plan tests => 3;
 
29
   plan tests => 7;
27
30
}
28
31
 
 
32
# The sandbox servers run with lock_wait_timeout=3 and it's not dynamic
 
33
# so we need to specify --lock-wait-timeout=3 else the tool will die.
 
34
# And --max-load "" prevents waiting for status variables.
 
35
my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox';
 
36
my @args       = ($master_dsn, qw(--lock-wait-timeout 3), '--max-load', ''); 
 
37
 
 
38
my $row;
29
39
my $output;
30
 
my $cnf='/tmp/12345/my.sandbox.cnf';
31
 
my $cmd = "$trunk/bin/pt-table-checksum -F $cnf 127.0.0.1";
32
 
 
33
 
$sb->create_dbs($master_dbh, [qw(test)]);
34
 
$sb->load_file('master', 't/pt-table-checksum/samples/before.sql');
35
 
 
36
 
# Ensure chunking works
37
 
$output = `$cmd --function sha1 --explain --chunk-size 200 -d test -t chunk --chunk-size-limit 0`;
38
 
like($output, qr/test\s+chunk\s+`film_id` > 0 AND `film_id` < '\d+'/, 'chunking works');
39
 
my $num_chunks = scalar(map { 1 } $output =~ m/^test/gm);
40
 
ok($num_chunks >= 5 && $num_chunks < 8, "Found $num_chunks chunks");
41
 
 
42
 
# Ensure chunk boundaries are put into test.checksum (bug #1850243)
43
 
$output = `$cmd --function sha1 -d test -t chunk --chunk-size 50 --replicate test.checksum 127.0.0.1`;
44
 
$output = `/tmp/12345/use --skip-column-names -e "select boundaries from test.checksum where db='test' and tbl='chunk' and chunk=0"`;
45
 
chomp $output;
46
 
like ( $output, qr/`film_id` = 0/, 'chunk boundaries stored right');
 
40
my $exit_status;
 
41
 
 
42
# --chunk-size is dynamic; it varies according to --chunk-time and
 
43
# however fast the server happens to be.  So test this is difficult
 
44
# because it's inherently nondeterministic.  However, with one table,
 
45
# the first chunk should equal the chunk size, and the 2nd chunk should
 
46
# larger, unless it takes your machine > 0.5s to select 100 rows.
 
47
 
 
48
pt_table_checksum::main(@args, qw(--quiet -t sakila.rental));
 
49
 
 
50
$row = $master_dbh->selectrow_arrayref("select lower_boundary, upper_boundary from percona.checksums where db='sakila' and tbl='rental' and chunk=1");
 
51
is_deeply(
 
52
   $row,
 
53
   [1, 1001],
 
54
   "First chunk is default size"
 
55
);
 
56
 
 
57
$row = $master_dbh->selectrow_arrayref("select lower_boundary, upper_boundary from percona.checksums where db='sakila' and tbl='rental' and chunk=2");
 
58
is(
 
59
   $row->[0],
 
60
   1002,
 
61
   "2nd chunk lower boundary"
 
62
);
 
63
 
 
64
cmp_ok(
 
65
   $row->[1] - $row->[0],
 
66
   '>',
 
67
   1000,
 
68
   "2nd chunk is larger"
 
69
);
 
70
 
 
71
# ############################################################################
 
72
# Explicit --chunk-size should override auto-sizing.
 
73
# ############################################################################
 
74
 
 
75
pt_table_checksum::main(@args, qw(--quiet --chunk-size 100 -t sakila.city));
 
76
 
 
77
# There's 600 rows in sakila.city so there should be 6 chunks.
 
78
$row = $master_dbh->selectall_arrayref("select lower_boundary, upper_boundary from percona.checksums where db='sakila' and tbl='city'");
 
79
is_deeply(
 
80
   $row,
 
81
   [
 
82
      [  1, 100],
 
83
      [101, 200],
 
84
      [201, 300],
 
85
      [301, 400],
 
86
      [401, 500],
 
87
      [501, 600],
 
88
      [undef,   1], # lower oob
 
89
      [600, undef], # upper oob
 
90
   ],
 
91
   "Explicit --chunk-size disables auto chunk sizing"
 
92
);
 
93
 
 
94
# ############################################################################
 
95
# Sub-second chunk-time.
 
96
# ############################################################################
 
97
 
 
98
$output = output(
 
99
   sub { pt_table_checksum::main(@args,
 
100
      qw(--quiet --chunk-time .001 -d mysql)) },
 
101
   stderr => 1,
 
102
);
 
103
 
 
104
unlike(
 
105
   $output,
 
106
   qr/Cannot checksum table/,
 
107
   "Very small --chunk-time doesn't cause zero --chunk-size"
 
108
);
 
109
 
 
110
# #############################################################################
 
111
# Bug 921700: pt-table-checksum doesn't add --where to chunk-oversize test
 
112
# on replicas
 
113
# #############################################################################
 
114
$sb->load_file('master', 't/pt-table-checksum/samples/600cities.sql');
 
115
$master_dbh->do("LOAD DATA LOCAL INFILE '$trunk/t/pt-table-checksum/samples/600cities.data' INTO TABLE test.t");
 
116
$master_dbh->do("SET SQL_LOG_BIN=0");
 
117
$master_dbh->do("DELETE FROM test.t WHERE id > 100");
 
118
$master_dbh->do("SET SQL_LOG_BIN=1");
 
119
PerconaTest::wait_for_table($slave_dbh, "test.t", "id=600");
 
120
 
 
121
# Now there are 100 rows on the master and 600 on the slave.
 
122
$output = output(
 
123
   sub { $exit_status = pt_table_checksum::main(@args,
 
124
      qw(-t test.t --chunk-size 100 --where id<=100)); },
 
125
   stderr => 1,
 
126
);
 
127
 
 
128
is(
 
129
   $exit_status,
 
130
   0,
 
131
   "Zero exit status (bug 185734)"
 
132
);
 
133
 
 
134
like(
 
135
   $output,
 
136
   qr/test.t$/,
 
137
   "Checksummed table (bug 185734)"
 
138
);
47
139
 
48
140
# #############################################################################
49
141
# Done.