mirror of
https://github.com/percona/percona-toolkit.git
synced 2025-09-09 07:30:02 +00:00
Test and require wsrep_OSU_method=TOI.
This commit is contained in:
@@ -7840,6 +7840,19 @@ sub main {
|
||||
. ". Please upgrade the node, or run the tool on a newer node, "
|
||||
. "or contact Percona for support.\n";
|
||||
}
|
||||
|
||||
# If wsrep_OSU_method=RSU the "DDL will be only processed locally at
|
||||
# the node." So _table_new (the altered version of table) will not
|
||||
# replicate to other nodes but our INSERT..SELECT operations on it
|
||||
# will, thereby crashing all other nodes.
|
||||
my (undef, $wsrep_osu_method) = $cxn->dbh->selectrow_array(
|
||||
"SHOW VARIABLES LIKE 'wsrep\_OSU\_method'");
|
||||
if ( lc($wsrep_osu_method || '') ne 'toi' ) {
|
||||
die "wsrep_OSU_method=TOI is required because "
|
||||
. $cxn->name . " is a cluster node. wsrep_OSU_method is "
|
||||
. "currently set to " . ($wsrep_osu_method || '') . ". "
|
||||
. "Set it to TOI, or contact Percona for support.\n";
|
||||
}
|
||||
}
|
||||
|
||||
# ########################################################################
|
||||
@@ -9996,14 +10009,11 @@ The tool cannot alter MyISAM tables on L<"Percona XtraDB Cluster"> nodes.
|
||||
=head1 Percona XtraDB Cluster
|
||||
|
||||
pt-online-schema-change works with Percona XtraDB Cluster (PXC) 5.5.28-23.7
|
||||
and newer, but there is one limitation: only InnoDB tables can be altered.
|
||||
and newer, but there are two limitations: only InnoDB tables can be altered,
|
||||
and C<wsrep_OSU_method> must be set to C<TOI> (total order isolation).
|
||||
The tool exits with an error if the host is a cluster node and the table
|
||||
is MyISAM or is being converted to MyISAM (C<ENGINE=MyISAM>). There is no
|
||||
way to disable this check.
|
||||
|
||||
pt-online-schema-change is not the same as and does not require that
|
||||
C<wsrep_OSU_method> be set to C<RSU> (rolling schema upgrade). The tool
|
||||
can be used in either mode, C<RSU> or C<TOI> (total order isolation).
|
||||
is MyISAM or is being converted to MyISAM (C<ENGINE=MyISAM>), or if
|
||||
C<wsrep_OSU_method> is not C<TOI>. There is no way to disable these checks.
|
||||
|
||||
=head1 OUTPUT
|
||||
|
||||
|
@@ -134,11 +134,12 @@ sub get_dbh_for {
|
||||
my $dbh;
|
||||
# This is primarily for the benefit of CompareResults, but it's
|
||||
# also quite convenient when using an affected OS
|
||||
# TODO: this fails if the server isn't started yet.
|
||||
$cxn_ops->{L} = 1 if !exists $cxn_ops->{L}
|
||||
&& !$self->can_load_data('master');
|
||||
eval { $dbh = $dp->get_dbh($dp->get_cxn_params($dsn), $cxn_ops) };
|
||||
if ( $EVAL_ERROR ) {
|
||||
die 'Failed to get dbh for' . $server . ': ' . $EVAL_ERROR;
|
||||
die 'Failed to get dbh for ' . $server . ': ' . $EVAL_ERROR;
|
||||
}
|
||||
$dbh->{InactiveDestroy} = 1; # Prevent destroying on fork.
|
||||
$dbh->{FetchHashKeyName} = 'NAME_lc' unless $cxn_ops && $cxn_ops->{no_lc};
|
||||
|
@@ -31,12 +31,7 @@ my $node1 = $sb->get_dbh_for('node1');
|
||||
my $node2 = $sb->get_dbh_for('node2');
|
||||
my $node3 = $sb->get_dbh_for('node3');
|
||||
|
||||
my $db_flavor = VersionParser->new($node1)->flavor();
|
||||
|
||||
if ( $db_flavor !~ /XtraDB Cluster/ ) {
|
||||
plan skip_all => "PXC tests";
|
||||
}
|
||||
elsif ( !$node1 ) {
|
||||
if ( !$node1 ) {
|
||||
plan skip_all => 'Cannot connect to cluster node1';
|
||||
}
|
||||
elsif ( !$node2 ) {
|
||||
@@ -46,10 +41,14 @@ elsif ( !$node3 ) {
|
||||
plan skip_all => 'Cannot connect to cluster node3';
|
||||
}
|
||||
|
||||
my $db_flavor = VersionParser->new($node1)->flavor();
|
||||
if ( $db_flavor !~ /XtraDB Cluster/ ) {
|
||||
plan skip_all => "PXC tests";
|
||||
}
|
||||
|
||||
# The sandbox servers run with lock_wait_timeout=3 and it's not dynamic
|
||||
# so we need to specify --lock-wait-timeout=3 else the tool will die.
|
||||
my $node1_dsn = $sb->dsn_for('node1');
|
||||
my @args = ($node1_dsn, qw(--lock-wait-timeout 3));
|
||||
my $output;
|
||||
my $exit;
|
||||
my $sample = "t/pt-online-schema-change/samples/";
|
||||
@@ -104,6 +103,38 @@ like(
|
||||
"Convert table to MyISAM: error message"
|
||||
);
|
||||
|
||||
# #############################################################################
|
||||
# Require wsrep_OSU_method=TOI
|
||||
# #############################################################################
|
||||
|
||||
$node1->do("SET GLOBAL wsrep_OSU_method='RSU'");
|
||||
|
||||
($output, $exit) = full_output(
|
||||
sub { pt_online_schema_change::main(
|
||||
"$node1_dsn,D=pt_osc,t=t",
|
||||
qw(--lock-wait-timeout 5),
|
||||
qw(--print --execute --alter ENGINE=MyISAM)) },
|
||||
stderr => 1,
|
||||
);
|
||||
|
||||
ok(
|
||||
$exit,
|
||||
"wsrep_OSU_method=RSU: non-zero exit"
|
||||
) or diag($output);
|
||||
print $output;
|
||||
like(
|
||||
$output,
|
||||
qr/wsrep_OSU_method=TOI is required.+?currently set to RSU/,
|
||||
"wsrep_OSU_method=RSU: error message"
|
||||
);
|
||||
|
||||
$node1->do("SET GLOBAL wsrep_OSU_method='TOI'");
|
||||
is_deeply(
|
||||
$node1->selectrow_arrayref("SHOW VARIABLES LIKE 'wsrep_OSU_method'"),
|
||||
[qw(wsrep_OSU_method TOI)],
|
||||
"Restored wsrep_OSU_method=TOI"
|
||||
) or BAIL_OUT("Failed to restore wsrep_OSU_method=TOI");
|
||||
|
||||
# #############################################################################
|
||||
# Done.
|
||||
# #############################################################################
|
||||
|
Reference in New Issue
Block a user