-
Notifications
You must be signed in to change notification settings - Fork 316
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* added new hook before_die before die, the script calls this hook in oder to execute extra user's operations * PR-509 - added new hook before_die - Added test cases --------- Co-authored-by: Sveta Smirnova <sveta.smirnova@percona.com>
- Loading branch information
1 parent
a15207e
commit 8e48248
Showing
6 changed files
with
222 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
#!/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 Data::Dumper; | ||
use PerconaTest; | ||
use Sandbox; | ||
|
||
require "$trunk/bin/pt-online-schema-change"; | ||
|
||
my $dp = new DSNParser(opts=>$dsn_opts); | ||
my $sb = new Sandbox(basedir => '/tmp', DSNParser => $dp); | ||
my $master_dbh = $sb->get_dbh_for('master'); | ||
|
||
if ( !$master_dbh ) { | ||
plan skip_all => 'Cannot connect to sandbox master'; | ||
} | ||
|
||
# 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. | ||
my $master_dsn = 'h=127.1,P=12345,u=msandbox,p=msandbox'; | ||
my @args = (qw(--set-vars innodb_lock_wait_timeout=3)); | ||
my $sample = "t/pt-online-schema-change/samples/"; | ||
my $plugin = "$trunk/$sample/plugins"; | ||
my $output; | ||
my $exit_status; | ||
|
||
# ############################################################################ | ||
# https://bugs.launchpad.net/percona-toolkit/+bug/1171653 | ||
# | ||
# ############################################################################ | ||
$sb->load_file('master', "$sample/basic_no_fks.sql"); | ||
|
||
# Should be greater than chunk-size and big enough, so plugin will trigger few times | ||
my $num_rows = 5000; | ||
diag("Loading $num_rows into the table. This might take some time."); | ||
diag(`util/mysql_random_data_load --host=127.0.0.1 --port=12345 --user=msandbox --password=msandbox pt_osc t $num_rows`); | ||
|
||
($output, $exit_status) = full_output( | ||
sub { pt_online_schema_change::main(@args, | ||
"$master_dsn,D=pt_osc,t=t", | ||
"--alter", "CHARACTER SET utf9", | ||
'--plugin', "$plugin/before_die.pm", | ||
'--execute') }, | ||
); | ||
|
||
like( | ||
$output, | ||
qr/PLUGIN before_die/s, | ||
'Plugin before_die called for invalid ALTER command' | ||
); | ||
|
||
like( | ||
$output, | ||
qr/Exit status: .*Unknown character set: 'utf9'/s, | ||
'Expected exit status for invalid ALTER command' | ||
); | ||
|
||
($output, $exit_status) = full_output( | ||
sub { pt_online_schema_change::main(@args, | ||
"$master_dsn,D=pt_osc,t=t", | ||
"--alter", "ENGINE=InnoDB", | ||
'--plugin', "$plugin/before_die_after_nibble.pm", | ||
'--execute') }, | ||
); | ||
|
||
like( | ||
$output, | ||
qr/PLUGIN before_die/s, | ||
'Plugin before_die called for error while copying nibble' | ||
); | ||
|
||
like( | ||
$output, | ||
qr/Exit status: .*You have an error in your SQL syntax/s, | ||
'Expected exit status for error while copying nibble' | ||
); | ||
|
||
($output, $exit_status) = full_output( | ||
sub { pt_online_schema_change::main(@args, | ||
"$master_dsn,D=pt_osc,t=t", | ||
"--alter", "ENGINE=InnoDB", | ||
'--plugin', "$plugin/before_die_after_create.pm", | ||
'--execute') }, | ||
); | ||
|
||
like( | ||
$output, | ||
qr/PLUGIN before_die/s, | ||
'Plugin before_die called for _die call' | ||
); | ||
|
||
like( | ||
$output, | ||
qr/Exit status: 4/s, | ||
'Expected exit status for table definition error handled in the _die call' | ||
); | ||
|
||
# ############################################################################# | ||
# Done. | ||
# ############################################################################# | ||
$sb->wipe_clean($master_dbh); | ||
ok($sb->ok(), "Sandbox servers") or BAIL_OUT(__FILE__ . " broke the sandbox"); | ||
done_testing; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package pt_online_schema_change_plugin; | ||
|
||
use strict; | ||
use warnings FATAL => 'all'; | ||
use English qw(-no_match_vars); | ||
use constant PTDEBUG => $ENV{PTDEBUG} || 0; | ||
|
||
sub new { | ||
my ($class, %args) = @_; | ||
my $self = { %args }; | ||
return bless $self, $class; | ||
} | ||
|
||
sub before_die { | ||
my ($self, %args) = @_; | ||
print "PLUGIN before_die\n"; | ||
print "Exit status: $args{exit_status}\n"; | ||
} | ||
|
||
1; |
33 changes: 33 additions & 0 deletions
33
t/pt-online-schema-change/samples/plugins/before_die_after_create.pm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package pt_online_schema_change_plugin; | ||
|
||
use strict; | ||
use warnings FATAL => 'all'; | ||
use English qw(-no_match_vars); | ||
use constant PTDEBUG => $ENV{PTDEBUG} || 0; | ||
|
||
sub new { | ||
my ($class, %args) = @_; | ||
my $self = { %args }; | ||
return bless $self, $class; | ||
} | ||
|
||
sub before_die { | ||
my ($self, %args) = @_; | ||
print "PLUGIN before_die\n"; | ||
print "Exit status: $args{exit_status}\n"; | ||
} | ||
|
||
sub after_create_new_table { | ||
my ($self, %args) = @_; | ||
|
||
print "PLUGIN after_create_new_table\n"; | ||
|
||
my $dbh = $self->{aux_cxn}->dbh; | ||
my $new_tbl = $args{new_tbl}->{name}; | ||
|
||
# Remove PRIMARY KEY, so pt-osc fails with an error and handles | ||
# it in the _die call | ||
$dbh->do("ALTER TABLE ${new_tbl} MODIFY COLUMN id INT NOT NULL, DROP PRIMARY KEY"); | ||
} | ||
|
||
1; |
32 changes: 32 additions & 0 deletions
32
t/pt-online-schema-change/samples/plugins/before_die_after_nibble.pm
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
package pt_online_schema_change_plugin; | ||
|
||
use strict; | ||
use warnings FATAL => 'all'; | ||
use English qw(-no_match_vars); | ||
use constant PTDEBUG => $ENV{PTDEBUG} || 0; | ||
|
||
sub new { | ||
my ($class, %args) = @_; | ||
my $self = { %args }; | ||
return bless $self, $class; | ||
} | ||
|
||
sub before_die { | ||
my ($self, %args) = @_; | ||
print "PLUGIN before_die\n"; | ||
print "Exit status: $args{exit_status}\n"; | ||
} | ||
|
||
sub on_copy_rows_after_nibble { | ||
my ($self, %args) = @_; | ||
my $tbl = $args{tbl}; | ||
print "PLUGIN on_copy_rows_after_nibble\n"; | ||
if ($tbl->{row_cnt} > 1000) { | ||
my $dbh = $self->{aux_cxn}->dbh; | ||
|
||
# Run invalid query to get error | ||
$dbh->do("SELECT * FRO " . $tbl->{name}); | ||
} | ||
} | ||
|
||
1; |