File: progress.t

package info (click to toggle)
percona-toolkit 3.2.1-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 68,916 kB
  • sloc: perl: 241,287; sql: 22,868; sh: 19,746; javascript: 6,799; makefile: 353; awk: 38; python: 30; sed: 1
file content (147 lines) | stat: -rw-r--r-- 5,030 bytes parent folder | download | duplicates (2)
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
135
136
137
138
139
140
141
142
143
144
145
146
147
#!/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;

# Hostnames make testing less accurate.  Tests need to see
# that such-and-such happened on specific slave hosts, but
# the sandbox servers are all on one host so all slaves have
# the same hostname.
$ENV{PERCONA_TOOLKIT_TEST_USE_DSN_NAMES} = 1;

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 $slave1_dbh = $sb->get_dbh_for('slave1');
my $slave2_dbh = $sb->get_dbh_for('slave2');

if ( !$master_dbh ) {
   plan skip_all => 'Cannot connect to sandbox master';
}
elsif ( !$slave1_dbh ) {
   plan skip_all => 'Cannot connect to sandbox slave1';
}
elsif ( !$slave2_dbh ) {
   plan skip_all => 'Cannot connect to sandbox slave2';
}
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. Setting
# --chunk-size may help prevent the tool from running too fast and finishing
# before the TEST_WISHLIST job below finishes. (Or, it might just make things
# worse. This is a random stab in the dark. There is a problem either way.)
my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox';
my @args       = ($master_dsn, qw(--set-vars innodb_lock_wait_timeout=3),
                   '--chunk-size', '200'); 
my $output;
my $row;
my $scripts = "$trunk/t/pt-table-checksum/scripts/";

# ############################################################################
# Tool should check all slaves' lag, so slave2, not just slave1.
# ############################################################################

# Must have empty checksums table for these tests.
$master_dbh->do('drop table if exists percona.checksums');

# Must not be lagging.
$sb->wait_for_slaves();

# This big fancy command waits until it sees the checksum for sakila.city
# in the repl table on the master, then it stops slave2 for 2 seconds,
# then starts it again.
# TEST_WISHLIST PLUGIN_WISHLIST: do this with a plugin to the tool itself,
# not in this unreliable fashion.

# Notice there are 3 *different* wait type commands involved
# Final integer in the line is the run-time allowed for the "outermost" wait (wait-to-exec). If it is absent it defaults to 1, which may not be enough for sakila.city# chunk to appear (at least on slow systems)

system("$trunk/util/wait-to-exec '$scripts/wait-for-chunk.sh 12345 sakila city 1' '$scripts/exec-wait-exec.sh 12347 \"stop slave\" 5 \"start slave\"' 12 >/dev/null &");

$output = output(
   sub { pt_table_checksum::main(@args, qw(-d sakila)); },
   stderr => 1,
);

like(
   $output,
   qr/Replica h=127.0.0.1,P=12347 is stopped/,
   "--progress for slave lag"
);

like(
   $output,
   qr/sakila.store$/m,
   "Checksumming continues after waiting for slave lag"
);

is(
   PerconaTest::count_checksum_results($output, 'errors'),
   0,
   "No errors after waiting for slave lag"
);

# Now wait until the SQL thread is started again.
$sb->wait_for_slaves();

# #############################################################################
# Wait for --replicate table to replicate.
# https://bugs.launchpad.net/percona-toolkit/+bug/1008778
# #############################################################################
$master_dbh->do("DROP DATABASE IF EXISTS percona");
wait_until(sub {
   my $dbs = $slave2_dbh->selectall_arrayref("SHOW DATABASES");
   return !grep { $_->[0] eq 'percona' } @$dbs;
});

$sb->load_file('master', "t/pt-table-checksum/samples/dsn-table.sql");

$slave2_dbh->do("STOP SLAVE");
wait_until(sub {
   my $ss = $slave2_dbh->selectrow_hashref("SHOW SLAVE STATUS");
   return $ss->{slave_io_running} eq 'Yes';
});


@args       = ($master_dsn, qw(--set-vars innodb_lock_wait_timeout=3),
                  '--progress', 'time,2', '--max-load', '', '--chunk-size', '500');

($output) = PerconaTest::full_output(
   sub { pt_table_checksum::main(@args, qw(-t sakila.country),
      "--recursion-method", "dsn=F=/tmp/12345/my.sandbox.cnf,t=dsns.dsns");
   },
   wait_for => 3,  # wait this many seconds then kill that ^
);

like(
   $output,
   qr/Waiting for the --replicate table to replicate to h=127.1,P=12347/,
   "--progress for --replicate table (bug 1008778)"
);

$slave2_dbh->do("START SLAVE");

$sb->wait_for_slaves();

# #############################################################################
# Done.
# #############################################################################
$sb->wipe_clean($master_dbh);
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox");
exit;