File: create_replicate_table.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 (134 lines) | stat: -rw-r--r-- 4,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
#!/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;