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} ) {
$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;

View File

@@ -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;

View File

@@ -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"
);
# #############################################################################