Merge lp:~percona-toolkit-dev/percona-toolkit/release-2.2.12 into lp:percona-toolkit/2.2
- release-2.2.12
- Merge into 2.2
Proposed by
Tomislav Plavcic
Status: | Merged |
---|---|
Merged at revision: | 611 |
Proposed branch: | lp:~percona-toolkit-dev/percona-toolkit/release-2.2.12 |
Merge into: | lp:percona-toolkit/2.2 |
Diff against target: |
2086 lines (+720/-172) 50 files modified
Changelog (+12/-0) Makefile.PL (+1/-1) bin/pt-align (+9/-1) bin/pt-archiver (+13/-2) bin/pt-config-diff (+24/-5) bin/pt-deadlock-logger (+24/-5) bin/pt-diskstats (+2/-2) bin/pt-duplicate-key-checker (+2/-2) bin/pt-fifo-split (+9/-1) bin/pt-find (+2/-2) bin/pt-fingerprint (+9/-1) bin/pt-fk-error-logger (+24/-5) bin/pt-heartbeat (+28/-2) bin/pt-index-usage (+2/-2) bin/pt-ioprofile (+5/-2) bin/pt-kill (+24/-5) bin/pt-mext (+30/-24) bin/pt-mysql-summary (+3/-1) bin/pt-online-schema-change (+61/-8) bin/pt-pmp (+5/-2) bin/pt-query-digest (+26/-4) bin/pt-show-grants (+9/-1) bin/pt-sift (+5/-2) bin/pt-slave-delay (+2/-2) bin/pt-slave-find (+9/-1) bin/pt-slave-restart (+2/-2) bin/pt-stalk (+15/-2) bin/pt-summary (+3/-1) bin/pt-table-checksum (+58/-14) bin/pt-table-sync (+2/-2) bin/pt-table-usage (+9/-1) bin/pt-upgrade (+24/-5) bin/pt-variable-advisor (+2/-2) bin/pt-visual-explain (+9/-1) config/deb/changelog (+13/-0) config/sphinx-build/conf.py (+1/-1) docs/percona-toolkit.pod (+1/-1) docs/release_notes.rst (+35/-0) lib/Cxn.pm (+19/-2) lib/OptionParser.pm (+10/-0) lib/Percona/Toolkit.pm (+1/-1) lib/Percona/XtraDB/Cluster.pm (+23/-2) lib/bash/collect.sh (+9/-0) lib/bash/parse_options.sh (+3/-0) t/lib/OptionParser.t (+23/-0) t/pt-archiver/basics.t (+1/-1) t/pt-archiver/indexes.t (+1/-1) t/pt-archiver/samples/issue-248.txt (+2/-2) t/pt-query-digest/binlog_analyses.t (+21/-1) t/pt-table-checksum/pxc.t (+93/-47) |
To merge this branch: | bzr merge lp:~percona-toolkit-dev/percona-toolkit/release-2.2.12 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Daniel Nichter | Pending | ||
Review via email: mp+241804@code.launchpad.net |
Commit message
Description of the change
Release branch for version 2.2.12
To post a comment you must log in.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'Changelog' |
2 | --- Changelog 2014-09-25 13:48:22 +0000 |
3 | +++ Changelog 2014-11-14 14:12:25 +0000 |
4 | @@ -1,5 +1,17 @@ |
5 | Changelog for Percona Toolkit |
6 | |
7 | +v2.2.12 released 2014-11-14 |
8 | + |
9 | + |
10 | + * Fixed bug 1376561: pt-archiver is not able to archive all the rows when a table has a hash partition |
11 | + * Fixed bug 1328686: pt-heartbeat check-read-only option does not prevent creates or inserts |
12 | + * Fixed bug 1269695: pt-online-schema-change does not allow ALTER for a table without a non-unique, while manual does not explain this |
13 | + * Fixed bug 1217466: pt-table-checksum refuses to run on PXC if server_id is the same on all nodes |
14 | + * Fixed bug 1373937: pt-table-checksum requires recursion when working with and XtraDB Cluster node |
15 | + * Fixed bug 1377888: pt-query-digest manual for --type binlog is ambiguous |
16 | + * Fixed bug 1349086: pt-stalk should also gather dmesg output |
17 | + * Fixed bug 1361293: Some scripts fail when no-version-check option is put in global config file |
18 | + |
19 | v2.2.11 released 2014-09-26 |
20 | |
21 | * Fixed bug 1262456: pt-query-digest doesn't report host details |
22 | |
23 | === modified file 'Makefile.PL' |
24 | --- Makefile.PL 2014-09-25 13:48:22 +0000 |
25 | +++ Makefile.PL 2014-11-14 14:12:25 +0000 |
26 | @@ -2,7 +2,7 @@ |
27 | |
28 | WriteMakefile( |
29 | NAME => 'percona-toolkit', |
30 | - VERSION => '2.2.11', |
31 | + VERSION => '2.2.12', |
32 | EXE_FILES => [ <bin/*> ], |
33 | MAN1PODS => { |
34 | 'docs/percona-toolkit.pod' => 'blib/man1/percona-toolkit.1p', |
35 | |
36 | === modified file 'bin/pt-align' |
37 | --- bin/pt-align 2014-09-25 13:48:22 +0000 |
38 | +++ bin/pt-align 2014-11-14 14:12:25 +0000 |
39 | @@ -901,6 +901,14 @@ |
40 | $parse = 0; |
41 | next LINE; |
42 | } |
43 | + |
44 | + if ( $parse |
45 | + && !$self->has('version-check') |
46 | + && $line =~ /version-check/ |
47 | + ) { |
48 | + next LINE; |
49 | + } |
50 | + |
51 | if ( $parse |
52 | && (my($opt, $arg) = $line =~ m/^\s*([^=\s]+?)(?:\s*=\s*(.*?)\s*)?$/) |
53 | ) { |
54 | @@ -1323,6 +1331,6 @@ |
55 | |
56 | =head1 VERSION |
57 | |
58 | -pt-align 2.2.11 |
59 | +pt-align 2.2.12 |
60 | |
61 | =cut |
62 | |
63 | === modified file 'bin/pt-archiver' |
64 | --- bin/pt-archiver 2014-09-25 13:48:22 +0000 |
65 | +++ bin/pt-archiver 2014-11-14 14:12:25 +0000 |
66 | @@ -43,7 +43,7 @@ |
67 | { |
68 | package Percona::Toolkit; |
69 | |
70 | -our $VERSION = '2.2.11'; |
71 | +our $VERSION = '2.2.12'; |
72 | |
73 | use strict; |
74 | use warnings FATAL => 'all'; |
75 | @@ -5811,7 +5811,18 @@ |
76 | $next_sql .= " AND $sel_stmt->{where}"; |
77 | } |
78 | |
79 | + # Obtain index cols so we can order them when ascending |
80 | + # this ensures returned sets are disjoint when ran on partitioned tables |
81 | + # issue 1376561 |
82 | + my $index_cols; |
83 | + if ( $sel_stmt->{index} |
84 | + && $src->{info}->{keys}->{$sel_stmt->{index}}->{cols} |
85 | + ) { |
86 | + $index_cols = $src->{info}->{keys}->{$sel_stmt->{index}}->{colnames}; |
87 | + } |
88 | + |
89 | foreach my $thing ( $first_sql, $next_sql ) { |
90 | + $thing .= " ORDER BY $index_cols" if $index_cols; |
91 | $thing .= " LIMIT $limit"; |
92 | if ( $o->get('for-update') ) { |
93 | $thing .= ' FOR UPDATE'; |
94 | @@ -7892,6 +7903,6 @@ |
95 | |
96 | =head1 VERSION |
97 | |
98 | -pt-archiver 2.2.11 |
99 | +pt-archiver 2.2.12 |
100 | |
101 | =cut |
102 | |
103 | === modified file 'bin/pt-config-diff' |
104 | --- bin/pt-config-diff 2014-09-25 13:48:22 +0000 |
105 | +++ bin/pt-config-diff 2014-11-14 14:12:25 +0000 |
106 | @@ -43,7 +43,7 @@ |
107 | { |
108 | package Percona::Toolkit; |
109 | |
110 | -our $VERSION = '2.2.11'; |
111 | +our $VERSION = '2.2.12'; |
112 | |
113 | use strict; |
114 | use warnings FATAL => 'all'; |
115 | @@ -2295,7 +2295,7 @@ |
116 | set => $args{set}, |
117 | NAME_lc => defined($args{NAME_lc}) ? $args{NAME_lc} : 1, |
118 | dbh_set => 0, |
119 | - ask_pass => $o->get('ask-pass'), |
120 | + ask_pass => $args{ask_pass}, |
121 | DSNParser => $dp, |
122 | is_cluster_node => undef, |
123 | parent => $args{parent}, |
124 | @@ -2306,7 +2306,7 @@ |
125 | |
126 | sub connect { |
127 | my ( $self, %opts ) = @_; |
128 | - my $dsn = $self->{dsn}; |
129 | + my $dsn = $opts{dsn} || $self->{dsn}; |
130 | my $dp = $self->{DSNParser}; |
131 | |
132 | my $dbh = $self->{dbh}; |
133 | @@ -2325,6 +2325,13 @@ |
134 | } |
135 | |
136 | $dbh = $self->set_dbh($dbh); |
137 | + if ( $opts{dsn} ) { |
138 | + $self->{dsn} = $dsn; |
139 | + $self->{dsn_name} = $dp->as_string($dsn, [qw(h P S)]) |
140 | + || $dp->as_string($dsn, [qw(F)]) |
141 | + || ''; |
142 | + |
143 | + } |
144 | PTDEBUG && _d($dbh, 'Connected dbh to', $self->{hostname},$self->{dsn_name}); |
145 | return $dbh; |
146 | } |
147 | @@ -2386,6 +2393,17 @@ |
148 | return $self->{hostname} || $self->{dsn_name} || 'unknown host'; |
149 | } |
150 | |
151 | +sub is_cluster_node { |
152 | + my ($self, $cxn) = @_; |
153 | + |
154 | + my $sql = "SHOW VARIABLES LIKE 'wsrep\_on'"; |
155 | + PTDEBUG && _d($cxn->name, $sql); |
156 | + my $row = $cxn->dbh->selectrow_arrayref($sql); |
157 | + PTDEBUG && _d(Dumper($row)); |
158 | + return $row && $row->[1] && ($row->[1] eq 'ON' || $row->[1] eq '1') ? 1 : 0; |
159 | + |
160 | +} |
161 | + |
162 | sub remove_duplicate_cxns { |
163 | my ($self, %args) = @_; |
164 | my @cxns = @{$args{cxns}}; |
165 | @@ -2395,7 +2413,8 @@ |
166 | |
167 | for my $cxn ( @cxns ) { |
168 | my $dbh = $cxn->dbh(); |
169 | - my $sql = q{SELECT @@server_id}; |
170 | + |
171 | + my $sql = $self->is_cluster_node($cxn) ? q{SELECT @@wsrep_node_incoming_address} : q{SELECT @@server_id}; |
172 | PTDEBUG && _d($sql); |
173 | my ($id) = $dbh->selectrow_array($sql); |
174 | PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); |
175 | @@ -5733,6 +5752,6 @@ |
176 | |
177 | =head1 VERSION |
178 | |
179 | -pt-config-diff 2.2.11 |
180 | +pt-config-diff 2.2.12 |
181 | |
182 | =cut |
183 | |
184 | === modified file 'bin/pt-deadlock-logger' |
185 | --- bin/pt-deadlock-logger 2014-09-25 13:48:22 +0000 |
186 | +++ bin/pt-deadlock-logger 2014-11-14 14:12:25 +0000 |
187 | @@ -42,7 +42,7 @@ |
188 | { |
189 | package Percona::Toolkit; |
190 | |
191 | -our $VERSION = '2.2.11'; |
192 | +our $VERSION = '2.2.12'; |
193 | |
194 | use strict; |
195 | use warnings FATAL => 'all'; |
196 | @@ -2639,7 +2639,7 @@ |
197 | set => $args{set}, |
198 | NAME_lc => defined($args{NAME_lc}) ? $args{NAME_lc} : 1, |
199 | dbh_set => 0, |
200 | - ask_pass => $o->get('ask-pass'), |
201 | + ask_pass => $args{ask_pass}, |
202 | DSNParser => $dp, |
203 | is_cluster_node => undef, |
204 | parent => $args{parent}, |
205 | @@ -2650,7 +2650,7 @@ |
206 | |
207 | sub connect { |
208 | my ( $self, %opts ) = @_; |
209 | - my $dsn = $self->{dsn}; |
210 | + my $dsn = $opts{dsn} || $self->{dsn}; |
211 | my $dp = $self->{DSNParser}; |
212 | |
213 | my $dbh = $self->{dbh}; |
214 | @@ -2669,6 +2669,13 @@ |
215 | } |
216 | |
217 | $dbh = $self->set_dbh($dbh); |
218 | + if ( $opts{dsn} ) { |
219 | + $self->{dsn} = $dsn; |
220 | + $self->{dsn_name} = $dp->as_string($dsn, [qw(h P S)]) |
221 | + || $dp->as_string($dsn, [qw(F)]) |
222 | + || ''; |
223 | + |
224 | + } |
225 | PTDEBUG && _d($dbh, 'Connected dbh to', $self->{hostname},$self->{dsn_name}); |
226 | return $dbh; |
227 | } |
228 | @@ -2730,6 +2737,17 @@ |
229 | return $self->{hostname} || $self->{dsn_name} || 'unknown host'; |
230 | } |
231 | |
232 | +sub is_cluster_node { |
233 | + my ($self, $cxn) = @_; |
234 | + |
235 | + my $sql = "SHOW VARIABLES LIKE 'wsrep\_on'"; |
236 | + PTDEBUG && _d($cxn->name, $sql); |
237 | + my $row = $cxn->dbh->selectrow_arrayref($sql); |
238 | + PTDEBUG && _d(Dumper($row)); |
239 | + return $row && $row->[1] && ($row->[1] eq 'ON' || $row->[1] eq '1') ? 1 : 0; |
240 | + |
241 | +} |
242 | + |
243 | sub remove_duplicate_cxns { |
244 | my ($self, %args) = @_; |
245 | my @cxns = @{$args{cxns}}; |
246 | @@ -2739,7 +2757,8 @@ |
247 | |
248 | for my $cxn ( @cxns ) { |
249 | my $dbh = $cxn->dbh(); |
250 | - my $sql = q{SELECT @@server_id}; |
251 | + |
252 | + my $sql = $self->is_cluster_node($cxn) ? q{SELECT @@wsrep_node_incoming_address} : q{SELECT @@server_id}; |
253 | PTDEBUG && _d($sql); |
254 | my ($id) = $dbh->selectrow_array($sql); |
255 | PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); |
256 | @@ -5523,6 +5542,6 @@ |
257 | |
258 | =head1 VERSION |
259 | |
260 | -pt-deadlock-logger 2.2.11 |
261 | +pt-deadlock-logger 2.2.12 |
262 | |
263 | =cut |
264 | |
265 | === modified file 'bin/pt-diskstats' |
266 | --- bin/pt-diskstats 2014-09-25 13:48:22 +0000 |
267 | +++ bin/pt-diskstats 2014-11-14 14:12:25 +0000 |
268 | @@ -38,7 +38,7 @@ |
269 | { |
270 | package Percona::Toolkit; |
271 | |
272 | -our $VERSION = '2.2.11'; |
273 | +our $VERSION = '2.2.12'; |
274 | |
275 | use strict; |
276 | use warnings FATAL => 'all'; |
277 | @@ -5579,6 +5579,6 @@ |
278 | |
279 | =head1 VERSION |
280 | |
281 | -pt-diskstats 2.2.11 |
282 | +pt-diskstats 2.2.12 |
283 | |
284 | =cut |
285 | |
286 | === modified file 'bin/pt-duplicate-key-checker' |
287 | --- bin/pt-duplicate-key-checker 2014-09-25 13:48:22 +0000 |
288 | +++ bin/pt-duplicate-key-checker 2014-11-14 14:12:25 +0000 |
289 | @@ -39,7 +39,7 @@ |
290 | { |
291 | package Percona::Toolkit; |
292 | |
293 | -our $VERSION = '2.2.11'; |
294 | +our $VERSION = '2.2.12'; |
295 | |
296 | use strict; |
297 | use warnings FATAL => 'all'; |
298 | @@ -5600,6 +5600,6 @@ |
299 | |
300 | =head1 VERSION |
301 | |
302 | -pt-duplicate-key-checker 2.2.11 |
303 | +pt-duplicate-key-checker 2.2.12 |
304 | |
305 | =cut |
306 | |
307 | === modified file 'bin/pt-fifo-split' |
308 | --- bin/pt-fifo-split 2014-09-25 13:48:22 +0000 |
309 | +++ bin/pt-fifo-split 2014-11-14 14:12:25 +0000 |
310 | @@ -902,6 +902,14 @@ |
311 | $parse = 0; |
312 | next LINE; |
313 | } |
314 | + |
315 | + if ( $parse |
316 | + && !$self->has('version-check') |
317 | + && $line =~ /version-check/ |
318 | + ) { |
319 | + next LINE; |
320 | + } |
321 | + |
322 | if ( $parse |
323 | && (my($opt, $arg) = $line =~ m/^\s*([^=\s]+?)(?:\s*=\s*(.*?)\s*)?$/) |
324 | ) { |
325 | @@ -1612,6 +1620,6 @@ |
326 | |
327 | =head1 VERSION |
328 | |
329 | -pt-fifo-split 2.2.11 |
330 | +pt-fifo-split 2.2.12 |
331 | |
332 | =cut |
333 | |
334 | === modified file 'bin/pt-find' |
335 | --- bin/pt-find 2014-09-25 13:48:22 +0000 |
336 | +++ bin/pt-find 2014-11-14 14:12:25 +0000 |
337 | @@ -35,7 +35,7 @@ |
338 | { |
339 | package Percona::Toolkit; |
340 | |
341 | -our $VERSION = '2.2.11'; |
342 | +our $VERSION = '2.2.12'; |
343 | |
344 | use strict; |
345 | use warnings FATAL => 'all'; |
346 | @@ -4984,6 +4984,6 @@ |
347 | |
348 | =head1 VERSION |
349 | |
350 | -pt-find 2.2.11 |
351 | +pt-find 2.2.12 |
352 | |
353 | =cut |
354 | |
355 | === modified file 'bin/pt-fingerprint' |
356 | --- bin/pt-fingerprint 2014-09-25 13:48:22 +0000 |
357 | +++ bin/pt-fingerprint 2014-11-14 14:12:25 +0000 |
358 | @@ -903,6 +903,14 @@ |
359 | $parse = 0; |
360 | next LINE; |
361 | } |
362 | + |
363 | + if ( $parse |
364 | + && !$self->has('version-check') |
365 | + && $line =~ /version-check/ |
366 | + ) { |
367 | + next LINE; |
368 | + } |
369 | + |
370 | if ( $parse |
371 | && (my($opt, $arg) = $line =~ m/^\s*([^=\s]+?)(?:\s*=\s*(.*?)\s*)?$/) |
372 | ) { |
373 | @@ -2203,6 +2211,6 @@ |
374 | |
375 | =head1 VERSION |
376 | |
377 | -pt-fingerprint 2.2.11 |
378 | +pt-fingerprint 2.2.12 |
379 | |
380 | =cut |
381 | |
382 | === modified file 'bin/pt-fk-error-logger' |
383 | --- bin/pt-fk-error-logger 2014-09-25 13:48:22 +0000 |
384 | +++ bin/pt-fk-error-logger 2014-11-14 14:12:25 +0000 |
385 | @@ -37,7 +37,7 @@ |
386 | { |
387 | package Percona::Toolkit; |
388 | |
389 | -our $VERSION = '2.2.11'; |
390 | +our $VERSION = '2.2.12'; |
391 | |
392 | use strict; |
393 | use warnings FATAL => 'all'; |
394 | @@ -1791,7 +1791,7 @@ |
395 | set => $args{set}, |
396 | NAME_lc => defined($args{NAME_lc}) ? $args{NAME_lc} : 1, |
397 | dbh_set => 0, |
398 | - ask_pass => $o->get('ask-pass'), |
399 | + ask_pass => $args{ask_pass}, |
400 | DSNParser => $dp, |
401 | is_cluster_node => undef, |
402 | parent => $args{parent}, |
403 | @@ -1802,7 +1802,7 @@ |
404 | |
405 | sub connect { |
406 | my ( $self, %opts ) = @_; |
407 | - my $dsn = $self->{dsn}; |
408 | + my $dsn = $opts{dsn} || $self->{dsn}; |
409 | my $dp = $self->{DSNParser}; |
410 | |
411 | my $dbh = $self->{dbh}; |
412 | @@ -1821,6 +1821,13 @@ |
413 | } |
414 | |
415 | $dbh = $self->set_dbh($dbh); |
416 | + if ( $opts{dsn} ) { |
417 | + $self->{dsn} = $dsn; |
418 | + $self->{dsn_name} = $dp->as_string($dsn, [qw(h P S)]) |
419 | + || $dp->as_string($dsn, [qw(F)]) |
420 | + || ''; |
421 | + |
422 | + } |
423 | PTDEBUG && _d($dbh, 'Connected dbh to', $self->{hostname},$self->{dsn_name}); |
424 | return $dbh; |
425 | } |
426 | @@ -1882,6 +1889,17 @@ |
427 | return $self->{hostname} || $self->{dsn_name} || 'unknown host'; |
428 | } |
429 | |
430 | +sub is_cluster_node { |
431 | + my ($self, $cxn) = @_; |
432 | + |
433 | + my $sql = "SHOW VARIABLES LIKE 'wsrep\_on'"; |
434 | + PTDEBUG && _d($cxn->name, $sql); |
435 | + my $row = $cxn->dbh->selectrow_arrayref($sql); |
436 | + PTDEBUG && _d(Dumper($row)); |
437 | + return $row && $row->[1] && ($row->[1] eq 'ON' || $row->[1] eq '1') ? 1 : 0; |
438 | + |
439 | +} |
440 | + |
441 | sub remove_duplicate_cxns { |
442 | my ($self, %args) = @_; |
443 | my @cxns = @{$args{cxns}}; |
444 | @@ -1891,7 +1909,8 @@ |
445 | |
446 | for my $cxn ( @cxns ) { |
447 | my $dbh = $cxn->dbh(); |
448 | - my $sql = q{SELECT @@server_id}; |
449 | + |
450 | + my $sql = $self->is_cluster_node($cxn) ? q{SELECT @@wsrep_node_incoming_address} : q{SELECT @@server_id}; |
451 | PTDEBUG && _d($sql); |
452 | my ($id) = $dbh->selectrow_array($sql); |
453 | PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); |
454 | @@ -4509,6 +4528,6 @@ |
455 | |
456 | =head1 VERSION |
457 | |
458 | -pt-fk-error-logger 2.2.11 |
459 | +pt-fk-error-logger 2.2.12 |
460 | |
461 | =cut |
462 | |
463 | === modified file 'bin/pt-heartbeat' |
464 | --- bin/pt-heartbeat 2014-09-25 13:48:22 +0000 |
465 | +++ bin/pt-heartbeat 2014-11-14 14:12:25 +0000 |
466 | @@ -38,7 +38,7 @@ |
467 | { |
468 | package Percona::Toolkit; |
469 | |
470 | -our $VERSION = '2.2.11'; |
471 | +our $VERSION = '2.2.12'; |
472 | |
473 | use strict; |
474 | use warnings FATAL => 'all'; |
475 | @@ -4892,6 +4892,32 @@ |
476 | $dbh->do("USE `$db`"); |
477 | |
478 | # ######################################################################## |
479 | + # If --check-read-only option was given and we are in --update mode |
480 | + # we wait until server is writable , or run-time is over, or sentinel file |
481 | + # We also do this check after daemon is up and running, but it is necessary |
482 | + # to check this before attempting to create the table and inserting rows |
483 | + # https://bugs.launchpad.net/percona-toolkit/+bug/1328686 |
484 | + # ####################################################################### |
485 | + if ( $o->get('check-read-only') && $o->get('update') ) { |
486 | + PTDEBUG && _d('Checking if server is read_only'); |
487 | + if ( server_is_readonly($dbh) && PTDEBUG ) { |
488 | + _d('Server is read-only, waiting') |
489 | + } |
490 | + my $start_time = time; |
491 | + my $run_time = $o->get('run-time'); |
492 | + my $interval = $o->get('interval') || 5; |
493 | + while (server_is_readonly($dbh)) { |
494 | + sleep($interval); |
495 | + if ( |
496 | + ($run_time && $run_time < time - $start_time) |
497 | + || -f $sentinel |
498 | + ) { |
499 | + return 0; |
500 | + } |
501 | + } |
502 | + } |
503 | + |
504 | + # ######################################################################## |
505 | # Create the heartbeat table if --create-table was given. |
506 | # ######################################################################## |
507 | my $utc = $o->get('utc'); |
508 | @@ -6192,6 +6218,6 @@ |
509 | |
510 | =head1 VERSION |
511 | |
512 | -pt-heartbeat 2.2.11 |
513 | +pt-heartbeat 2.2.12 |
514 | |
515 | =cut |
516 | |
517 | === modified file 'bin/pt-index-usage' |
518 | --- bin/pt-index-usage 2014-09-25 13:48:22 +0000 |
519 | +++ bin/pt-index-usage 2014-11-14 14:12:25 +0000 |
520 | @@ -45,7 +45,7 @@ |
521 | { |
522 | package Percona::Toolkit; |
523 | |
524 | -our $VERSION = '2.2.11'; |
525 | +our $VERSION = '2.2.12'; |
526 | |
527 | use strict; |
528 | use warnings FATAL => 'all'; |
529 | @@ -7548,6 +7548,6 @@ |
530 | |
531 | =head1 VERSION |
532 | |
533 | -pt-index-usage 2.2.11 |
534 | +pt-index-usage 2.2.12 |
535 | |
536 | =cut |
537 | |
538 | === modified file 'bin/pt-ioprofile' |
539 | --- bin/pt-ioprofile 2014-09-25 13:48:22 +0000 |
540 | +++ bin/pt-ioprofile 2014-11-14 14:12:25 +0000 |
541 | @@ -86,9 +86,10 @@ |
542 | |
543 | usage_or_errors() { |
544 | local file="$1" |
545 | + local version="" |
546 | |
547 | if [ "$OPT_VERSION" ]; then |
548 | - local version=$(grep '^pt-[^ ]\+ [0-9]' "$file") |
549 | + version=$(grep '^pt-[^ ]\+ [0-9]' "$file") |
550 | echo "$version" |
551 | return 1 |
552 | fi |
553 | @@ -310,6 +311,8 @@ |
554 | |
555 | [ "$config_opt" = "" ] && continue |
556 | |
557 | + echo "$config_opt" | grep -v 'version-check' >/dev/null 2>&1 || continue |
558 | + |
559 | if ! [ "$HAVE_EXT_ARGV" ]; then |
560 | config_opt="--$config_opt" |
561 | fi |
562 | @@ -1119,7 +1122,7 @@ |
563 | |
564 | =head1 VERSION |
565 | |
566 | -pt-ioprofile 2.2.11 |
567 | +pt-ioprofile 2.2.12 |
568 | |
569 | =cut |
570 | |
571 | |
572 | === modified file 'bin/pt-kill' |
573 | --- bin/pt-kill 2014-09-25 13:48:22 +0000 |
574 | +++ bin/pt-kill 2014-11-14 14:12:25 +0000 |
575 | @@ -47,7 +47,7 @@ |
576 | { |
577 | package Percona::Toolkit; |
578 | |
579 | -our $VERSION = '2.2.11'; |
580 | +our $VERSION = '2.2.12'; |
581 | |
582 | use strict; |
583 | use warnings FATAL => 'all'; |
584 | @@ -5158,7 +5158,7 @@ |
585 | set => $args{set}, |
586 | NAME_lc => defined($args{NAME_lc}) ? $args{NAME_lc} : 1, |
587 | dbh_set => 0, |
588 | - ask_pass => $o->get('ask-pass'), |
589 | + ask_pass => $args{ask_pass}, |
590 | DSNParser => $dp, |
591 | is_cluster_node => undef, |
592 | parent => $args{parent}, |
593 | @@ -5169,7 +5169,7 @@ |
594 | |
595 | sub connect { |
596 | my ( $self, %opts ) = @_; |
597 | - my $dsn = $self->{dsn}; |
598 | + my $dsn = $opts{dsn} || $self->{dsn}; |
599 | my $dp = $self->{DSNParser}; |
600 | |
601 | my $dbh = $self->{dbh}; |
602 | @@ -5188,6 +5188,13 @@ |
603 | } |
604 | |
605 | $dbh = $self->set_dbh($dbh); |
606 | + if ( $opts{dsn} ) { |
607 | + $self->{dsn} = $dsn; |
608 | + $self->{dsn_name} = $dp->as_string($dsn, [qw(h P S)]) |
609 | + || $dp->as_string($dsn, [qw(F)]) |
610 | + || ''; |
611 | + |
612 | + } |
613 | PTDEBUG && _d($dbh, 'Connected dbh to', $self->{hostname},$self->{dsn_name}); |
614 | return $dbh; |
615 | } |
616 | @@ -5249,6 +5256,17 @@ |
617 | return $self->{hostname} || $self->{dsn_name} || 'unknown host'; |
618 | } |
619 | |
620 | +sub is_cluster_node { |
621 | + my ($self, $cxn) = @_; |
622 | + |
623 | + my $sql = "SHOW VARIABLES LIKE 'wsrep\_on'"; |
624 | + PTDEBUG && _d($cxn->name, $sql); |
625 | + my $row = $cxn->dbh->selectrow_arrayref($sql); |
626 | + PTDEBUG && _d(Dumper($row)); |
627 | + return $row && $row->[1] && ($row->[1] eq 'ON' || $row->[1] eq '1') ? 1 : 0; |
628 | + |
629 | +} |
630 | + |
631 | sub remove_duplicate_cxns { |
632 | my ($self, %args) = @_; |
633 | my @cxns = @{$args{cxns}}; |
634 | @@ -5258,7 +5276,8 @@ |
635 | |
636 | for my $cxn ( @cxns ) { |
637 | my $dbh = $cxn->dbh(); |
638 | - my $sql = q{SELECT @@server_id}; |
639 | + |
640 | + my $sql = $self->is_cluster_node($cxn) ? q{SELECT @@wsrep_node_incoming_address} : q{SELECT @@server_id}; |
641 | PTDEBUG && _d($sql); |
642 | my ($id) = $dbh->selectrow_array($sql); |
643 | PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); |
644 | @@ -8183,6 +8202,6 @@ |
645 | |
646 | =head1 VERSION |
647 | |
648 | -pt-kill 2.2.11 |
649 | +pt-kill 2.2.12 |
650 | |
651 | =cut |
652 | |
653 | === modified file 'bin/pt-mext' |
654 | --- bin/pt-mext 2014-09-25 13:48:22 +0000 |
655 | +++ bin/pt-mext 2014-11-14 14:12:25 +0000 |
656 | @@ -251,34 +251,38 @@ |
657 | _parse_pod() { |
658 | local file="$1" |
659 | |
660 | - cat "$file" | PO_DIR="$PO_DIR" perl -ne ' |
661 | - BEGIN { $/ = ""; } |
662 | - next unless $_ =~ m/^=head1 OPTIONS/; |
663 | - while ( defined(my $para = <>) ) { |
664 | - last if $para =~ m/^=head1/; |
665 | - chomp; |
666 | - if ( $para =~ m/^=item --(\S+)/ ) { |
667 | - my $opt = $1; |
668 | - my $file = "$ENV{PO_DIR}/$opt"; |
669 | - open my $opt_fh, ">", $file or die "Cannot open $file: $!"; |
670 | - print $opt_fh "long:$opt\n"; |
671 | - $para = <>; |
672 | + PO_FILE="$file" PO_DIR="$PO_DIR" perl -e ' |
673 | + $/ = ""; |
674 | + my $file = $ENV{PO_FILE}; |
675 | + open my $fh, "<", $file or die "Cannot open $file: $!"; |
676 | + while ( defined(my $para = <$fh>) ) { |
677 | + next unless $para =~ m/^=head1 OPTIONS/; |
678 | + while ( defined(my $para = <$fh>) ) { |
679 | + last if $para =~ m/^=head1/; |
680 | chomp; |
681 | - if ( $para =~ m/^[a-z ]+:/ ) { |
682 | - map { |
683 | + if ( $para =~ m/^=item --(\S+)/ ) { |
684 | + my $opt = $1; |
685 | + my $file = "$ENV{PO_DIR}/$opt"; |
686 | + open my $opt_fh, ">", $file or die "Cannot open $file: $!"; |
687 | + print $opt_fh "long:$opt\n"; |
688 | + $para = <$fh>; |
689 | + chomp; |
690 | + if ( $para =~ m/^[a-z ]+:/ ) { |
691 | + map { |
692 | + chomp; |
693 | + my ($attrib, $val) = split(/: /, $_); |
694 | + print $opt_fh "$attrib:$val\n"; |
695 | + } split(/; /, $para); |
696 | + $para = <$fh>; |
697 | chomp; |
698 | - my ($attrib, $val) = split(/: /, $_); |
699 | - print $opt_fh "$attrib:$val\n"; |
700 | - } split(/; /, $para); |
701 | - $para = <>; |
702 | - chomp; |
703 | + } |
704 | + my ($desc) = $para =~ m/^([^?.]+)/; |
705 | + print $opt_fh "desc:$desc.\n"; |
706 | + close $opt_fh; |
707 | } |
708 | - my ($desc) = $para =~ m/^([^?.]+)/; |
709 | - print $opt_fh "desc:$desc.\n"; |
710 | - close $opt_fh; |
711 | } |
712 | + last; |
713 | } |
714 | - last; |
715 | ' |
716 | } |
717 | |
718 | @@ -348,6 +352,8 @@ |
719 | |
720 | [ "$config_opt" = "" ] && continue |
721 | |
722 | + echo "$config_opt" | grep -v 'version-check' >/dev/null 2>&1 || continue |
723 | + |
724 | if ! [ "$HAVE_EXT_ARGV" ]; then |
725 | config_opt="--$config_opt" |
726 | fi |
727 | @@ -792,7 +798,7 @@ |
728 | |
729 | =head1 VERSION |
730 | |
731 | -pt-mext 2.2.11 |
732 | +pt-mext 2.2.12 |
733 | |
734 | =cut |
735 | |
736 | |
737 | === modified file 'bin/pt-mysql-summary' |
738 | --- bin/pt-mysql-summary 2014-09-25 13:48:22 +0000 |
739 | +++ bin/pt-mysql-summary 2014-11-14 14:12:25 +0000 |
740 | @@ -313,6 +313,8 @@ |
741 | |
742 | [ "$config_opt" = "" ] && continue |
743 | |
744 | + echo "$config_opt" | grep -v 'version-check' >/dev/null 2>&1 || continue |
745 | + |
746 | if ! [ "$HAVE_EXT_ARGV" ]; then |
747 | config_opt="--$config_opt" |
748 | fi |
749 | @@ -3083,7 +3085,7 @@ |
750 | |
751 | =head1 VERSION |
752 | |
753 | -pt-mysql-summary 2.2.11 |
754 | +pt-mysql-summary 2.2.12 |
755 | |
756 | =cut |
757 | |
758 | |
759 | === modified file 'bin/pt-online-schema-change' |
760 | --- bin/pt-online-schema-change 2014-09-25 13:48:22 +0000 |
761 | +++ bin/pt-online-schema-change 2014-11-14 14:12:25 +0000 |
762 | @@ -54,7 +54,7 @@ |
763 | { |
764 | package Percona::Toolkit; |
765 | |
766 | -our $VERSION = '2.2.11'; |
767 | +our $VERSION = '2.2.12'; |
768 | |
769 | use strict; |
770 | use warnings FATAL => 'all'; |
771 | @@ -3755,7 +3755,7 @@ |
772 | set => $args{set}, |
773 | NAME_lc => defined($args{NAME_lc}) ? $args{NAME_lc} : 1, |
774 | dbh_set => 0, |
775 | - ask_pass => $o->get('ask-pass'), |
776 | + ask_pass => $args{ask_pass}, |
777 | DSNParser => $dp, |
778 | is_cluster_node => undef, |
779 | parent => $args{parent}, |
780 | @@ -3766,12 +3766,12 @@ |
781 | |
782 | sub connect { |
783 | my ( $self, %opts ) = @_; |
784 | - my $dsn = $self->{dsn}; |
785 | + my $dsn = $opts{dsn} || $self->{dsn}; |
786 | my $dp = $self->{DSNParser}; |
787 | |
788 | my $dbh = $self->{dbh}; |
789 | if ( !$dbh || !$dbh->ping() ) { |
790 | - if ( $self->{ask_pass} && !$self->{asked_for_pass} && !defined $dsn->{p}) { |
791 | + if ( $self->{ask_pass} && !$self->{asked_for_pass} ) { |
792 | $dsn->{p} = OptionParser::prompt_noecho("Enter MySQL password: "); |
793 | $self->{asked_for_pass} = 1; |
794 | } |
795 | @@ -3785,6 +3785,13 @@ |
796 | } |
797 | |
798 | $dbh = $self->set_dbh($dbh); |
799 | + if ( $opts{dsn} ) { |
800 | + $self->{dsn} = $dsn; |
801 | + $self->{dsn_name} = $dp->as_string($dsn, [qw(h P S)]) |
802 | + || $dp->as_string($dsn, [qw(F)]) |
803 | + || ''; |
804 | + |
805 | + } |
806 | PTDEBUG && _d($dbh, 'Connected dbh to', $self->{hostname},$self->{dsn_name}); |
807 | return $dbh; |
808 | } |
809 | @@ -3846,6 +3853,17 @@ |
810 | return $self->{hostname} || $self->{dsn_name} || 'unknown host'; |
811 | } |
812 | |
813 | +sub is_cluster_node { |
814 | + my ($self, $cxn) = @_; |
815 | + |
816 | + my $sql = "SHOW VARIABLES LIKE 'wsrep\_on'"; |
817 | + PTDEBUG && _d($cxn->name, $sql); |
818 | + my $row = $cxn->dbh->selectrow_arrayref($sql); |
819 | + PTDEBUG && _d(Dumper($row)); |
820 | + return $row && $row->[1] && ($row->[1] eq 'ON' || $row->[1] eq '1') ? 1 : 0; |
821 | + |
822 | +} |
823 | + |
824 | sub remove_duplicate_cxns { |
825 | my ($self, %args) = @_; |
826 | my @cxns = @{$args{cxns}}; |
827 | @@ -3855,7 +3873,8 @@ |
828 | |
829 | for my $cxn ( @cxns ) { |
830 | my $dbh = $cxn->dbh(); |
831 | - my $sql = q{SELECT @@server_id}; |
832 | + |
833 | + my $sql = $self->is_cluster_node($cxn) ? q{SELECT @@wsrep_node_incoming_address} : q{SELECT @@server_id}; |
834 | PTDEBUG && _d($sql); |
835 | my ($id) = $dbh->selectrow_array($sql); |
836 | PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); |
837 | @@ -7638,8 +7657,26 @@ |
838 | sub remove_duplicate_cxns { |
839 | my ($self, %args) = @_; |
840 | my @cxns = @{$args{cxns}}; |
841 | - my $seen_ids = $args{seen_ids}; |
842 | - return Cxn->remove_duplicate_cxns(%args); |
843 | + my $seen_ids = $args{seen_ids} || {}; |
844 | + PTDEBUG && _d("Removing duplicates nodes from ", join(" ", map { $_->name } @cxns)); |
845 | + my @trimmed_cxns; |
846 | + |
847 | + for my $cxn ( @cxns ) { |
848 | + my $dbh = $cxn->dbh(); |
849 | + my $sql = $self->is_cluster_node($cxn) ? q{SELECT @@wsrep_node_incoming_address} : q{SELECT @@server_id}; |
850 | + PTDEBUG && _d($sql); |
851 | + my ($id) = $dbh->selectrow_array($sql); |
852 | + PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); |
853 | + |
854 | + if ( ! $seen_ids->{$id}++ ) { |
855 | + push @trimmed_cxns, $cxn |
856 | + } |
857 | + else { |
858 | + PTDEBUG && _d("Removing ", $cxn->name, |
859 | + ", ID ", $id, ", because we've already seen it"); |
860 | + } |
861 | + } |
862 | + return \@trimmed_cxns; |
863 | } |
864 | |
865 | sub same_cluster { |
866 | @@ -10556,6 +10593,12 @@ |
867 | |
868 | =item * |
869 | |
870 | +In most cases the tool will refuse to operate unless a PRIMARY KEY or UNIQUE INDEX is |
871 | +present in the table. See L<"--alter"> for details. |
872 | + |
873 | + |
874 | +=item * |
875 | + |
876 | The tool refuses to operate if it detects replication filters. See |
877 | L<"--[no]check-replication-filters"> for details. |
878 | |
879 | @@ -10634,6 +10677,16 @@ |
880 | |
881 | =item * |
882 | |
883 | +In almost all cases a PRIMARY KEY or UNIQUE INDEX needs to be present in the table. |
884 | +This is necessary because the tool creates a DELETE trigger to keep the new table |
885 | +updated while the process is running. |
886 | + |
887 | +A notable exception is when a PRIMARY KEY or UNIQUE INDEX is being created from |
888 | +B<existing columns> as part of the ALTER clause; in that case it will use these |
889 | +column(s) for the DELETE trigger. |
890 | + |
891 | +=item * |
892 | + |
893 | The C<RENAME> clause cannot be used to rename the table. |
894 | |
895 | =item * |
896 | @@ -11563,6 +11616,6 @@ |
897 | |
898 | =head1 VERSION |
899 | |
900 | -pt-online-schema-change 2.2.11 |
901 | +pt-online-schema-change 2.2.12 |
902 | |
903 | =cut |
904 | |
905 | === modified file 'bin/pt-pmp' |
906 | --- bin/pt-pmp 2014-09-25 13:48:22 +0000 |
907 | +++ bin/pt-pmp 2014-11-14 14:12:25 +0000 |
908 | @@ -129,9 +129,10 @@ |
909 | |
910 | usage_or_errors() { |
911 | local file="$1" |
912 | + local version="" |
913 | |
914 | if [ "$OPT_VERSION" ]; then |
915 | - local version=$(grep '^pt-[^ ]\+ [0-9]' "$file") |
916 | + version=$(grep '^pt-[^ ]\+ [0-9]' "$file") |
917 | echo "$version" |
918 | return 1 |
919 | fi |
920 | @@ -353,6 +354,8 @@ |
921 | |
922 | [ "$config_opt" = "" ] && continue |
923 | |
924 | + echo "$config_opt" | grep -v 'version-check' >/dev/null 2>&1 || continue |
925 | + |
926 | if ! [ "$HAVE_EXT_ARGV" ]; then |
927 | config_opt="--$config_opt" |
928 | fi |
929 | @@ -889,7 +892,7 @@ |
930 | |
931 | =head1 VERSION |
932 | |
933 | -pt-pmp 2.2.11 |
934 | +pt-pmp 2.2.12 |
935 | |
936 | =cut |
937 | |
938 | |
939 | === modified file 'bin/pt-query-digest' |
940 | --- bin/pt-query-digest 2014-09-25 13:48:22 +0000 |
941 | +++ bin/pt-query-digest 2014-11-14 14:12:25 +0000 |
942 | @@ -64,7 +64,7 @@ |
943 | { |
944 | package Percona::Toolkit; |
945 | |
946 | -our $VERSION = '2.2.11'; |
947 | +our $VERSION = '2.2.12'; |
948 | |
949 | use strict; |
950 | use warnings FATAL => 'all'; |
951 | @@ -13181,6 +13181,13 @@ |
952 | if ( $fh ) { |
953 | PTDEBUG && _d('Reading', $filename); |
954 | PTDEBUG && _d('File size:', $filesize); |
955 | + # catch if user is trying to use an uncoverted (raw) binlog # issue 1377888 |
956 | + if ( $filename && $o->get('type')->[0] eq 'binlog') { |
957 | + if (is_raw_binlog($filename)) { |
958 | + warn "Binlog file $filename must first be converted to text format using mysqlbinlog"; |
959 | + return 1; |
960 | + } |
961 | + } |
962 | push @read_files, { name => ($filename || "STDIN"), size => $filesize }; |
963 | |
964 | # Read the file offset for --resume. |
965 | @@ -14722,6 +14729,14 @@ |
966 | return; |
967 | } |
968 | |
969 | +# make an effort to check if file is a raw binlog |
970 | +# (i.e. was not converted to text using mysqlbinlog) |
971 | +sub is_raw_binlog { |
972 | + my $filename = shift; |
973 | + |
974 | + return -B $filename; |
975 | +} |
976 | + |
977 | sub _d { |
978 | my ($package, undef, $line) = caller 0; |
979 | @_ = map { (my $temp = $_) =~ s/\n/\n# /g; $temp; } |
980 | @@ -14798,7 +14813,8 @@ |
981 | |
982 | pt-query-digest is a sophisticated but easy to use tool for analyzing |
983 | MySQL queries. It can analyze queries from MySQL slow, general, and binary |
984 | -logs, as well as C<SHOW PROCESSLIST> and MySQL protocol data from tcpdump. |
985 | +logs. (Binary logs must first be converted to text, see L<"--type">). |
986 | +It can also use C<SHOW PROCESSLIST> and MySQL protocol data from tcpdump. |
987 | By default, the tool reports which queries are the slowest, and therefore |
988 | the most important to optimize. More complex and custom-tailored reports |
989 | can be created by using options like L<"--group-by">, L<"--filter">, and |
990 | @@ -16134,7 +16150,13 @@ |
991 | |
992 | =item binlog |
993 | |
994 | -Parse a binary log file. |
995 | +Parse a binary log file that has first been converted to text using mysqlbinlog. |
996 | + |
997 | +For example: |
998 | + |
999 | + mysqlbinlog mysql-bin.000441 > mysql-bin.000441.txt |
1000 | + |
1001 | + pt-query-digest --type binlog mysql-bin.000441.txt |
1002 | |
1003 | =item genlog |
1004 | |
1005 | @@ -16595,6 +16617,6 @@ |
1006 | |
1007 | =head1 VERSION |
1008 | |
1009 | -pt-query-digest 2.2.11 |
1010 | +pt-query-digest 2.2.12 |
1011 | |
1012 | =cut |
1013 | |
1014 | === modified file 'bin/pt-show-grants' |
1015 | --- bin/pt-show-grants 2014-09-25 13:48:22 +0000 |
1016 | +++ bin/pt-show-grants 2014-11-14 14:12:25 +0000 |
1017 | @@ -903,6 +903,14 @@ |
1018 | $parse = 0; |
1019 | next LINE; |
1020 | } |
1021 | + |
1022 | + if ( $parse |
1023 | + && !$self->has('version-check') |
1024 | + && $line =~ /version-check/ |
1025 | + ) { |
1026 | + next LINE; |
1027 | + } |
1028 | + |
1029 | if ( $parse |
1030 | && (my($opt, $arg) = $line =~ m/^\s*([^=\s]+?)(?:\s*=\s*(.*?)\s*)?$/) |
1031 | ) { |
1032 | @@ -2406,6 +2414,6 @@ |
1033 | |
1034 | =head1 VERSION |
1035 | |
1036 | -pt-show-grants 2.2.11 |
1037 | +pt-show-grants 2.2.12 |
1038 | |
1039 | =cut |
1040 | |
1041 | === modified file 'bin/pt-sift' |
1042 | --- bin/pt-sift 2014-09-25 13:48:22 +0000 |
1043 | +++ bin/pt-sift 2014-11-14 14:12:25 +0000 |
1044 | @@ -127,9 +127,10 @@ |
1045 | |
1046 | usage_or_errors() { |
1047 | local file="$1" |
1048 | + local version="" |
1049 | |
1050 | if [ "$OPT_VERSION" ]; then |
1051 | - local version=$(grep '^pt-[^ ]\+ [0-9]' "$file") |
1052 | + version=$(grep '^pt-[^ ]\+ [0-9]' "$file") |
1053 | echo "$version" |
1054 | return 1 |
1055 | fi |
1056 | @@ -351,6 +352,8 @@ |
1057 | |
1058 | [ "$config_opt" = "" ] && continue |
1059 | |
1060 | + echo "$config_opt" | grep -v 'version-check' >/dev/null 2>&1 || continue |
1061 | + |
1062 | if ! [ "$HAVE_EXT_ARGV" ]; then |
1063 | config_opt="--$config_opt" |
1064 | fi |
1065 | @@ -1237,7 +1240,7 @@ |
1066 | |
1067 | =head1 VERSION |
1068 | |
1069 | -pt-sift 2.2.11 |
1070 | +pt-sift 2.2.12 |
1071 | |
1072 | =cut |
1073 | |
1074 | |
1075 | === modified file 'bin/pt-slave-delay' |
1076 | --- bin/pt-slave-delay 2014-09-25 13:48:22 +0000 |
1077 | +++ bin/pt-slave-delay 2014-11-14 14:12:25 +0000 |
1078 | @@ -40,7 +40,7 @@ |
1079 | { |
1080 | package Percona::Toolkit; |
1081 | |
1082 | -our $VERSION = '2.2.11'; |
1083 | +our $VERSION = '2.2.12'; |
1084 | |
1085 | use strict; |
1086 | use warnings FATAL => 'all'; |
1087 | @@ -4869,6 +4869,6 @@ |
1088 | |
1089 | =head1 VERSION |
1090 | |
1091 | -pt-slave-delay 2.2.11 |
1092 | +pt-slave-delay 2.2.12 |
1093 | |
1094 | =cut |
1095 | |
1096 | === modified file 'bin/pt-slave-find' |
1097 | --- bin/pt-slave-find 2014-09-25 13:48:22 +0000 |
1098 | +++ bin/pt-slave-find 2014-11-14 14:12:25 +0000 |
1099 | @@ -911,6 +911,14 @@ |
1100 | $parse = 0; |
1101 | next LINE; |
1102 | } |
1103 | + |
1104 | + if ( $parse |
1105 | + && !$self->has('version-check') |
1106 | + && $line =~ /version-check/ |
1107 | + ) { |
1108 | + next LINE; |
1109 | + } |
1110 | + |
1111 | if ( $parse |
1112 | && (my($opt, $arg) = $line =~ m/^\s*([^=\s]+?)(?:\s*=\s*(.*?)\s*)?$/) |
1113 | ) { |
1114 | @@ -4334,6 +4342,6 @@ |
1115 | |
1116 | =head1 VERSION |
1117 | |
1118 | -pt-slave-find 2.2.11 |
1119 | +pt-slave-find 2.2.12 |
1120 | |
1121 | =cut |
1122 | |
1123 | === modified file 'bin/pt-slave-restart' |
1124 | --- bin/pt-slave-restart 2014-09-25 13:48:22 +0000 |
1125 | +++ bin/pt-slave-restart 2014-11-14 14:12:25 +0000 |
1126 | @@ -41,7 +41,7 @@ |
1127 | { |
1128 | package Percona::Toolkit; |
1129 | |
1130 | -our $VERSION = '2.2.11'; |
1131 | +our $VERSION = '2.2.12'; |
1132 | |
1133 | use strict; |
1134 | use warnings FATAL => 'all'; |
1135 | @@ -5937,6 +5937,6 @@ |
1136 | |
1137 | =head1 VERSION |
1138 | |
1139 | -pt-slave-restart 2.2.11 |
1140 | +pt-slave-restart 2.2.12 |
1141 | |
1142 | =cut |
1143 | |
1144 | === modified file 'bin/pt-stalk' |
1145 | --- bin/pt-stalk 2014-09-25 13:48:22 +0000 |
1146 | +++ bin/pt-stalk 2014-11-14 14:12:25 +0000 |
1147 | @@ -140,9 +140,10 @@ |
1148 | |
1149 | usage_or_errors() { |
1150 | local file="$1" |
1151 | + local version="" |
1152 | |
1153 | if [ "$OPT_VERSION" ]; then |
1154 | - local version=$(grep '^pt-[^ ]\+ [0-9]' "$file") |
1155 | + version=$(grep '^pt-[^ ]\+ [0-9]' "$file") |
1156 | echo "$version" |
1157 | return 1 |
1158 | fi |
1159 | @@ -364,6 +365,8 @@ |
1160 | |
1161 | [ "$config_opt" = "" ] && continue |
1162 | |
1163 | + echo "$config_opt" | grep -v 'version-check' >/dev/null 2>&1 || continue |
1164 | + |
1165 | if ! [ "$HAVE_EXT_ARGV" ]; then |
1166 | config_opt="--$config_opt" |
1167 | fi |
1168 | @@ -779,6 +782,7 @@ |
1169 | CMD_SYSCTL="${CMD_SYSCTL:-"$(_which sysctl)"}" |
1170 | CMD_TCPDUMP="${CMD_TCPDUMP:-"$(_which tcpdump)"}" |
1171 | CMD_VMSTAT="${CMD_VMSTAT:-"$(_which vmstat)"}" |
1172 | +CMD_DMESG="${CMD_DMESG:-"$(_which dmesg)"}" |
1173 | |
1174 | [ -z "$CMD_SYSCTL" -a -x "/sbin/sysctl" ] && CMD_SYSCTL="/sbin/sysctl" |
1175 | |
1176 | @@ -862,6 +866,14 @@ |
1177 | if [ "$CMD_SYSCTL" ]; then |
1178 | $CMD_SYSCTL -a >> "$d/$p-sysctl" & |
1179 | fi |
1180 | + |
1181 | + # collect dmesg events from 60 seconds ago until present |
1182 | + if [ "$CMD_DMESG" ]; then |
1183 | + local UPTIME=`cat /proc/uptime | awk '{ print $1 }'` |
1184 | + local START_TIME=$(echo "$UPTIME 60" | awk '{print ($1 - $2)}') |
1185 | + $CMD_DMESG | perl -ne 'm/\[\s*(\d+)\./; if ($1 > '${START_TIME}') { print }' >> "$d/$p-dmesg" & |
1186 | + fi |
1187 | + |
1188 | local cnt=$(($OPT_RUN_TIME / $OPT_SLEEP_COLLECT)) |
1189 | if [ "$CMD_VMSTAT" ]; then |
1190 | $CMD_VMSTAT $OPT_SLEEP_COLLECT $cnt >> "$d/$p-vmstat" & |
1191 | @@ -876,6 +888,7 @@ |
1192 | $CMD_MPSTAT -P ALL $OPT_RUN_TIME 1 >> "$d/$p-mpstat-overall" & |
1193 | fi |
1194 | |
1195 | + |
1196 | $CMD_MYSQLADMIN $EXT_ARGV ext -i$OPT_SLEEP_COLLECT -c$cnt >>"$d/$p-mysqladmin" & |
1197 | local mysqladmin_pid=$! |
1198 | |
1199 | @@ -2225,7 +2238,7 @@ |
1200 | |
1201 | =head1 VERSION |
1202 | |
1203 | -pt-stalk 2.2.11 |
1204 | +pt-stalk 2.2.12 |
1205 | |
1206 | =cut |
1207 | |
1208 | |
1209 | === modified file 'bin/pt-summary' |
1210 | --- bin/pt-summary 2014-09-25 13:48:22 +0000 |
1211 | +++ bin/pt-summary 2014-11-14 14:12:25 +0000 |
1212 | @@ -320,6 +320,8 @@ |
1213 | |
1214 | [ "$config_opt" = "" ] && continue |
1215 | |
1216 | + echo "$config_opt" | grep -v 'version-check' >/dev/null 2>&1 || continue |
1217 | + |
1218 | if ! [ "$HAVE_EXT_ARGV" ]; then |
1219 | config_opt="--$config_opt" |
1220 | fi |
1221 | @@ -2691,7 +2693,7 @@ |
1222 | |
1223 | =head1 VERSION |
1224 | |
1225 | -pt-summary 2.2.11 |
1226 | +pt-summary 2.2.12 |
1227 | |
1228 | =cut |
1229 | |
1230 | |
1231 | === modified file 'bin/pt-table-checksum' |
1232 | --- bin/pt-table-checksum 2014-09-25 13:48:22 +0000 |
1233 | +++ bin/pt-table-checksum 2014-11-14 14:12:25 +0000 |
1234 | @@ -57,7 +57,7 @@ |
1235 | { |
1236 | package Percona::Toolkit; |
1237 | |
1238 | -our $VERSION = '2.2.11'; |
1239 | +our $VERSION = '2.2.12'; |
1240 | |
1241 | use strict; |
1242 | use warnings FATAL => 'all'; |
1243 | @@ -3533,7 +3533,7 @@ |
1244 | set => $args{set}, |
1245 | NAME_lc => defined($args{NAME_lc}) ? $args{NAME_lc} : 1, |
1246 | dbh_set => 0, |
1247 | - ask_pass => $o->get('ask-pass'), |
1248 | + ask_pass => $args{ask_pass}, |
1249 | DSNParser => $dp, |
1250 | is_cluster_node => undef, |
1251 | parent => $args{parent}, |
1252 | @@ -3544,7 +3544,7 @@ |
1253 | |
1254 | sub connect { |
1255 | my ( $self, %opts ) = @_; |
1256 | - my $dsn = $self->{dsn}; |
1257 | + my $dsn = $opts{dsn} || $self->{dsn}; |
1258 | my $dp = $self->{DSNParser}; |
1259 | |
1260 | my $dbh = $self->{dbh}; |
1261 | @@ -3563,6 +3563,13 @@ |
1262 | } |
1263 | |
1264 | $dbh = $self->set_dbh($dbh); |
1265 | + if ( $opts{dsn} ) { |
1266 | + $self->{dsn} = $dsn; |
1267 | + $self->{dsn_name} = $dp->as_string($dsn, [qw(h P S)]) |
1268 | + || $dp->as_string($dsn, [qw(F)]) |
1269 | + || ''; |
1270 | + |
1271 | + } |
1272 | PTDEBUG && _d($dbh, 'Connected dbh to', $self->{hostname},$self->{dsn_name}); |
1273 | return $dbh; |
1274 | } |
1275 | @@ -3624,6 +3631,17 @@ |
1276 | return $self->{hostname} || $self->{dsn_name} || 'unknown host'; |
1277 | } |
1278 | |
1279 | +sub is_cluster_node { |
1280 | + my ($self, $cxn) = @_; |
1281 | + |
1282 | + my $sql = "SHOW VARIABLES LIKE 'wsrep\_on'"; |
1283 | + PTDEBUG && _d($cxn->name, $sql); |
1284 | + my $row = $cxn->dbh->selectrow_arrayref($sql); |
1285 | + PTDEBUG && _d(Dumper($row)); |
1286 | + return $row && $row->[1] && ($row->[1] eq 'ON' || $row->[1] eq '1') ? 1 : 0; |
1287 | + |
1288 | +} |
1289 | + |
1290 | sub remove_duplicate_cxns { |
1291 | my ($self, %args) = @_; |
1292 | my @cxns = @{$args{cxns}}; |
1293 | @@ -3633,7 +3651,8 @@ |
1294 | |
1295 | for my $cxn ( @cxns ) { |
1296 | my $dbh = $cxn->dbh(); |
1297 | - my $sql = q{SELECT @@server_id}; |
1298 | + |
1299 | + my $sql = $self->is_cluster_node($cxn) ? q{SELECT @@wsrep_node_incoming_address} : q{SELECT @@server_id}; |
1300 | PTDEBUG && _d($sql); |
1301 | my ($id) = $dbh->selectrow_array($sql); |
1302 | PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); |
1303 | @@ -3788,8 +3807,26 @@ |
1304 | sub remove_duplicate_cxns { |
1305 | my ($self, %args) = @_; |
1306 | my @cxns = @{$args{cxns}}; |
1307 | - my $seen_ids = $args{seen_ids}; |
1308 | - return Cxn->remove_duplicate_cxns(%args); |
1309 | + my $seen_ids = $args{seen_ids} || {}; |
1310 | + PTDEBUG && _d("Removing duplicates nodes from ", join(" ", map { $_->name } @cxns)); |
1311 | + my @trimmed_cxns; |
1312 | + |
1313 | + for my $cxn ( @cxns ) { |
1314 | + my $dbh = $cxn->dbh(); |
1315 | + my $sql = $self->is_cluster_node($cxn) ? q{SELECT @@wsrep_node_incoming_address} : q{SELECT @@server_id}; |
1316 | + PTDEBUG && _d($sql); |
1317 | + my ($id) = $dbh->selectrow_array($sql); |
1318 | + PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); |
1319 | + |
1320 | + if ( ! $seen_ids->{$id}++ ) { |
1321 | + push @trimmed_cxns, $cxn |
1322 | + } |
1323 | + else { |
1324 | + PTDEBUG && _d("Removing ", $cxn->name, |
1325 | + ", ID ", $id, ", because we've already seen it"); |
1326 | + } |
1327 | + } |
1328 | + return \@trimmed_cxns; |
1329 | } |
1330 | |
1331 | sub same_cluster { |
1332 | @@ -9286,7 +9323,8 @@ |
1333 | my %seen_ids; |
1334 | for my $cxn ($master_cxn, @$slaves) { |
1335 | my $dbh = $cxn->dbh(); |
1336 | - my $sql = q{SELECT @@server_id}; |
1337 | + # if it's a cluster node we use its incoming address as id ( see https://bugs.launchpad.net/percona-toolkit/+bug/1217466 ) |
1338 | + my $sql = $cluster->is_cluster_node($cxn) ? q{SELECT @@wsrep_node_incoming_address} : q{SELECT @@server_id}; |
1339 | PTDEBUG && _d($cxn, $dbh, $sql); |
1340 | my ($id) = $dbh->selectrow_array($sql); |
1341 | $seen_ids{$id}++; |
1342 | @@ -9363,9 +9401,11 @@ |
1343 | |
1344 | if ( $cluster_name_for{$master_cxn} ) { |
1345 | if ( !@$slaves ) { |
1346 | - die $master_cxn->name() . " is a cluster node but no other nodes " |
1347 | - . "or regular replicas were found. Use --recursion-method=dsn " |
1348 | - . "to specify the other nodes in the cluster.\n"; |
1349 | + if ( ($o->get('recursion-method')->[0] || '') ne 'none' ) { |
1350 | + die $master_cxn->name() . " is a cluster node but no other nodes " |
1351 | + . "or regular replicas were found. Use --recursion-method=dsn " |
1352 | + . "to specify the other nodes in the cluster.\n"; |
1353 | + } |
1354 | } |
1355 | |
1356 | # Make sure the master and all node are in the same cluster. |
1357 | @@ -12240,9 +12280,13 @@ |
1358 | The C<dsn> column contains a replica DSN like it would be given on the command |
1359 | line, for example: C<"h=replica_host,u=repl_user,p=repl_pass">. |
1360 | |
1361 | -The C<none> method prevents the tool from connecting to any replicas. |
1362 | -This effectively disables all the L<"REPLICA CHECKS"> because there will |
1363 | -not be any replicas to check. Therefore, this method is not recommended. |
1364 | +The C<none> method makes the tool ignore all slaves and cluster nodes. This |
1365 | +method is not recommended because it effectively disables the |
1366 | +L<"REPLICA CHECKS"> and no differences can be found. It is useful, however, if |
1367 | +you only need to write checksums on the master or a single cluster node. The |
1368 | +safer alternative is C<--no-replicate-check>: the tool finds replicas and |
1369 | +cluster nodes, performs the L<"REPLICA CHECKS">, but does not check for |
1370 | +differences. See L<"--[no]replicate-check">. |
1371 | |
1372 | =item --replicate |
1373 | |
1374 | @@ -12698,6 +12742,6 @@ |
1375 | |
1376 | =head1 VERSION |
1377 | |
1378 | -pt-table-checksum 2.2.11 |
1379 | +pt-table-checksum 2.2.12 |
1380 | |
1381 | =cut |
1382 | |
1383 | === modified file 'bin/pt-table-sync' |
1384 | --- bin/pt-table-sync 2014-09-25 13:48:22 +0000 |
1385 | +++ bin/pt-table-sync 2014-11-14 14:12:25 +0000 |
1386 | @@ -55,7 +55,7 @@ |
1387 | { |
1388 | package Percona::Toolkit; |
1389 | |
1390 | -our $VERSION = '2.2.11'; |
1391 | +our $VERSION = '2.2.12'; |
1392 | |
1393 | use strict; |
1394 | use warnings FATAL => 'all'; |
1395 | @@ -12768,6 +12768,6 @@ |
1396 | |
1397 | =head1 VERSION |
1398 | |
1399 | -pt-table-sync 2.2.11 |
1400 | +pt-table-sync 2.2.12 |
1401 | |
1402 | =cut |
1403 | |
1404 | === modified file 'bin/pt-table-usage' |
1405 | --- bin/pt-table-usage 2014-09-25 13:48:22 +0000 |
1406 | +++ bin/pt-table-usage 2014-11-14 14:12:25 +0000 |
1407 | @@ -1340,6 +1340,14 @@ |
1408 | $parse = 0; |
1409 | next LINE; |
1410 | } |
1411 | + |
1412 | + if ( $parse |
1413 | + && !$self->has('version-check') |
1414 | + && $line =~ /version-check/ |
1415 | + ) { |
1416 | + next LINE; |
1417 | + } |
1418 | + |
1419 | if ( $parse |
1420 | && (my($opt, $arg) = $line =~ m/^\s*([^=\s]+?)(?:\s*=\s*(.*?)\s*)?$/) |
1421 | ) { |
1422 | @@ -7563,6 +7571,6 @@ |
1423 | |
1424 | =head1 VERSION |
1425 | |
1426 | -pt-table-usage 2.2.11 |
1427 | +pt-table-usage 2.2.12 |
1428 | |
1429 | =cut |
1430 | |
1431 | === modified file 'bin/pt-upgrade' |
1432 | --- bin/pt-upgrade 2014-09-25 13:48:22 +0000 |
1433 | +++ bin/pt-upgrade 2014-11-14 14:12:25 +0000 |
1434 | @@ -61,7 +61,7 @@ |
1435 | { |
1436 | package Percona::Toolkit; |
1437 | |
1438 | -our $VERSION = '2.2.11'; |
1439 | +our $VERSION = '2.2.12'; |
1440 | |
1441 | use strict; |
1442 | use warnings FATAL => 'all'; |
1443 | @@ -2464,7 +2464,7 @@ |
1444 | set => $args{set}, |
1445 | NAME_lc => defined($args{NAME_lc}) ? $args{NAME_lc} : 1, |
1446 | dbh_set => 0, |
1447 | - ask_pass => $o->get('ask-pass'), |
1448 | + ask_pass => $args{ask_pass}, |
1449 | DSNParser => $dp, |
1450 | is_cluster_node => undef, |
1451 | parent => $args{parent}, |
1452 | @@ -2475,7 +2475,7 @@ |
1453 | |
1454 | sub connect { |
1455 | my ( $self, %opts ) = @_; |
1456 | - my $dsn = $self->{dsn}; |
1457 | + my $dsn = $opts{dsn} || $self->{dsn}; |
1458 | my $dp = $self->{DSNParser}; |
1459 | |
1460 | my $dbh = $self->{dbh}; |
1461 | @@ -2494,6 +2494,13 @@ |
1462 | } |
1463 | |
1464 | $dbh = $self->set_dbh($dbh); |
1465 | + if ( $opts{dsn} ) { |
1466 | + $self->{dsn} = $dsn; |
1467 | + $self->{dsn_name} = $dp->as_string($dsn, [qw(h P S)]) |
1468 | + || $dp->as_string($dsn, [qw(F)]) |
1469 | + || ''; |
1470 | + |
1471 | + } |
1472 | PTDEBUG && _d($dbh, 'Connected dbh to', $self->{hostname},$self->{dsn_name}); |
1473 | return $dbh; |
1474 | } |
1475 | @@ -2555,6 +2562,17 @@ |
1476 | return $self->{hostname} || $self->{dsn_name} || 'unknown host'; |
1477 | } |
1478 | |
1479 | +sub is_cluster_node { |
1480 | + my ($self, $cxn) = @_; |
1481 | + |
1482 | + my $sql = "SHOW VARIABLES LIKE 'wsrep\_on'"; |
1483 | + PTDEBUG && _d($cxn->name, $sql); |
1484 | + my $row = $cxn->dbh->selectrow_arrayref($sql); |
1485 | + PTDEBUG && _d(Dumper($row)); |
1486 | + return $row && $row->[1] && ($row->[1] eq 'ON' || $row->[1] eq '1') ? 1 : 0; |
1487 | + |
1488 | +} |
1489 | + |
1490 | sub remove_duplicate_cxns { |
1491 | my ($self, %args) = @_; |
1492 | my @cxns = @{$args{cxns}}; |
1493 | @@ -2564,7 +2582,8 @@ |
1494 | |
1495 | for my $cxn ( @cxns ) { |
1496 | my $dbh = $cxn->dbh(); |
1497 | - my $sql = q{SELECT @@server_id}; |
1498 | + |
1499 | + my $sql = $self->is_cluster_node($cxn) ? q{SELECT @@wsrep_node_incoming_address} : q{SELECT @@server_id}; |
1500 | PTDEBUG && _d($sql); |
1501 | my ($id) = $dbh->selectrow_array($sql); |
1502 | PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); |
1503 | @@ -11240,6 +11259,6 @@ |
1504 | |
1505 | =head1 VERSION |
1506 | |
1507 | -pt-upgrade 2.2.11 |
1508 | +pt-upgrade 2.2.12 |
1509 | |
1510 | =cut |
1511 | |
1512 | === modified file 'bin/pt-variable-advisor' |
1513 | --- bin/pt-variable-advisor 2014-09-25 13:48:22 +0000 |
1514 | +++ bin/pt-variable-advisor 2014-11-14 14:12:25 +0000 |
1515 | @@ -44,7 +44,7 @@ |
1516 | { |
1517 | package Percona::Toolkit; |
1518 | |
1519 | -our $VERSION = '2.2.11'; |
1520 | +our $VERSION = '2.2.12'; |
1521 | |
1522 | use strict; |
1523 | use warnings FATAL => 'all'; |
1524 | @@ -6138,6 +6138,6 @@ |
1525 | |
1526 | =head1 VERSION |
1527 | |
1528 | -pt-variable-advisor 2.2.11 |
1529 | +pt-variable-advisor 2.2.12 |
1530 | |
1531 | =cut |
1532 | |
1533 | === modified file 'bin/pt-visual-explain' |
1534 | --- bin/pt-visual-explain 2014-09-25 13:48:22 +0000 |
1535 | +++ bin/pt-visual-explain 2014-11-14 14:12:25 +0000 |
1536 | @@ -1577,6 +1577,14 @@ |
1537 | $parse = 0; |
1538 | next LINE; |
1539 | } |
1540 | + |
1541 | + if ( $parse |
1542 | + && !$self->has('version-check') |
1543 | + && $line =~ /version-check/ |
1544 | + ) { |
1545 | + next LINE; |
1546 | + } |
1547 | + |
1548 | if ( $parse |
1549 | && (my($opt, $arg) = $line =~ m/^\s*([^=\s]+?)(?:\s*=\s*(.*?)\s*)?$/) |
1550 | ) { |
1551 | @@ -3243,6 +3251,6 @@ |
1552 | |
1553 | =head1 VERSION |
1554 | |
1555 | -pt-visual-explain 2.2.11 |
1556 | +pt-visual-explain 2.2.12 |
1557 | |
1558 | =cut |
1559 | |
1560 | === modified file 'config/deb/changelog' |
1561 | --- config/deb/changelog 2014-09-25 13:48:22 +0000 |
1562 | +++ config/deb/changelog 2014-11-14 14:12:25 +0000 |
1563 | @@ -1,3 +1,16 @@ |
1564 | +percona-toolkit (2.2.12) unstable; urgency=low |
1565 | + |
1566 | + * Fixed bug 1376561: pt-archiver is not able to archive all the rows when a table has a hash partition |
1567 | + * Fixed bug 1328686: pt-heartbeat check-read-only option does not prevent creates or inserts |
1568 | + * Fixed bug 1269695: pt-online-schema-change does not allow ALTER for a table without a non-unique, while manual does not explain this |
1569 | + * Fixed bug 1217466: pt-table-checksum refuses to run on PXC if server_id is the same on all nodes |
1570 | + * Fixed bug 1373937: pt-table-checksum requires recursion when working with and XtraDB Cluster node |
1571 | + * Fixed bug 1377888: pt-query-digest manual for --type binlog is ambiguous |
1572 | + * Fixed bug 1349086: pt-stalk should also gather dmesg output |
1573 | + * Fixed bug 1361293: Some scripts fail when no-version-check option is put in global config file |
1574 | + |
1575 | + -- Percona Toolkit Developers <toolkit-dev@percona.com> Tue, 11 Nov 2014 13:02:51 +0000 |
1576 | + |
1577 | percona-toolkit (2.2.11) unstable; urgency=low |
1578 | |
1579 | * Fixed bug 1262456: pt-query-digest doesn't report host details |
1580 | |
1581 | === modified file 'config/sphinx-build/conf.py' |
1582 | --- config/sphinx-build/conf.py 2014-09-25 13:48:22 +0000 |
1583 | +++ config/sphinx-build/conf.py 2014-11-14 14:12:25 +0000 |
1584 | @@ -50,7 +50,7 @@ |
1585 | # The short X.Y version. |
1586 | version = '2.2' |
1587 | # The full version, including alpha/beta/rc tags. |
1588 | -release = '2.2.11' |
1589 | +release = '2.2.12' |
1590 | |
1591 | # The language for content autogenerated by Sphinx. Refer to documentation |
1592 | # for a list of supported languages. |
1593 | |
1594 | === modified file 'docs/percona-toolkit.pod' |
1595 | --- docs/percona-toolkit.pod 2014-09-25 13:48:22 +0000 |
1596 | +++ docs/percona-toolkit.pod 2014-11-14 14:12:25 +0000 |
1597 | @@ -557,6 +557,6 @@ |
1598 | |
1599 | =head1 VERSION |
1600 | |
1601 | -Percona Toolkit v2.2.11 released 2014-09-25 |
1602 | +Percona Toolkit v2.2.12 released 2014-11-11 |
1603 | |
1604 | =cut |
1605 | |
1606 | === modified file 'docs/release_notes.rst' |
1607 | --- docs/release_notes.rst 2014-09-25 13:48:22 +0000 |
1608 | +++ docs/release_notes.rst 2014-11-14 14:12:25 +0000 |
1609 | @@ -1,6 +1,41 @@ |
1610 | Release Notes |
1611 | ************* |
1612 | |
1613 | +v2.2.12 released 2014-11-14 |
1614 | +=========================== |
1615 | + |
1616 | +Percona Toolkit 2.2.12 has been released. This release contains one new feature and seven bug fixes. |
1617 | + |
1618 | +New Features: |
1619 | + |
1620 | +* pt-stalk now gathers ``dmesg`` output from up to 60 seconds before the triggering event. |
1621 | + |
1622 | +Bugs Fixed: |
1623 | + |
1624 | +* Fixed bug 1376561: pt-archiver was not able to archive all the rows when a table had a hash partition. Fixed by implementing support for tables which have primary or unique indexes. |
1625 | + |
1626 | +* Fixed bug 1217466: pt-table-checksum would refuses to run on Percona XtraDB Cluster if ``server_id`` was the same on all nodes. Fixed by using the ``wsrep_node_incoming_address`` as a unique identifier for cluster nodes, instead of relying on ``server_id``. |
1627 | + |
1628 | +* Fixed bug 1269695: pt-online-schema-change documentation now contains more information about limitations on why it isn't running ``ALTER TABLE`` for a table which has only a non-unique index. |
1629 | + |
1630 | +* Fixed bug 1328686: Running pt-hearbeat with --check-read-only option would cause an error when running on server with ``read_only`` option. Tool now waits for server ``read_only`` status to be disabled before starting to run. |
1631 | + |
1632 | +* Fixed bug 1373937: pt-table-checksum now supports ``none`` as valid ``--recursion-method`` when using with Percona XtraDB Cluster. |
1633 | + |
1634 | +* Fixed bug 1377888: Documentation was stating that pt-query-digest is able to parse a raw binary log file, while it can only parse a file which was decoded with ``mysqlbinlog`` tool before. Fixed by improving the documentation and adding a check for binary file and providing a relevant error message. |
1635 | + |
1636 | +Changelog |
1637 | +--------- |
1638 | + |
1639 | +* Fixed bug 1376561: pt-archiver is not able to archive all the rows when a table has a hash partition |
1640 | +* Fixed bug 1328686: pt-heartbeat check-read-only option does not prevent creates or inserts |
1641 | +* Fixed bug 1269695: pt-online-schema-change does not allow ALTER for a table without a non-unique, while manual does not explain this |
1642 | +* Fixed bug 1217466: pt-table-checksum refuses to run on PXC if server_id is the same on all nodes |
1643 | +* Fixed bug 1373937: pt-table-checksum requires recursion when working with and XtraDB Cluster node |
1644 | +* Fixed bug 1377888: pt-query-digest manual for --type binlog is ambiguous |
1645 | +* Fixed bug 1349086: pt-stalk should also gather dmesg output |
1646 | +* Fixed bug 1361293: Some scripts fail when no-version-check option is put in global config file |
1647 | + |
1648 | v2.2.11 released 2014-09-26 |
1649 | =========================== |
1650 | |
1651 | |
1652 | === modified file 'lib/Cxn.pm' |
1653 | --- lib/Cxn.pm 2013-12-05 00:14:17 +0000 |
1654 | +++ lib/Cxn.pm 2014-11-14 14:12:25 +0000 |
1655 | @@ -226,6 +226,19 @@ |
1656 | return $self->{hostname} || $self->{dsn_name} || 'unknown host'; |
1657 | } |
1658 | |
1659 | +# This is used to help remove_duplicate_cxns detect cluster nodes |
1660 | +# (which often have unreliable server_id's) |
1661 | +sub is_cluster_node { |
1662 | + my ($self, $cxn) = @_; |
1663 | + |
1664 | + my $sql = "SHOW VARIABLES LIKE 'wsrep\_on'"; |
1665 | + PTDEBUG && _d($cxn->name, $sql); |
1666 | + my $row = $cxn->dbh->selectrow_arrayref($sql); |
1667 | + PTDEBUG && _d(Dumper($row)); |
1668 | + return $row && $row->[1] && ($row->[1] eq 'ON' || $row->[1] eq '1') ? 1 : 0; |
1669 | + |
1670 | +} |
1671 | + |
1672 | # There's two reasons why there might be dupes: |
1673 | # If the "master" is a cluster node, then a DSN table might have been |
1674 | # used, and it may have all nodes' DSNs so the user can run the tool |
1675 | @@ -233,7 +246,7 @@ |
1676 | # on the command line. |
1677 | # On the other hand, maybe find_cluster_nodes worked, in which case |
1678 | # we definitely have a dupe for the master cxn, but we may also have a |
1679 | -# dupe for every other node if this was unsed in conjunction with a |
1680 | +# dupe for every other node if this was used in conjunction with a |
1681 | # DSN table. |
1682 | # So try to detect and remove those. |
1683 | sub remove_duplicate_cxns { |
1684 | @@ -245,7 +258,11 @@ |
1685 | |
1686 | for my $cxn ( @cxns ) { |
1687 | my $dbh = $cxn->dbh(); |
1688 | - my $sql = q{SELECT @@server_id}; |
1689 | + |
1690 | + # Very often cluster nodes are configured with matching server_id's |
1691 | + # So in that case we'll use its incoming address as its unique identifier |
1692 | + # Note: this relies on "seen_ids" being populated using the same strategy |
1693 | + my $sql = $self->is_cluster_node($cxn) ? q{SELECT @@wsrep_node_incoming_address} : q{SELECT @@server_id}; |
1694 | PTDEBUG && _d($sql); |
1695 | my ($id) = $dbh->selectrow_array($sql); |
1696 | PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); |
1697 | |
1698 | === modified file 'lib/OptionParser.pm' |
1699 | --- lib/OptionParser.pm 2014-05-24 21:36:33 +0000 |
1700 | +++ lib/OptionParser.pm 2014-11-14 14:12:25 +0000 |
1701 | @@ -1132,6 +1132,16 @@ |
1702 | $parse = 0; |
1703 | next LINE; |
1704 | } |
1705 | + |
1706 | + # Silently ignore option [no]-version-check if it is unsupported and it comes from a config file |
1707 | + # TODO: Ideally , this should be generalized for all unsupported options that come from global files |
1708 | + if ( $parse |
1709 | + && !$self->has('version-check') |
1710 | + && $line =~ /version-check/ |
1711 | + ) { |
1712 | + next LINE; |
1713 | + } |
1714 | + |
1715 | if ( $parse |
1716 | && (my($opt, $arg) = $line =~ m/^\s*([^=\s]+?)(?:\s*=\s*(.*?)\s*)?$/) |
1717 | ) { |
1718 | |
1719 | === modified file 'lib/Percona/Toolkit.pm' |
1720 | --- lib/Percona/Toolkit.pm 2014-09-24 15:06:32 +0000 |
1721 | +++ lib/Percona/Toolkit.pm 2014-11-14 14:12:25 +0000 |
1722 | @@ -18,7 +18,7 @@ |
1723 | # ########################################################################### |
1724 | package Percona::Toolkit; |
1725 | |
1726 | -our $VERSION = '2.2.11'; |
1727 | +our $VERSION = '2.2.12'; |
1728 | |
1729 | use strict; |
1730 | use warnings FATAL => 'all'; |
1731 | |
1732 | === modified file 'lib/Percona/XtraDB/Cluster.pm' |
1733 | --- lib/Percona/XtraDB/Cluster.pm 2013-04-16 20:40:32 +0000 |
1734 | +++ lib/Percona/XtraDB/Cluster.pm 2014-11-14 14:12:25 +0000 |
1735 | @@ -132,8 +132,29 @@ |
1736 | sub remove_duplicate_cxns { |
1737 | my ($self, %args) = @_; |
1738 | my @cxns = @{$args{cxns}}; |
1739 | - my $seen_ids = $args{seen_ids}; |
1740 | - return Cxn->remove_duplicate_cxns(%args); |
1741 | + my $seen_ids = $args{seen_ids} || {}; |
1742 | + PTDEBUG && _d("Removing duplicates nodes from ", join(" ", map { $_->name } @cxns)); |
1743 | + my @trimmed_cxns; |
1744 | + |
1745 | + for my $cxn ( @cxns ) { |
1746 | + my $dbh = $cxn->dbh(); |
1747 | + # Very often cluster nodes are configured with matching server_id's |
1748 | + # So in that case we'll use its incoming address as its unique identifier |
1749 | + # Note: This relies on "seen_ids" being populated using the same strategy |
1750 | + my $sql = $self->is_cluster_node($cxn) ? q{SELECT @@wsrep_node_incoming_address} : q{SELECT @@server_id}; |
1751 | + PTDEBUG && _d($sql); |
1752 | + my ($id) = $dbh->selectrow_array($sql); |
1753 | + PTDEBUG && _d('Server ID for ', $cxn->name, ': ', $id); |
1754 | + |
1755 | + if ( ! $seen_ids->{$id}++ ) { |
1756 | + push @trimmed_cxns, $cxn |
1757 | + } |
1758 | + else { |
1759 | + PTDEBUG && _d("Removing ", $cxn->name, |
1760 | + ", ID ", $id, ", because we've already seen it"); |
1761 | + } |
1762 | + } |
1763 | + return \@trimmed_cxns; |
1764 | } |
1765 | |
1766 | sub same_cluster { |
1767 | |
1768 | === modified file 'lib/bash/collect.sh' |
1769 | --- lib/bash/collect.sh 2013-12-14 04:19:51 +0000 |
1770 | +++ lib/bash/collect.sh 2014-11-14 14:12:25 +0000 |
1771 | @@ -40,6 +40,7 @@ |
1772 | CMD_SYSCTL="${CMD_SYSCTL:-"$(_which sysctl)"}" |
1773 | CMD_TCPDUMP="${CMD_TCPDUMP:-"$(_which tcpdump)"}" |
1774 | CMD_VMSTAT="${CMD_VMSTAT:-"$(_which vmstat)"}" |
1775 | +CMD_DMESG="${CMD_DMESG:-"$(_which dmesg)"}" |
1776 | |
1777 | # Try to find command manually. |
1778 | [ -z "$CMD_SYSCTL" -a -x "/sbin/sysctl" ] && CMD_SYSCTL="/sbin/sysctl" |
1779 | @@ -146,6 +147,14 @@ |
1780 | if [ "$CMD_SYSCTL" ]; then |
1781 | $CMD_SYSCTL -a >> "$d/$p-sysctl" & |
1782 | fi |
1783 | + |
1784 | + # collect dmesg events from 60 seconds ago until present |
1785 | + if [ "$CMD_DMESG" ]; then |
1786 | + local UPTIME=`cat /proc/uptime | awk '{ print $1 }'` |
1787 | + local START_TIME=$(echo "$UPTIME 60" | awk '{print ($1 - $2)}') |
1788 | + $CMD_DMESG | perl -ne 'm/\[\s*(\d+)\./; if ($1 > '${START_TIME}') { print }' >> "$d/$p-dmesg" & |
1789 | + fi |
1790 | + |
1791 | local cnt=$(($OPT_RUN_TIME / $OPT_SLEEP_COLLECT)) |
1792 | if [ "$CMD_VMSTAT" ]; then |
1793 | $CMD_VMSTAT $OPT_SLEEP_COLLECT $cnt >> "$d/$p-vmstat" & |
1794 | |
1795 | === modified file 'lib/bash/parse_options.sh' |
1796 | --- lib/bash/parse_options.sh 2014-07-10 20:15:13 +0000 |
1797 | +++ lib/bash/parse_options.sh 2014-11-14 14:12:25 +0000 |
1798 | @@ -347,6 +347,9 @@ |
1799 | # Skip blank lines. |
1800 | [ "$config_opt" = "" ] && continue |
1801 | |
1802 | + # Skip global option [no]version-check which don't apply |
1803 | + echo "$config_opt" | grep -v 'version-check' >/dev/null 2>&1 || continue |
1804 | + |
1805 | # Options in a config file are not prefixed with --, |
1806 | # but command line options are, so one or the other has |
1807 | # to add or remove the -- prefix. We add it for config |
1808 | |
1809 | === modified file 't/lib/OptionParser.t' |
1810 | --- t/lib/OptionParser.t 2014-05-24 21:36:33 +0000 |
1811 | +++ t/lib/OptionParser.t 2014-11-14 14:12:25 +0000 |
1812 | @@ -2141,6 +2141,29 @@ |
1813 | 'prompt_no_echo outputs prompt to STDERR' |
1814 | ); |
1815 | |
1816 | +# ############################################################################# |
1817 | +# Issue 1361293: Global config file with no-version-check option makes tools |
1818 | +# that don't recognize the option fail. |
1819 | +# ############################################################################# |
1820 | +diag(`echo "no-version-check" > ~/.OptionParser.t.conf`); |
1821 | +$o = new OptionParser( |
1822 | + description => 'OptionParser.t parses command line options.', |
1823 | + usage => "$PROGRAM_NAME <options>" |
1824 | +); |
1825 | +$o->get_specs("$trunk/bin/pt-slave-find"), # doesn't have version-check option |
1826 | +$output = output( |
1827 | + sub { |
1828 | + $o->get_opts(); |
1829 | + }, |
1830 | + stderr=>1 |
1831 | + ); |
1832 | +unlike( |
1833 | + $output, |
1834 | + qr/Unknown option: no-version-check/, |
1835 | + 'no-version-check ignored if unsupported and in config file. issue 1361293' |
1836 | +); |
1837 | +diag(`rm -rf ~/.OptionParser.t.conf`); |
1838 | + |
1839 | |
1840 | |
1841 | # ############################################################################# |
1842 | |
1843 | === added file 't/lib/samples/binlogs/raw_binlog.log' |
1844 | Binary files t/lib/samples/binlogs/raw_binlog.log 1970-01-01 00:00:00 +0000 and t/lib/samples/binlogs/raw_binlog.log 2014-11-14 14:12:25 +0000 differ |
1845 | === modified file 't/pt-archiver/basics.t' |
1846 | --- t/pt-archiver/basics.t 2012-11-21 16:21:30 +0000 |
1847 | +++ t/pt-archiver/basics.t 2014-11-14 14:12:25 +0000 |
1848 | @@ -161,7 +161,7 @@ |
1849 | my $t = time - $t0; |
1850 | |
1851 | ok( |
1852 | - $t >= 2 && $t <= 3.5, |
1853 | + $t >= 2 && $t <= ($ENV{PERCONA_SLOW_BOX} ? 5 : 3), |
1854 | "--sleep between SELECT (bug 979092)" |
1855 | ) or diag($output, "t=", $t); |
1856 | |
1857 | |
1858 | === modified file 't/pt-archiver/indexes.t' |
1859 | --- t/pt-archiver/indexes.t 2012-06-03 17:54:32 +0000 |
1860 | +++ t/pt-archiver/indexes.t 2014-11-14 14:12:25 +0000 |
1861 | @@ -97,7 +97,7 @@ |
1862 | |
1863 | # Check ascending only first column |
1864 | $output = `$cmd --where 1=1 --dry-run --ascend-first --source D=test,t=table_5,F=$cnf --purge --limit 50 2>&1`; |
1865 | -like ( $output, qr/WHERE \(1=1\) AND \(\(`a` >= \?\)\) LIMIT/, 'Can ascend just first column'); |
1866 | +like ( $output, qr/WHERE \(1=1\) AND \(\(`a` >= \?\)\) ORDER BY `a`,`b`,`c`,`d` LIMIT/, 'Can ascend just first column'); |
1867 | |
1868 | # ############################################################################# |
1869 | # Done. |
1870 | |
1871 | === modified file 't/pt-archiver/samples/issue-248.txt' |
1872 | --- t/pt-archiver/samples/issue-248.txt 2011-06-24 22:02:05 +0000 |
1873 | +++ t/pt-archiver/samples/issue-248.txt 2014-11-14 14:12:25 +0000 |
1874 | @@ -1,3 +1,3 @@ |
1875 | -SELECT /*!40001 SQL_NO_CACHE */ `film_id`,`title`,`description`,`release_year`,`language_id`,`original_language_id`,`rental_duration`,`rental_rate`,`length`,`replacement_cost`,`rating`,`special_features`,`last_update` FROM `sakila`.`film` FORCE INDEX(`PRIMARY`) WHERE (film_id < 100) AND (`film_id` < '1000') LIMIT 1 |
1876 | -SELECT /*!40001 SQL_NO_CACHE */ `film_id`,`title`,`description`,`release_year`,`language_id`,`original_language_id`,`rental_duration`,`rental_rate`,`length`,`replacement_cost`,`rating`,`special_features`,`last_update` FROM `sakila`.`film` FORCE INDEX(`PRIMARY`) WHERE (film_id < 100) AND (`film_id` < '1000') AND ((`film_id` >= ?)) LIMIT 1 |
1877 | +SELECT /*!40001 SQL_NO_CACHE */ `film_id`,`title`,`description`,`release_year`,`language_id`,`original_language_id`,`rental_duration`,`rental_rate`,`length`,`replacement_cost`,`rating`,`special_features`,`last_update` FROM `sakila`.`film` FORCE INDEX(`PRIMARY`) WHERE (film_id < 100) AND (`film_id` < '1000') ORDER BY `film_id` LIMIT 1 |
1878 | +SELECT /*!40001 SQL_NO_CACHE */ `film_id`,`title`,`description`,`release_year`,`language_id`,`original_language_id`,`rental_duration`,`rental_rate`,`length`,`replacement_cost`,`rating`,`special_features`,`last_update` FROM `sakila`.`film` FORCE INDEX(`PRIMARY`) WHERE (film_id < 100) AND (`film_id` < '1000') AND ((`film_id` >= ?)) ORDER BY `film_id` LIMIT 1 |
1879 | DELETE FROM `sakila`.`film` WHERE (`film_id` = ?) |
1880 | |
1881 | === modified file 't/pt-query-digest/binlog_analyses.t' |
1882 | --- t/pt-query-digest/binlog_analyses.t 2014-07-02 20:55:31 +0000 |
1883 | +++ t/pt-query-digest/binlog_analyses.t 2014-11-14 14:12:25 +0000 |
1884 | @@ -9,7 +9,7 @@ |
1885 | use strict; |
1886 | use warnings FATAL => 'all'; |
1887 | use English qw(-no_match_vars); |
1888 | -use Test::More tests => 3; |
1889 | +use Test::More tests => 4; |
1890 | |
1891 | use PerconaTest; |
1892 | require "$trunk/bin/pt-query-digest"; |
1893 | @@ -46,6 +46,26 @@ |
1894 | 'Analysis for binlog011 - Handles 5.6 binlog with checksum CRC32', |
1895 | ) or diag($test_diff); |
1896 | |
1897 | + |
1898 | + |
1899 | +# ############################################################################# |
1900 | +# Issue 1377888: refuse to parse raw binary log |
1901 | +# ############################################################################# |
1902 | + |
1903 | +my $output = output( |
1904 | + sub { pt_query_digest::main(@args, "$trunk/t/lib/samples/binlogs/raw_binlog.log") }, |
1905 | + stderr => 1 |
1906 | +); |
1907 | + |
1908 | +like( |
1909 | + $output, |
1910 | + qr/mysqlbinlog/i, |
1911 | + 'Refuses to parse raw binlog file' |
1912 | +); |
1913 | + |
1914 | + |
1915 | + |
1916 | + |
1917 | # ############################################################################# |
1918 | # Done. |
1919 | # ############################################################################# |
1920 | |
1921 | === modified file 't/pt-table-checksum/pxc.t' |
1922 | --- t/pt-table-checksum/pxc.t 2013-04-12 15:58:10 +0000 |
1923 | +++ t/pt-table-checksum/pxc.t 2014-11-14 14:12:25 +0000 |
1924 | @@ -81,6 +81,17 @@ |
1925 | "Dies if no other nodes are found" |
1926 | ); |
1927 | |
1928 | + |
1929 | +($output, $exit_status) = full_output( |
1930 | + sub { pt_table_checksum::main(@args, '--recursion-method', 'none') }, |
1931 | + stderr => 1, |
1932 | +); |
1933 | + |
1934 | +ok ( |
1935 | + $output =~ qr/WARNING/i && !$exit_status, |
1936 | + "Warns but doesn't die if --recursion-method=none - issue #1373937" |
1937 | +); |
1938 | + |
1939 | for my $args ( |
1940 | ["using recusion-method=dsn", '--recursion-method', "dsn=$node1_dsn,D=dsns,t=dsns"], |
1941 | ["using recursion-method=cluster", '--recursion-method', 'cluster'] |
1942 | @@ -144,54 +155,89 @@ |
1943 | "Node3 not changed" |
1944 | ); |
1945 | |
1946 | -for my $args ( |
1947 | - ["using recusion-method=dsn", '--recursion-method', "dsn=$node1_dsn,D=dsns,t=dsns"], |
1948 | - ["using recursion-method=cluster", '--recursion-method', 'cluster'] |
1949 | - ) |
1950 | -{ |
1951 | - my $test = shift @$args; |
1952 | - |
1953 | - $output = output( |
1954 | - sub { pt_table_checksum::main(@args, |
1955 | - @$args) |
1956 | - }, |
1957 | - stderr => 1, |
1958 | - ); |
1959 | - |
1960 | - is( |
1961 | - PerconaTest::count_checksum_results($output, 'errors'), |
1962 | - 0, |
1963 | - "1 diff: no errors ($test)" |
1964 | - ); |
1965 | - |
1966 | - is( |
1967 | - PerconaTest::count_checksum_results($output, 'skipped'), |
1968 | - 0, |
1969 | - "1 diff: no skips ($test)" |
1970 | - ); |
1971 | - |
1972 | - is( |
1973 | - PerconaTest::count_checksum_results($output, 'diffs'), |
1974 | - 1, |
1975 | - "1 diff: 1 diff ($test)" |
1976 | - ) or diag($output); |
1977 | - |
1978 | - # 11-17T13:02:54 0 1 26 1 0 0.021 test.t |
1979 | - like( |
1980 | - $output, |
1981 | - qr/^\S+\s+ # ts |
1982 | - 0\s+ # errors |
1983 | - 1\s+ # diffs |
1984 | - 26\s+ # rows |
1985 | - \d+\s+ # chunks |
1986 | - 0\s+ # skipped |
1987 | - \S+\s+ # time |
1988 | - test.t$ # table |
1989 | - /xm, |
1990 | - "1 diff: it's in test.t ($test)" |
1991 | - ); |
1992 | +sub test_recursion_methods { |
1993 | + my $same_ids = shift; |
1994 | + |
1995 | + my ($orig_id_1, $orig_id_2, $orig_id_3); |
1996 | + |
1997 | + if ($same_ids) { |
1998 | + # save original values |
1999 | + my $sql = 'SELECT @@server_id'; |
2000 | + ($orig_id_1) = $node1->selectrow_array($sql); |
2001 | + ($orig_id_2) = $node2->selectrow_array($sql); |
2002 | + ($orig_id_3) = $node3->selectrow_array($sql); |
2003 | + # set server_id value to 1 on all nodes |
2004 | + $sql = 'SET GLOBAL server_id = 1'; |
2005 | + $node1->do($sql); |
2006 | + $node2->do($sql); |
2007 | + $node3->do($sql); |
2008 | + } |
2009 | + |
2010 | + for my $args ( |
2011 | + ["using recusion-method=dsn", '--recursion-method', "dsn=$node1_dsn,D=dsns,t=dsns"], |
2012 | + ["using recursion-method=cluster", '--recursion-method', 'cluster'] |
2013 | + ) |
2014 | + { |
2015 | + my $test = shift @$args; |
2016 | + $test = $same_ids ? $test.' - Nodes with different ids' : $test.' - Nodes with same ids'; |
2017 | + |
2018 | + $output = output( |
2019 | + sub { pt_table_checksum::main(@args, |
2020 | + @$args) |
2021 | + }, |
2022 | + stderr => 1, |
2023 | + ); |
2024 | + |
2025 | + is( |
2026 | + PerconaTest::count_checksum_results($output, 'errors'), |
2027 | + 0, |
2028 | + "1 diff: no errors ($test)" |
2029 | + ); |
2030 | + |
2031 | + is( |
2032 | + PerconaTest::count_checksum_results($output, 'skipped'), |
2033 | + 0, |
2034 | + "1 diff: no skips ($test)" |
2035 | + ); |
2036 | + |
2037 | + is( |
2038 | + PerconaTest::count_checksum_results($output, 'diffs'), |
2039 | + 1, |
2040 | + "1 diff: 1 diff ($test)" |
2041 | + ) or diag($output); |
2042 | + |
2043 | + # 11-17T13:02:54 0 1 26 1 0 0.021 test.t |
2044 | + like( |
2045 | + $output, |
2046 | + qr/^\S+\s+ # ts |
2047 | + 0\s+ # errors |
2048 | + 1\s+ # diffs |
2049 | + 26\s+ # rows |
2050 | + \d+\s+ # chunks |
2051 | + 0\s+ # skipped |
2052 | + \S+\s+ # time |
2053 | + test.t$ # table |
2054 | + /xm, |
2055 | + "1 diff: it's in test.t ($test)" |
2056 | + ); |
2057 | + } |
2058 | + |
2059 | + if ($same_ids) { |
2060 | + # reset server_id's to original values |
2061 | + $node1->do("SET GLOBAL server_id = $orig_id_1"); |
2062 | + $node2->do("SET GLOBAL server_id = $orig_id_2"); |
2063 | + $node3->do("SET GLOBAL server_id = $orig_id_3"); |
2064 | + } |
2065 | + |
2066 | } |
2067 | |
2068 | +# test recursion methods |
2069 | +test_recursion_methods(0); |
2070 | + |
2071 | +# test recursion methods when all nodes have the same id |
2072 | +test_recursion_methods(1); |
2073 | + |
2074 | + |
2075 | # ############################################################################# |
2076 | # cluster, node1 -> slave, run on node1 |
2077 | # ############################################################################# |
2078 | @@ -232,7 +278,7 @@ |
2079 | # Wait for the slave to apply the binlogs from node1 (its master). |
2080 | # Then change it so it's not consistent. |
2081 | PerconaTest::wait_for_table($slave_dbh, 'test.t'); |
2082 | - $sb->wait_for_slaves('cslave1'); |
2083 | + $sb->wait_for_slaves(master => 'node1', slave => 'cslave1'); |
2084 | $slave_dbh->do("update test.t set c='zebra' where c='z'"); |
2085 | |
2086 | $output = output( |