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
|
#!/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-sync";
my $dp = new DSNParser(opts=>$dsn_opts);
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp);
my $source_dbh = $sb->get_dbh_for('source');
my $replica_dbh = $sb->get_dbh_for('replica1');
if ( !$source_dbh ) {
plan skip_all => 'Cannot connect to sandbox source';
}
elsif ( !$replica_dbh ) {
plan skip_all => 'Cannot connect to sandbox replica';
}
else {
plan tests => 5;
}
my $output;
my @args = ('--sync-to-source', 'h=127.1,P=12346,u=msandbox,p=msandbox', qw(--print -v));
$sb->load_file('source', 't/pt-table-sync/samples/lag-slave.sql');
wait_until(
sub {
my $row;
eval {
$row = $replica_dbh->selectrow_hashref("select * from test.t2");
};
return 1 if $row && $row->{id};
},
);
sub lag_replica {
my $dbh = $sb->get_dbh_for('source');
for (1..10) {
$dbh->do("update test.t1 set i=sleep(3) limit 1");
}
$dbh->disconnect;
return;
}
my $pid = fork();
if ( !$pid ) {
# child
lag_replica();
exit;
}
# We need to sleep here to get child process to start
sleep(2);
# parent
PerconaTest::wait_until(sub {
$replica_dbh->selectrow_hashref("show ${replica_name} status")->{"seconds_behind_${source_name}"}
}) or do {
kill 15, $pid;
waitpid ($pid, 0);
die "Replica did not lag";
};
my $start = time;
$output = output(
sub { pt_table_sync::main(@args, qw(-t test.t2)) },
);
my $t = time - $start;
like(
$output,
qr/Chunk\s+\S+\s+\S+\s+0\s+test\.t2/,
"Synced table"
);
cmp_ok(
$t,
'>',
1,
"Sync waited $t seconds for source"
);
# Repeat the test with --wait 0 to test that the sync happens without delay.
PerconaTest::wait_until(sub {
$replica_dbh->selectrow_hashref("show ${replica_name} status")->{"seconds_behind_${source_name}"}
}) or do {
kill 15, $pid;
waitpid ($pid, 0);
die "Replica did not lag";
};
$start = time;
$output = output(
sub { pt_table_sync::main(@args, qw(-t test.t2 --wait 0)) },
);
$t = time - $start;
like(
$output,
qr/Chunk\s+\S+\s+\S+\s+0\s+test\.t2/,
"Synced table"
);
cmp_ok(
$t,
'<=',
1,
"Sync did not wait for source with --wait 0 ($t seconds)"
);
# #############################################################################
# Done.
# #############################################################################
kill 15, $pid;
waitpid ($pid, 0);
$sb->wipe_clean($source_dbh);
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
exit;
|