Change the behavior to resume+ignore-databases to mimic resume+ignore-tables; now it starts from the next table.

This commit is contained in:
Brian Fraser
2012-11-09 22:07:10 -03:00
parent 426d599566
commit b3dd48af15
3 changed files with 84 additions and 36 deletions

View File

@@ -6673,11 +6673,16 @@ sub next {
if ( !$self->{initialized} ) { if ( !$self->{initialized} ) {
$self->{initialized} = 1; $self->{initialized} = 1;
if ( $self->{resume}->{tbl} if ( $self->{resume}->{tbl} ) {
&& !$self->table_is_allowed(@{$self->{resume}}{qw(db tbl)}) ) { if ( !$self->table_is_allowed(@{$self->{resume}}{qw(db tbl)}) ) {
PTDEBUG && _d('Will resume after', PTDEBUG && _d('Will resume after',
join('.', @{$self->{resume}}{qw(db tbl)})); join('.', @{$self->{resume}}{qw(db tbl)}));
$self->{resume}->{after} = 1; $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} ) { if ( !defined $self->{dbs} ) {
my $sql = 'SHOW DATABASES'; my $sql = 'SHOW DATABASES';
PTDEBUG && _d($sql); PTDEBUG && _d($sql);
my @dbs = grep { $self->database_is_allowed($_) } my @dbs = grep {
@{$dbh->selectcol_arrayref($sql)}; $self->_resume_from_database($_)
&&
$self->database_is_allowed($_)
} @{$dbh->selectcol_arrayref($sql)};
PTDEBUG && _d('Found', scalar @dbs, 'databases'); PTDEBUG && _d('Found', scalar @dbs, 'databases');
$self->{dbs} = \@dbs; $self->{dbs} = \@dbs;
} }
if ( !$self->{db} ) { if ( !$self->{db} ) {
while ( @{$self->{dbs}} ) { $self->{db} = shift @{$self->{dbs}};
$self->{db} = shift @{$self->{dbs}};
last if $self->_resume_from_database($self->{db});
}
PTDEBUG && _d('Next database:', $self->{db}); PTDEBUG && _d('Next database:', $self->{db});
return unless $self->{db}; return unless $self->{db};
} }
@@ -6948,11 +6953,17 @@ sub _resume_from_database {
my ($self, $db) = @_; my ($self, $db) = @_;
return 1 unless $self->{resume}->{db}; return 1 unless $self->{resume}->{db};
if ( $db eq $self->{resume}->{db} ) { if ( $db eq $self->{resume}->{db} ) {
PTDEBUG && _d('At resume db', $db); if ( !$self->{resume}->{after}->{db} ) {
delete $self->{resume}->{db}; PTDEBUG && _d('Resuming from db', $db);
return 1; delete $self->{resume}->{db};
return 1;
}
else {
PTDEBUG && _d('Resuming after db', $db);
delete $self->{resume}->{db};
delete $self->{resume}->{tbl};
}
} }
return 0; return 0;
@@ -6964,7 +6975,7 @@ sub _resume_from_table {
return 1 unless $self->{resume}->{tbl}; return 1 unless $self->{resume}->{tbl};
if ( $tbl eq $self->{resume}->{tbl} ) { if ( $tbl eq $self->{resume}->{tbl} ) {
if ( !$self->{resume}->{after} ) { if ( !$self->{resume}->{after}->{tbl} ) {
PTDEBUG && _d('Resuming from table', $tbl); PTDEBUG && _d('Resuming from table', $tbl);
delete $self->{resume}->{tbl}; delete $self->{resume}->{tbl};
return 1; return 1;

View File

@@ -203,11 +203,16 @@ sub next {
if ( !$self->{initialized} ) { if ( !$self->{initialized} ) {
$self->{initialized} = 1; $self->{initialized} = 1;
if ( $self->{resume}->{tbl} if ( $self->{resume}->{tbl} ) {
&& !$self->table_is_allowed(@{$self->{resume}}{qw(db tbl)}) ) { if ( !$self->table_is_allowed(@{$self->{resume}}{qw(db tbl)}) ) {
PTDEBUG && _d('Will resume after', PTDEBUG && _d('Will resume after',
join('.', @{$self->{resume}}{qw(db tbl)})); join('.', @{$self->{resume}}{qw(db tbl)}));
$self->{resume}->{after} = 1; $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. # This happens once, the first time we're called.
my $sql = 'SHOW DATABASES'; my $sql = 'SHOW DATABASES';
PTDEBUG && _d($sql); PTDEBUG && _d($sql);
my @dbs = grep { $self->database_is_allowed($_) } my @dbs = grep {
@{$dbh->selectcol_arrayref($sql)}; $self->_resume_from_database($_)
&&
$self->database_is_allowed($_)
} @{$dbh->selectcol_arrayref($sql)};
PTDEBUG && _d('Found', scalar @dbs, 'databases'); PTDEBUG && _d('Found', scalar @dbs, 'databases');
$self->{dbs} = \@dbs; $self->{dbs} = \@dbs;
} }
if ( !$self->{db} ) { if ( !$self->{db} ) {
while ( @{$self->{dbs}} ) { $self->{db} = shift @{$self->{dbs}};
$self->{db} = shift @{$self->{dbs}};
last if $self->_resume_from_database($self->{db});
}
PTDEBUG && _d('Next database:', $self->{db}); PTDEBUG && _d('Next database:', $self->{db});
return unless $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. # "Resume" from any db if we're not, in fact, resuming.
return 1 unless $self->{resume}->{db}; return 1 unless $self->{resume}->{db};
if ( $db eq $self->{resume}->{db} ) { if ( $db eq $self->{resume}->{db} ) {
PTDEBUG && _d('At resume db', $db); if ( !$self->{resume}->{after}->{db} ) {
delete $self->{resume}->{db}; PTDEBUG && _d('Resuming from db', $db);
return 1; 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; return 0;
@@ -527,7 +540,7 @@ sub _resume_from_table {
return 1 unless $self->{resume}->{tbl}; return 1 unless $self->{resume}->{tbl};
if ( $tbl eq $self->{resume}->{tbl} ) { if ( $tbl eq $self->{resume}->{tbl} ) {
if ( !$self->{resume}->{after} ) { if ( !$self->{resume}->{after}->{tbl} ) {
PTDEBUG && _d('Resuming from table', $tbl); PTDEBUG && _d('Resuming from table', $tbl);
delete $self->{resume}->{tbl}; delete $self->{resume}->{tbl};
return 1; return 1;

View File

@@ -416,13 +416,37 @@ test_so(
# https://bugs.launchpad.net/percona-toolkit/+bug/911385 # https://bugs.launchpad.net/percona-toolkit/+bug/911385
# ############################################################################ # ############################################################################
# Actually, the important bit here si that it doesn't die, not the results.
test_so( test_so(
filters => ['--ignore-databases', 'sakila,mysql'], filters => ['--ignore-databases', 'sakila,mysql'],
result => "", # hack; uses lives_ok instead result => "",
lives_ok => 1, 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"
); );
# ############################################################################# # #############################################################################