1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
#!/usr/bin/env perl
BEGIN {
die "The PERCONA_TOOLKIT_BRANCH environment variable is not set.\n"
unless $ENV{PERCONA_TOOLKIT_BRANCH} && -d $ENV{PERCONA_TOOLKIT_BRANCH};
unshift @INC, "$ENV{PERCONA_TOOLKIT_BRANCH}/lib";
};
use strict;
use warnings FATAL => 'all';
use English qw(-no_match_vars);
use Test::More;
use PerconaTest;
use Sandbox;
require "$trunk/bin/pt-table-checksum";
my $dp = new DSNParser(opts=>$dsn_opts);
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
my $master_dbh = $sb->get_dbh_for('master');
my $slave_dbh = $sb->get_dbh_for('slave1');
if ( !$master_dbh ) {
plan skip_all => 'Cannot connect to sandbox master';
}
elsif ( !$slave_dbh ) {
plan skip_all => 'Cannot connect to sandbox slave';
}
else {
plan tests => 5;
}
# The sandbox servers run with lock_wait_timeout=3 and it's not dynamic
# so we need to specify --set-vars innodb_lock_wait_timeout=3 else the tool will die.
# And --max-load "" prevents waiting for status variables.
my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox';
my @args = ($master_dsn, qw(--set-vars innodb_lock_wait_timeout=3), '--max-load', '');
my $output;
my $row;
$sb->wipe_clean($master_dbh);
#$sb->create_dbs($master_dbh, [qw(test)]);
# Most other tests implicitly test that --create-replicate-table is on
# by default because they use that functionality. So here we need to
# test that we can turn it off, that it doesn't blow up if the repl table
# already exists, etc.
eval {
pt_table_checksum::main(@args, '--no-create-replicate-table');
};
#1
like(
$EVAL_ERROR,
qr/--replicate database percona does not exist/,
"--no-create-replicate-table dies if db doesn't exist"
);
$master_dbh->do('create database percona');
$master_dbh->do('use percona');
eval {
pt_table_checksum::main(@args, '--no-create-replicate-table');
};
#2
like(
$EVAL_ERROR,
qr/--replicate table `percona`.`checksums` does not exist/,
"--no-create-replicate-table dies if table doesn't exist"
);
my $create_repl_table =
"CREATE TABLE `checksums` (
db char(64) NOT NULL,
tbl char(64) NOT NULL,
chunk int NOT NULL,
chunk_time float NULL,
chunk_index varchar(200) NULL,
lower_boundary text NULL,
upper_boundary text NULL,
this_crc char(40) NOT NULL,
this_cnt int NOT NULL,
master_crc char(40) NULL,
master_cnt int NULL,
ts timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (db, tbl, chunk)
) ENGINE=InnoDB;";
$master_dbh->do($create_repl_table);
$output = output(
sub { pt_table_checksum::main(@args, '--no-create-replicate-table',
qw(-t sakila.country)) },
);
#3
like(
$output,
qr/^\S+\s+0\s+0\s+109\s+0\s+1\s+0\s+\S+\s+sakila.country$/m,
"Uses pre-created replicate table"
) or diag($output);
# ############################################################################
# Issue 1318: mk-tabke-checksum --create-replicate-table doesn't replicate
# ############################################################################
$sb->wipe_clean($master_dbh);
# Wait until the slave no longer has the percona db.
PerconaTest::wait_until(
sub {
eval { $slave_dbh->do("use percona") };
return 1 if $EVAL_ERROR;
return 0;
},
);
pt_table_checksum::main(@args, qw(-t sakila.country --quiet));
# Wait until the repl table replicates, or timeout.
PerconaTest::wait_for_table($slave_dbh, 'percona.checksums');
$row = $slave_dbh->selectrow_arrayref("show tables from percona");
is_deeply(
$row,
['checksums'],
'Auto-created replicate table replicates (issue 1318)'
);
# #############################################################################
# Done.
# #############################################################################
$sb->wipe_clean($master_dbh);
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
exit;
|