From b3dd48af1509f6bcc0ffc533e2260ec4f7f09df6 Mon Sep 17 00:00:00 2001 From: Brian Fraser Date: Fri, 9 Nov 2012 22:07:10 -0300 Subject: [PATCH] Change the behavior to resume+ignore-databases to mimic resume+ignore-tables; now it starts from the next table. --- bin/pt-table-checksum | 43 +++++++++++++++++++++++++--------------- lib/SchemaIterator.pm | 45 +++++++++++++++++++++++++++--------------- t/lib/SchemaIterator.t | 32 ++++++++++++++++++++++++++---- 3 files changed, 84 insertions(+), 36 deletions(-) diff --git a/bin/pt-table-checksum b/bin/pt-table-checksum index 50feedf8..b3d15458 100755 --- a/bin/pt-table-checksum +++ b/bin/pt-table-checksum @@ -6673,11 +6673,16 @@ sub next { if ( !$self->{initialized} ) { $self->{initialized} = 1; - if ( $self->{resume}->{tbl} - && !$self->table_is_allowed(@{$self->{resume}}{qw(db tbl)}) ) { - PTDEBUG && _d('Will resume after', - join('.', @{$self->{resume}}{qw(db tbl)})); - $self->{resume}->{after} = 1; + if ( $self->{resume}->{tbl} ) { + if ( !$self->table_is_allowed(@{$self->{resume}}{qw(db tbl)}) ) { + PTDEBUG && _d('Will resume after', + join('.', @{$self->{resume}}{qw(db tbl)})); + $self->{resume}->{after}->{tbl} = 1; + } + if ( !$self->database_is_allowed($self->{resume}->{db}) ) { + PTDEBUG && _d('Will resume after', $self->{resume}->{db}); + $self->{resume}->{after}->{db} = 1; + } } } @@ -6775,17 +6780,17 @@ sub _iterate_dbh { if ( !defined $self->{dbs} ) { my $sql = 'SHOW DATABASES'; PTDEBUG && _d($sql); - my @dbs = grep { $self->database_is_allowed($_) } - @{$dbh->selectcol_arrayref($sql)}; + my @dbs = grep { + $self->_resume_from_database($_) + && + $self->database_is_allowed($_) + } @{$dbh->selectcol_arrayref($sql)}; PTDEBUG && _d('Found', scalar @dbs, 'databases'); $self->{dbs} = \@dbs; } if ( !$self->{db} ) { - while ( @{$self->{dbs}} ) { - $self->{db} = shift @{$self->{dbs}}; - last if $self->_resume_from_database($self->{db}); - } + $self->{db} = shift @{$self->{dbs}}; PTDEBUG && _d('Next database:', $self->{db}); return unless $self->{db}; } @@ -6948,11 +6953,17 @@ sub _resume_from_database { my ($self, $db) = @_; return 1 unless $self->{resume}->{db}; - if ( $db eq $self->{resume}->{db} ) { - PTDEBUG && _d('At resume db', $db); - delete $self->{resume}->{db}; - return 1; + if ( !$self->{resume}->{after}->{db} ) { + PTDEBUG && _d('Resuming from db', $db); + delete $self->{resume}->{db}; + return 1; + } + else { + PTDEBUG && _d('Resuming after db', $db); + delete $self->{resume}->{db}; + delete $self->{resume}->{tbl}; + } } return 0; @@ -6964,7 +6975,7 @@ sub _resume_from_table { return 1 unless $self->{resume}->{tbl}; if ( $tbl eq $self->{resume}->{tbl} ) { - if ( !$self->{resume}->{after} ) { + if ( !$self->{resume}->{after}->{tbl} ) { PTDEBUG && _d('Resuming from table', $tbl); delete $self->{resume}->{tbl}; return 1; diff --git a/lib/SchemaIterator.pm b/lib/SchemaIterator.pm index f64d9192..dde3265a 100644 --- a/lib/SchemaIterator.pm +++ b/lib/SchemaIterator.pm @@ -203,11 +203,16 @@ sub next { if ( !$self->{initialized} ) { $self->{initialized} = 1; - if ( $self->{resume}->{tbl} - && !$self->table_is_allowed(@{$self->{resume}}{qw(db tbl)}) ) { - PTDEBUG && _d('Will resume after', - join('.', @{$self->{resume}}{qw(db tbl)})); - $self->{resume}->{after} = 1; + if ( $self->{resume}->{tbl} ) { + if ( !$self->table_is_allowed(@{$self->{resume}}{qw(db tbl)}) ) { + PTDEBUG && _d('Will resume after', + join('.', @{$self->{resume}}{qw(db tbl)})); + $self->{resume}->{after}->{tbl} = 1; + } + if ( !$self->database_is_allowed($self->{resume}->{db}) ) { + PTDEBUG && _d('Will resume after', $self->{resume}->{db}); + $self->{resume}->{after}->{db} = 1; + } } } @@ -320,17 +325,17 @@ sub _iterate_dbh { # This happens once, the first time we're called. my $sql = 'SHOW DATABASES'; PTDEBUG && _d($sql); - my @dbs = grep { $self->database_is_allowed($_) } - @{$dbh->selectcol_arrayref($sql)}; + my @dbs = grep { + $self->_resume_from_database($_) + && + $self->database_is_allowed($_) + } @{$dbh->selectcol_arrayref($sql)}; PTDEBUG && _d('Found', scalar @dbs, 'databases'); $self->{dbs} = \@dbs; } if ( !$self->{db} ) { - while ( @{$self->{dbs}} ) { - $self->{db} = shift @{$self->{dbs}}; - last if $self->_resume_from_database($self->{db}); - } + $self->{db} = shift @{$self->{dbs}}; PTDEBUG && _d('Next database:', $self->{db}); return unless $self->{db}; } @@ -510,11 +515,19 @@ sub _resume_from_database { # "Resume" from any db if we're not, in fact, resuming. return 1 unless $self->{resume}->{db}; - if ( $db eq $self->{resume}->{db} ) { - PTDEBUG && _d('At resume db', $db); - delete $self->{resume}->{db}; - return 1; + if ( !$self->{resume}->{after}->{db} ) { + PTDEBUG && _d('Resuming from db', $db); + delete $self->{resume}->{db}; + return 1; + } + else { + PTDEBUG && _d('Resuming after db', $db); + # If we're not resuming from the resume db, then + # we aren't resuming from the resume table either. + delete $self->{resume}->{db}; + delete $self->{resume}->{tbl}; + } } return 0; @@ -527,7 +540,7 @@ sub _resume_from_table { return 1 unless $self->{resume}->{tbl}; if ( $tbl eq $self->{resume}->{tbl} ) { - if ( !$self->{resume}->{after} ) { + if ( !$self->{resume}->{after}->{tbl} ) { PTDEBUG && _d('Resuming from table', $tbl); delete $self->{resume}->{tbl}; return 1; diff --git a/t/lib/SchemaIterator.t b/t/lib/SchemaIterator.t index db24fe4a..4abdbb20 100644 --- a/t/lib/SchemaIterator.t +++ b/t/lib/SchemaIterator.t @@ -416,13 +416,37 @@ test_so( # https://bugs.launchpad.net/percona-toolkit/+bug/911385 # ############################################################################ -# Actually, the important bit here si that it doesn't die, not the results. - test_so( filters => ['--ignore-databases', 'sakila,mysql'], - result => "", # hack; uses lives_ok instead + result => "", lives_ok => 1, - test_name => "Bug 911385: pt-table-checksum v2 fails when --resume + --ignore-database is used" + resume => 'sakila.payment', + test_name => "Bug 911385: ptc works with --resume + --ignore-database" +); + +$dbh->do("CREATE DATABASE zakila"); +$dbh->do("CREATE TABLE zakila.bug_911385 (i int)"); +test_so( + filters => ['--ignore-databases', 'sakila,mysql'], + result => "zakila.bug_911385 ", + resume => 'sakila.payment', + test_name => "Bug 911385: ...and continues to the next db" +); +$dbh->do("DROP DATABASE zakila"); + +test_so( + filters => [qw(--ignore-tables-regex payment --ignore-databases mysql)], + result => "", + lives_ok => 1, + resume => 'sakila.payment', + test_name => "Bug 911385: ptc works with --resume + --ignore-tables-regex" +); + +test_so( + filters => [qw(--ignore-tables-regex payment --ignore-databases mysql)], + result => "sakila.rental sakila.staff sakila.store ", + resume => 'sakila.payment', + test_name => "Bug 911385: ...and continues to the next table" ); # #############################################################################