bzr update'd the code for assorted VersionParser fixes

This commit is contained in:
Brian Fraser
2012-07-13 01:39:40 -03:00
25 changed files with 258 additions and 127 deletions

0
bin/pt-archiver Executable file → Normal file
View File

View File

@@ -1389,25 +1389,20 @@ sub _d {
# ########################################################################### # ###########################################################################
# ########################################################################### # ###########################################################################
# ReadKeyMini # ReadKeyMini package
# This package is a copy without comments from the original. The original
# with comments and its test file can be found in the Bazaar repository at,
# lib/ReadKeyMini.pm
# t/lib/ReadKeyMini.t
# See https://launchpad.net/percona-toolkit for more information.
# ########################################################################### # ###########################################################################
{
BEGIN { BEGIN {
package ReadKeyMini; package ReadKeyMini;
# Here be magic. We lie to %INC and say that someone already pulled us from
# the filesystem. Which might be true, if this is inside a .pm file, but
# might not be, if we are part of the big file. The spurious BEGINs are mostly
# unnecesary, but if we aren't inside a .pm and something uses us, import or
# EXPORT_OK might not yet be defined. Though that probably won't help.
# Costs us nothing though, so worth trying. Putting this on top of the file
# would solve the issue.
BEGIN { $INC{"ReadKeyMini.pm"} ||= 1 } BEGIN { $INC{"ReadKeyMini.pm"} ||= 1 }
# Package: ReadKeyMini
# ReadKeyMini is a wrapper around Term::ReadKey. If that's available,
# we use ReadMode and GetTerminalSize from there. Otherwise, we use homebrewn
# definitions.
use warnings; use warnings;
use strict; use strict;
use English qw(-no_match_vars); use English qw(-no_match_vars);
@@ -1434,14 +1429,14 @@ my %modes = (
'ultra-raw' => 5, 'ultra-raw' => 5,
); );
# This primarily comes from the Perl Cookbook, recipe 15.8
{ {
my $fd_stdin = fileno(STDIN); my $fd_stdin = fileno(STDIN);
my $flags; my $flags;
unless ( $PerconaTest::DONT_RESTORE_STDIN ) { unless ( $PerconaTest::DONT_RESTORE_STDIN ) {
$flags = fcntl(STDIN, F_GETFL, 0) $flags = fcntl(STDIN, F_GETFL, 0)
or die "can't fcntl F_GETFL: $!"; or warn "can't fcntl F_GETFL: $!";
} }
my $term = POSIX::Termios->new(); my $term = POSIX::Termios->new();
$term->getattr($fd_stdin); $term->getattr($fd_stdin);
@@ -1475,7 +1470,7 @@ my %modes = (
$term->setattr( $fd_stdin, TCSANOW ); $term->setattr( $fd_stdin, TCSANOW );
unless ( $PerconaTest::DONT_RESTORE_STDIN ) { unless ( $PerconaTest::DONT_RESTORE_STDIN ) {
fcntl(STDIN, F_SETFL, $flags) fcntl(STDIN, F_SETFL, $flags)
or die "can't fcntl F_SETFL: $!"; or warn "can't fcntl F_SETFL: $!";
} }
} }
@@ -1489,9 +1484,6 @@ sub readkey {
sysread(STDIN, $key, 1); sysread(STDIN, $key, 1);
my $timeout = 0.1; my $timeout = 0.1;
if ( $key eq "\033" ) { if ( $key eq "\033" ) {
# Ugly and broken hack, but good enough for the two minutes it took to write.
# Namely, Ctrl escapes, the F-NUM keys, and other stuff you can send from the keyboard
# take more than one "character" to represent, and would be wrong to break into pieces.
{ {
my $x = ''; my $x = '';
STDIN->blocking(0); STDIN->blocking(0);
@@ -1505,15 +1497,11 @@ sub readkey {
return $key; return $key;
} }
# As per perlfaq8:
BEGIN { BEGIN {
eval { no warnings; local $^W; require 'sys/ioctl.ph' }; eval { no warnings; local $^W; require 'sys/ioctl.ph' };
if ( !defined &TIOCGWINSZ ) { if ( !defined &TIOCGWINSZ ) {
*TIOCGWINSZ = sub () { *TIOCGWINSZ = sub () {
# Very few systems actually have ioctl.ph, thus it comes to this.
# These seem to be good enough, for now. See:
# http://stackoverflow.com/a/4286840/536499
$^O eq 'linux' ? 0x005413 $^O eq 'linux' ? 0x005413
: $^O eq 'solaris' ? 0x005468 : $^O eq 'solaris' ? 0x005468
: 0x40087468; : 0x40087468;
@@ -1536,11 +1524,11 @@ sub _GetTerminalSize {
} }
} }
if ( $rows = `tput lines` ) { if ( $rows = `tput lines 2>/dev/null` ) {
chomp($rows); chomp($rows);
chomp($cols = `tput cols`); chomp($cols = `tput cols`);
} }
elsif ( my $stty = `stty -a` ) { elsif ( my $stty = `stty -a 2>/dev/null` ) {
($rows, $cols) = $stty =~ /([0-9]+) rows; ([0-9]+) columns;/; ($rows, $cols) = $stty =~ /([0-9]+) rows; ([0-9]+) columns;/;
} }
else { else {
@@ -1555,6 +1543,7 @@ sub _GetTerminalSize {
} }
1; 1;
}
# ########################################################################### # ###########################################################################
# End ReadKeyMini package # End ReadKeyMini package
# ########################################################################### # ###########################################################################

0
bin/pt-heartbeat Executable file → Normal file
View File

0
bin/pt-kill Executable file → Normal file
View File

0
bin/pt-online-schema-change Executable file → Normal file
View File

0
bin/pt-query-digest Executable file → Normal file
View File

0
bin/pt-slave-find Executable file → Normal file
View File

0
bin/pt-slave-restart Executable file → Normal file
View File

0
bin/pt-table-checksum Executable file → Normal file
View File

0
bin/pt-table-sync Executable file → Normal file
View File

View File

@@ -10997,6 +10997,32 @@ sub main {
$host->{name} = $name || 'unknown host'; $host->{name} = $name || 'unknown host';
} }
# ########################################################################
# If we're comparing rows, check that LOAD DATA LOCAL INFILE works for,
# all hosts, or bail out early if it doesn't.
# ########################################################################
my $compare = $o->get('compare');
if ( $compare->{results}
&& lc($o->get('compare-results-method')) eq 'rows' )
{
foreach my $host ( @$hosts ) {
local $@;
my $sql = "LOAD DATA LOCAL INFILE '/dev/null' INTO TABLE "
. "`test`.`pt_not_there`";
eval { $host->{dbh}->do($sql); 1 } or do {
my $e = $@;
my $error_re = qr/\QDBD::mysql::db do failed: The used command is not allowed with this MySQL version [for Statement "LOAD DATA LOCAL INFILE/;
if ($e =~ $error_re) {
$_->{dbh}->disconnect() for @$hosts;
die("Cannot compare rows as LOAD DATA LOCAL INFILE "
. "is disabled for $host->{name}. See "
. "http://kb.percona.com/troubleshoot-load-data-infile"
);
}
};
}
}
# ######################################################################## # ########################################################################
# Make some common modules. # Make some common modules.
# ######################################################################## # ########################################################################
@@ -11030,7 +11056,6 @@ sub main {
# ######################################################################## # ########################################################################
# Make compare modules in order. # Make compare modules in order.
# ######################################################################## # ########################################################################
my $compare = $o->get('compare');
my @compare_modules; my @compare_modules;
if ( $compare->{results} ) { if ( $compare->{results} ) {
my $method = lc $o->get('compare-results-method'); my $method = lc $o->get('compare-results-method');

View File

@@ -717,12 +717,17 @@ sub full_output {
my ( $code, %args ) = @_; my ( $code, %args ) = @_;
die "I need a code argument" unless $code; die "I need a code argument" unless $code;
my (undef, $file) = tempfile(); local (*STDOUT, *STDERR);
open *output_fh, '>', $file require IO::File;
or die "Cannot open file $file: $OS_ERROR";
local *STDOUT = *output_fh;
*STDERR = *STDOUT; my (undef, $file) = tempfile();
open *STDOUT, '>', $file
or die "Cannot open file $file: $OS_ERROR";
*STDOUT->autoflush(1);
open *STDERR, '>', $file
or die "Cannot open file $file: $OS_ERROR";
*STDERR->autoflush(1);
my $status; my $status;
if (my $pid = fork) { if (my $pid = fork) {
@@ -745,7 +750,7 @@ sub full_output {
else { else {
exit $code->(); exit $code->();
} }
close *output_fh; close $_ or die "Cannot close $_: $OS_ERROR" for qw(STDOUT STDERR);
my $output = do { local $/; open my $fh, "<", $file or die $!; <$fh> }; my $output = do { local $/; open my $fh, "<", $file or die $!; <$fh> };
return ($output, $status); return ($output, $status);
@@ -772,6 +777,19 @@ sub tables_used {
return [ sort keys %tables ]; return [ sort keys %tables ];
} }
sub load_data_is_disabled {
my ($dbh) = @_;
my $sql = "LOAD DATA LOCAL INFILE '/dev/null' INTO TABLE "
. "`t`.`pt_not_there`";
local $@;
if (!eval { $dbh->do($sql); 1 } ) {
my $e = $@;
return 1 if $e =~ qr/\QDBD::mysql::db do failed: The used command is not allowed with this MySQL version [for Statement "LOAD DATA LOCAL INFILE/;
}
return;
}
1; 1;
} }
# ########################################################################### # ###########################################################################

View File

@@ -15,8 +15,14 @@
# this program; if not, write to the Free Software Foundation, Inc., 59 Temple # this program; if not, write to the Free Software Foundation, Inc., 59 Temple
# Place, Suite 330, Boston, MA 02111-1307 USA. # Place, Suite 330, Boston, MA 02111-1307 USA.
# ########################################################################### # ###########################################################################
# ReadKeyMini # ReadKeyMini package
# ########################################################################### # ###########################################################################
# Package: ReadKeyMini
# ReadKeyMini is a wrapper around Term::ReadKey. If that's available,
# we use ReadMode and GetTerminalSize from there. Otherwise, we use homebrewn
# definitions.
BEGIN { BEGIN {
package ReadKeyMini; package ReadKeyMini;
@@ -29,11 +35,6 @@ package ReadKeyMini;
# would solve the issue. # would solve the issue.
BEGIN { $INC{"ReadKeyMini.pm"} ||= 1 } BEGIN { $INC{"ReadKeyMini.pm"} ||= 1 }
# Package: ReadKeyMini
# ReadKeyMini is a wrapper around Term::ReadKey. If that's available,
# we use ReadMode and GetTerminalSize from there. Otherwise, we use homebrewn
# definitions.
use warnings; use warnings;
use strict; use strict;
use English qw(-no_match_vars); use English qw(-no_match_vars);
@@ -72,7 +73,7 @@ my %modes = (
my $flags; my $flags;
unless ( $PerconaTest::DONT_RESTORE_STDIN ) { unless ( $PerconaTest::DONT_RESTORE_STDIN ) {
$flags = fcntl(STDIN, F_GETFL, 0) $flags = fcntl(STDIN, F_GETFL, 0)
or die "can't fcntl F_GETFL: $!"; or warn "can't fcntl F_GETFL: $!";
} }
my $term = POSIX::Termios->new(); my $term = POSIX::Termios->new();
$term->getattr($fd_stdin); $term->getattr($fd_stdin);
@@ -106,7 +107,7 @@ my %modes = (
$term->setattr( $fd_stdin, TCSANOW ); $term->setattr( $fd_stdin, TCSANOW );
unless ( $PerconaTest::DONT_RESTORE_STDIN ) { unless ( $PerconaTest::DONT_RESTORE_STDIN ) {
fcntl(STDIN, F_SETFL, $flags) fcntl(STDIN, F_SETFL, $flags)
or die "can't fcntl F_SETFL: $!"; or warn "can't fcntl F_SETFL: $!";
} }
} }
@@ -167,11 +168,11 @@ sub _GetTerminalSize {
} }
} }
if ( $rows = `tput lines` ) { if ( $rows = `tput lines 2>/dev/null` ) {
chomp($rows); chomp($rows);
chomp($cols = `tput cols`); chomp($cols = `tput cols`);
} }
elsif ( my $stty = `stty -a` ) { elsif ( my $stty = `stty -a 2>/dev/null` ) {
($rows, $cols) = $stty =~ /([0-9]+) rows; ([0-9]+) columns;/; ($rows, $cols) = $stty =~ /([0-9]+) rows; ([0-9]+) columns;/;
} }
else { else {

View File

@@ -51,6 +51,9 @@ make_sandbox() {
if [ -n "$MULTIPLE_BUFFER_POOLS" ]; then if [ -n "$MULTIPLE_BUFFER_POOLS" ]; then
echo "innodb_buffer_pool_instances=$MULTIPLE_BUFFER_POOLS" >> /tmp/$port/my.sandbox.cnf echo "innodb_buffer_pool_instances=$MULTIPLE_BUFFER_POOLS" >> /tmp/$port/my.sandbox.cnf
fi fi
if [ -n "$LOCAL_INFILE" ]; then
echo "local-infile=$LOCAL_INFILE" >> /tmp/$port/my.sandbox.cnf
fi
# If the sandbox is a slave, set it read_only. # If the sandbox is a slave, set it read_only.
if [ "$type" = "slave" ]; then if [ "$type" = "slave" ]; then

View File

@@ -304,8 +304,10 @@ is_deeply(
# ############################################################################# # #############################################################################
# Test the rows method. # Test the rows method.
# ############################################################################# # #############################################################################
my $tmpdir = '/tmp/mk-upgrade-res'; my $tmpdir = '/tmp/mk-upgrade-res';
SKIP: {
skip "LOAD DATA LOCAL INFILE is disabled, can't test method => rows", 30
if PerconaTest::load_data_is_disabled($dbh1);
diag(`rm -rf $tmpdir 2>/dev/null; mkdir $tmpdir`); diag(`rm -rf $tmpdir 2>/dev/null; mkdir $tmpdir`);
$sb->load_file('master', "t/lib/samples/compare-results.sql"); $sb->load_file('master', "t/lib/samples/compare-results.sql");
@@ -681,7 +683,7 @@ is(
$report, $report,
'rows: report, left with more rows' 'rows: report, left with more rows'
); );
}
# ############################################################################# # #############################################################################
# Try to compare without having done the actions. # Try to compare without having done the actions.
# ############################################################################# # #############################################################################
@@ -726,6 +728,9 @@ is_deeply(
'No differences after bad compare()' 'No differences after bad compare()'
); );
SKIP: {
skip "LOAD DATA LOCAL INFILE is disabled, can't test method => rows", 2
if PerconaTest::load_data_is_disabled($dbh1);
$cr = new CompareResults( $cr = new CompareResults(
method => 'rows', method => 'rows',
'base-dir' => $tmpdir, 'base-dir' => $tmpdir,
@@ -755,6 +760,8 @@ is_deeply(
'No differences after bad compare()' 'No differences after bad compare()'
); );
}
# ############################################################################# # #############################################################################
# Done. # Done.
# ############################################################################# # #############################################################################

View File

@@ -22,8 +22,12 @@ my $dbh = $sb->get_dbh_for('master');
if ( !$dbh ) { if ( !$dbh ) {
plan skip_all => 'Cannot connect to sandbox master'; plan skip_all => 'Cannot connect to sandbox master';
} }
elsif ( PerconaTest::load_data_is_disabled($dbh) ) {
diag("LOAD DATA LOCAL INFILE is disabled, only going to test the error message");
plan tests => 2;
}
else { else {
plan tests => 10; plan tests => 11;
} }
my $output; my $output;
@@ -31,6 +35,11 @@ my $rows;
my $cnf = "/tmp/12345/my.sandbox.cnf"; my $cnf = "/tmp/12345/my.sandbox.cnf";
my $cmd = "$trunk/bin/pt-archiver"; my $cmd = "$trunk/bin/pt-archiver";
if ( PerconaTest::load_data_is_disabled($dbh) ) {
test_disabled_load_data($dbh, $sb);
}
else {
$sb->wipe_clean($dbh); $sb->wipe_clean($dbh);
$sb->create_dbs($dbh, ['test']); $sb->create_dbs($dbh, ['test']);
@@ -84,6 +93,45 @@ is_deeply(
"--bulk-insert archived 7 rows (issue 1260)" "--bulk-insert archived 7 rows (issue 1260)"
); );
# Test that the tool bails out early if LOAD DATA LOCAL INFILE is disabled
{
if ( -d "/tmp/2900" ) {
diag(`$trunk/sandbox/stop-sandbox 2900 >/dev/null 2>&1`);
}
local $ENV{LOCAL_INFILE} = 0;
diag(`$trunk/sandbox/start-sandbox master 2900 >/dev/null 2>&1`);
my $master3_dbh = $sb->get_dbh_for('master3');
test_disabled_load_data($master3_dbh, $sb);
diag(`$trunk/sandbox/stop-sandbox 2900 >/dev/null 2>&1`);
$master3_dbh->disconnect() if $master3_dbh;
}
}
sub test_disabled_load_data {
my ($dbh, $sb) = @_;
$sb->wipe_clean($dbh);
$sb->create_dbs($dbh, ['test']);
$sb->load_file('master', 't/pt-archiver/samples/table5.sql');
$dbh->do('INSERT INTO `test`.`table_5_copy` SELECT * FROM `test`.`table_5`');
my ($output, undef) = full_output(
sub { pt_archiver::main(qw(--no-ascend --limit 50 --bulk-insert),
qw(--bulk-delete --where 1=1 --statistics),
'--source', "D=test,t=table_5,F=$cnf",
'--dest', "t=table_5_dest") },
);
like($output,
qr!\Q--bulk-insert cannot work as LOAD DATA LOCAL INFILE is disabled. See http://kb.percona.com/troubleshoot-load-data-infile!,
"--bulk-insert throws an error if LOCAL INFILE is disabled"
);
}
# ############################################################################# # #############################################################################
# Done. # Done.
# ############################################################################# # #############################################################################

View File

@@ -22,6 +22,9 @@ my $dbh = $sb->get_dbh_for('master');
if ( !$dbh ) { if ( !$dbh ) {
plan skip_all => 'Cannot connect to sandbox master'; plan skip_all => 'Cannot connect to sandbox master';
} }
elsif ( PerconaTest::load_data_is_disabled($dbh) ) {
plan skip_all => 'Cannot use --bulk-insert with LOAD DATA LOCAL INFILE disabled';
}
else { else {
plan tests => 5; plan tests => 5;
} }

View File

@@ -159,7 +159,7 @@ diag('Loading sample dataset...');
$sb->load_file('master', "$sample/basic_no_fks.sql"); $sb->load_file('master', "$sample/basic_no_fks.sql");
$master_dbh->do("USE pt_osc"); $master_dbh->do("USE pt_osc");
$master_dbh->do("TRUNCATE TABLE t"); $master_dbh->do("TRUNCATE TABLE t");
$master_dbh->do("LOAD DATA LOCAL INFILE '$trunk/t/pt-online-schema-change/samples/basic_no_fks.data' INTO TABLE t"); $master_dbh->do("LOAD DATA INFILE '$trunk/t/pt-online-schema-change/samples/basic_no_fks.data' INTO TABLE t");
$master_dbh->do("ANALYZE TABLE t"); $master_dbh->do("ANALYZE TABLE t");
$sb->wait_for_slaves(); $sb->wait_for_slaves();

View File

@@ -46,16 +46,22 @@ my $rows;
# ############################################################################# # #############################################################################
# Of course, the orig database and table must exist. # Of course, the orig database and table must exist.
throws_ok( ($output, undef) = full_output(
sub { pt_online_schema_change::main(@args, sub { pt_online_schema_change::main(@args,
"$dsn,D=nonexistent_db,t=t", qw(--dry-run)) }, "$dsn,D=nonexistent_db,t=t", qw(--dry-run)) },
);
like( $output,
qr/Unknown database/, qr/Unknown database/,
"Original database must exist" "Original database must exist"
); );
throws_ok( ($output, undef) = full_output(
sub { pt_online_schema_change::main(@args, sub { pt_online_schema_change::main(@args,
"$dsn,D=mysql,t=nonexistent_tbl", qw(--dry-run)) }, "$dsn,D=mysql,t=nonexistent_tbl", qw(--dry-run)) },
);
like( $output,
qr/`mysql`.`nonexistent_tbl` does not exist/, qr/`mysql`.`nonexistent_tbl` does not exist/,
"Original table must exist" "Original table must exist"
); );
@@ -66,9 +72,12 @@ $slave_dbh->do("USE pt_osc");
# The orig table cannot have any triggers. # The orig table cannot have any triggers.
$master_dbh->do("CREATE TRIGGER pt_osc.pt_osc_test AFTER DELETE ON pt_osc.t FOR EACH ROW DELETE FROM pt_osc.t WHERE 0"); $master_dbh->do("CREATE TRIGGER pt_osc.pt_osc_test AFTER DELETE ON pt_osc.t FOR EACH ROW DELETE FROM pt_osc.t WHERE 0");
throws_ok( ($output, undef) = full_output(
sub { pt_online_schema_change::main(@args, sub { pt_online_schema_change::main(@args,
"$dsn,D=pt_osc,t=t", qw(--dry-run)) }, "$dsn,D=pt_osc,t=t", qw(--dry-run)) },
);
like( $output,
qr/`pt_osc`.`t` has triggers/, qr/`pt_osc`.`t` has triggers/,
"Original table cannot have triggers" "Original table cannot have triggers"
); );
@@ -77,9 +86,12 @@ $master_dbh->do('DROP TRIGGER pt_osc.pt_osc_test');
# The orig table must have a pk or unique index so the delete trigger is safe. # The orig table must have a pk or unique index so the delete trigger is safe.
$master_dbh->do("ALTER TABLE pt_osc.t DROP COLUMN id"); $master_dbh->do("ALTER TABLE pt_osc.t DROP COLUMN id");
$master_dbh->do("ALTER TABLE pt_osc.t DROP INDEX c"); $master_dbh->do("ALTER TABLE pt_osc.t DROP INDEX c");
throws_ok( ($output, undef) = full_output(
sub { pt_online_schema_change::main(@args, sub { pt_online_schema_change::main(@args,
"$dsn,D=pt_osc,t=t", qw(--dry-run)) }, "$dsn,D=pt_osc,t=t", qw(--dry-run)) },
);
like( $output,
qr/`pt_osc`.`t` does not have a PRIMARY KEY or a unique index/, qr/`pt_osc`.`t` does not have a PRIMARY KEY or a unique index/,
"Original table must have a PK or unique index" "Original table must have a PK or unique index"
); );
@@ -97,9 +109,14 @@ for my $i ( 1..10 ) {
$master_dbh->do("create table $table (id int)"); $master_dbh->do("create table $table (id int)");
} }
throws_ok( my $x;
($output, $x) = full_output(
sub { pt_online_schema_change::main(@args, sub { pt_online_schema_change::main(@args,
"$dsn,D=pt_osc,t=t", qw(--quiet --dry-run)) }, "$dsn,D=pt_osc,t=t", qw(--quiet --dry-run)); },
);
like(
$output,
qr/Failed to find a unique new table name/, qr/Failed to find a unique new table name/,
"Doesn't try forever to find a new table name" "Doesn't try forever to find a new table name"
); );

View File

@@ -363,7 +363,7 @@ is(
# Test --where. # Test --where.
# ############################################################################# # #############################################################################
$sb->load_file('master', 't/pt-table-checksum/samples/600cities.sql'); $sb->load_file('master', 't/pt-table-checksum/samples/600cities.sql');
$master_dbh->do("LOAD DATA LOCAL INFILE '$trunk/t/pt-table-checksum/samples/600cities.data' INTO TABLE test.t"); $master_dbh->do("LOAD DATA INFILE '$trunk/t/pt-table-checksum/samples/600cities.data' INTO TABLE test.t");
$output = output( $output = output(
sub { $exit_status = pt_table_checksum::main(@args, sub { $exit_status = pt_table_checksum::main(@args,

View File

@@ -113,7 +113,7 @@ unlike(
# on replicas # on replicas
# ############################################################################# # #############################################################################
$sb->load_file('master', 't/pt-table-checksum/samples/600cities.sql'); $sb->load_file('master', 't/pt-table-checksum/samples/600cities.sql');
$master_dbh->do("LOAD DATA LOCAL INFILE '$trunk/t/pt-table-checksum/samples/600cities.data' INTO TABLE test.t"); $master_dbh->do("LOAD DATA INFILE '$trunk/t/pt-table-checksum/samples/600cities.data' INTO TABLE test.t");
$master_dbh->do("SET SQL_LOG_BIN=0"); $master_dbh->do("SET SQL_LOG_BIN=0");
$master_dbh->do("DELETE FROM test.t WHERE id > 100"); $master_dbh->do("DELETE FROM test.t WHERE id > 100");
$master_dbh->do("SET SQL_LOG_BIN=1"); $master_dbh->do("SET SQL_LOG_BIN=1");

View File

@@ -43,7 +43,7 @@ my $output;
sub load_data_infile { sub load_data_infile {
my ($file, $where) = @_; my ($file, $where) = @_;
$master_dbh->do('truncate table percona.checksums'); $master_dbh->do('truncate table percona.checksums');
$master_dbh->do("LOAD DATA LOCAL INFILE '$trunk/t/pt-table-checksum/samples/checksum_results/$file' INTO TABLE percona.checksums"); $master_dbh->do("LOAD DATA INFILE '$trunk/t/pt-table-checksum/samples/checksum_results/$file' INTO TABLE percona.checksums");
if ( $where ) { if ( $where ) {
PerconaTest::wait_for_table($slave1_dbh, 'percona.checksums', $where); PerconaTest::wait_for_table($slave1_dbh, 'percona.checksums', $where);
} }

View File

@@ -69,7 +69,7 @@ wait_until(sub {
# wait for it to stop "lagging". # wait for it to stop "lagging".
($output) = PerconaTest::full_output( ($output) = PerconaTest::full_output(
sub { pt_table_checksum::main(@args, qw(-t sakila.city)) }, sub { pt_table_checksum::main(@args, qw(-t sakila.city)) },
wait_for => 3, wait_for => 10,
); );
like( like(

View File

@@ -33,6 +33,8 @@ else {
plan tests => 13; plan tests => 13;
} }
my $load_data_is_disabled = PerconaTest::load_data_is_disabled($dbh1);
my @host_args = ('h=127.1,P=12345', 'P=12348'); my @host_args = ('h=127.1,P=12345', 'P=12348');
my @op_args = (qw(-u msandbox -p msandbox), my @op_args = (qw(-u msandbox -p msandbox),
'--compare', 'results,warnings', '--compare', 'results,warnings',
@@ -64,23 +66,27 @@ ok(
'Report for multiple queries (checksum method)' 'Report for multiple queries (checksum method)'
); );
ok( SKIP: {
skip "LOAD DATA LOCAL INFILE is disabled", 2 if $load_data_is_disabled;
ok(
no_diff( no_diff(
sub { pt_upgrade::main(@args, "$trunk/$sample/001/select-one.log", sub { pt_upgrade::main(@args, "$trunk/$sample/001/select-one.log",
"--compare-results-method", "rows") }, "--compare-results-method", "rows") },
"$sample/001/select-one-rows.txt" "$sample/001/select-one-rows.txt"
), ),
'Report for a single query (rows method)' 'Report for a single query (rows method)'
); );
ok( ok(
no_diff( no_diff(
sub { pt_upgrade::main(@args, "$trunk/$sample/001/select-everyone.log", sub { pt_upgrade::main(@args, "$trunk/$sample/001/select-everyone.log",
"--compare-results-method", "rows") }, "--compare-results-method", "rows") },
"$sample/001/select-everyone-rows.txt" "$sample/001/select-everyone-rows.txt"
), ),
'Report for multiple queries (rows method)' 'Report for multiple queries (rows method)'
); );
}
ok( ok(
no_diff( no_diff(
@@ -107,13 +113,15 @@ $sb->wipe_clean($dbh2);
# Issue 951: mk-upgrade "I need a db argument" error with # Issue 951: mk-upgrade "I need a db argument" error with
# compare-results-method=rows # compare-results-method=rows
# ############################################################################# # #############################################################################
$sb->load_file('master', "$sample/002/tables.sql"); SKIP: {
$sb->load_file('master1', "$sample/002/tables.sql"); skip "LOAD DATA LOCAL INFILE is disabled", 4 if $load_data_is_disabled;
$sb->load_file('master', "$sample/002/tables.sql");
$sb->load_file('master1', "$sample/002/tables.sql");
# Make a difference on one host so diff_rows() is called. # Make a difference on one host so diff_rows() is called.
$dbh1->do('insert into test.t values (5)'); $dbh1->do('insert into test.t values (5)');
ok( ok(
no_diff( no_diff(
sub { pt_upgrade::main(@op_args, "$log/002/no-db.log", sub { pt_upgrade::main(@op_args, "$log/002/no-db.log",
'h=127.1,P=12345,D=test', 'P=12348,D=test', 'h=127.1,P=12345,D=test', 'P=12348,D=test',
@@ -121,13 +129,13 @@ ok(
"$sample/002/report-01.txt", "$sample/002/report-01.txt",
), ),
'No db, compare results row, DSN D, --temp-database (issue 951)' 'No db, compare results row, DSN D, --temp-database (issue 951)'
); );
$sb->load_file('master', "$sample/002/tables.sql"); $sb->load_file('master', "$sample/002/tables.sql");
$sb->load_file('master1', "$sample/002/tables.sql"); $sb->load_file('master1', "$sample/002/tables.sql");
$dbh1->do('insert into test.t values (5)'); $dbh1->do('insert into test.t values (5)');
ok( ok(
no_diff( no_diff(
sub { pt_upgrade::main(@op_args, "$log/002/no-db.log", sub { pt_upgrade::main(@op_args, "$log/002/no-db.log",
'h=127.1,P=12345,D=test', 'P=12348,D=test', 'h=127.1,P=12345,D=test', 'P=12348,D=test',
@@ -135,48 +143,54 @@ ok(
"$sample/002/report-01.txt", "$sample/002/report-01.txt",
), ),
'No db, compare results row, DSN D' 'No db, compare results row, DSN D'
); );
is_deeply( is_deeply(
$dbh1->selectall_arrayref('show tables from `test`'), $dbh1->selectall_arrayref('show tables from `test`'),
[['t']], [['t']],
"Didn't create temp table in event's db" "Didn't create temp table in event's db"
); );
is_deeply( is_deeply(
$dbh1->selectall_arrayref('show tables from `tmp_db`'), $dbh1->selectall_arrayref('show tables from `tmp_db`'),
[['mk_upgrade_left']], [['mk_upgrade_left']],
"Createed temp table in --temp-database" "Createed temp table in --temp-database"
); );
$sb->wipe_clean($dbh1); $sb->wipe_clean($dbh1);
$sb->wipe_clean($dbh2); $sb->wipe_clean($dbh2);
}
# ############################################################################# # #############################################################################
# Bug 926598: DBD::mysql bug causes pt-upgrade to use wrong # Bug 926598: DBD::mysql bug causes pt-upgrade to use wrong
# precision (M) and scale (D) # precision (M) and scale (D)
# ############################################################################# # #############################################################################
$sb->load_file('master', "$sample/003/tables.sql"); SKIP: {
$sb->load_file('master1', "$sample/003/tables.sql"); skip "LOAD DATA LOCAL INFILE is disabled", 2 if $load_data_is_disabled;
# Make a difference on one host so diff_rows() is called. $sb->load_file('master', "$sample/003/tables.sql");
$dbh1->do('insert into test.t values (4, 1.00)'); $sb->load_file('master1', "$sample/003/tables.sql");
ok( # Make a difference on one host so diff_rows() is called.
$dbh1->do('insert into test.t values (4, 1.00)');
ok(
no_diff( no_diff(
sub { pt_upgrade::main(@args, "$log/003/double.log", sub { pt_upgrade::main(@args, "$log/003/double.log",
qw(--compare-results-method rows)) }, qw(--compare-results-method rows)) },
"$sample/003/report001.txt", "$sample/003/report001.txt",
), ),
'M, D diff (bug 926598)', 'M, D diff (bug 926598)',
); );
my $row = $dbh1->selectrow_arrayref("show create table test.mk_upgrade_left"); my $row = $dbh1->selectrow_arrayref("show create table test.mk_upgrade_left");
like( like(
$row->[1], $row->[1],
qr/[`"]SUM\(total\)[`"]\s+double\sDEFAULT/i, qr/[`"]SUM\(total\)[`"]\s+double\sDEFAULT/i,
"No M,D in table def (bug 926598)" "No M,D in table def (bug 926598)"
); );
}
# ############################################################################# # #############################################################################
# Done. # Done.

View File

@@ -24,11 +24,17 @@ my $dbh1 = $sb->get_dbh_for('master');
my $dbh2 = $sb->get_dbh_for('master1'); my $dbh2 = $sb->get_dbh_for('master1');
if ( !$dbh1 ) { if ( !$dbh1 ) {
diag(`$trunk/sandbox/stop-sandbox master 12348 >/dev/null`);
plan skip_all => 'Cannot connect to sandbox master'; plan skip_all => 'Cannot connect to sandbox master';
} }
elsif ( !$dbh2 ) { elsif ( !$dbh2 ) {
diag(`$trunk/sandbox/stop-sandbox master 12348 >/dev/null`);
plan skip_all => 'Cannot connect to second sandbox master'; plan skip_all => 'Cannot connect to second sandbox master';
} }
elsif ( PerconaTest::load_data_is_disabled($dbh1) ) {
diag(`$trunk/sandbox/stop-sandbox master 12348 >/dev/null`);
plan skip_all => 'LOAD DATA LOCAL INFILE is disabled';
}
else { else {
plan tests => 6; plan tests => 6;
} }