mirror of
https://github.com/MariaDB/server.git
synced 2025-01-15 19:42:28 +01:00
5cc2096f93
Perl DBD::MariaDB driver is available CPAN and is already used in production environment.
107 lines
2.4 KiB
Perl
Executable file
107 lines
2.4 KiB
Perl
Executable file
#! /usr/bin/perl
|
|
|
|
# Test START TRANSACTION WITH CONSISTENT SNAPSHOT.
|
|
# With MWL#116, this is implemented so it is actually consistent.
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use DBI;
|
|
|
|
my $UPDATERS= 10;
|
|
my $READERS= 5;
|
|
|
|
my $ROWS= 50;
|
|
my $DURATION= 20;
|
|
|
|
my $stop_time= time() + $DURATION;
|
|
|
|
sub my_connect {
|
|
my $dbh= DBI->connect("DBI:MariaDB:mariadb_socket=/tmp/mysql.sock;database=test",
|
|
"root", undef, { RaiseError=>1, PrintError=>0, AutoCommit=>0});
|
|
$dbh->do("SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ");
|
|
$dbh->do("SET SESSION autocommit = 0");
|
|
return $dbh;
|
|
}
|
|
|
|
sub my_setup {
|
|
my $dbh= my_connect();
|
|
|
|
$dbh->do("DROP TABLE IF EXISTS test_consistent_snapshot1, test_consistent_snapshot2");
|
|
$dbh->do(<<TABLE);
|
|
CREATE TABLE test_consistent_snapshot1 (
|
|
a INT PRIMARY KEY,
|
|
b INT NOT NULL
|
|
) ENGINE=InnoDB
|
|
TABLE
|
|
$dbh->do(<<TABLE);
|
|
CREATE TABLE test_consistent_snapshot2(
|
|
a INT PRIMARY KEY,
|
|
b INT NOT NULL
|
|
) ENGINE=PBXT
|
|
TABLE
|
|
|
|
for (my $i= 0; $i < $ROWS; $i++) {
|
|
my $value= int(rand()*1000);
|
|
$dbh->do("INSERT INTO test_consistent_snapshot1 VALUES (?, ?)", undef,
|
|
$i, $value);
|
|
$dbh->do("INSERT INTO test_consistent_snapshot2 VALUES (?, ?)", undef,
|
|
$i, -$value);
|
|
}
|
|
$dbh->commit();
|
|
$dbh->disconnect();
|
|
}
|
|
|
|
sub my_updater {
|
|
my $dbh= my_connect();
|
|
|
|
while (time() < $stop_time) {
|
|
my $i1= int(rand()*$ROWS);
|
|
my $i2= int(rand()*$ROWS);
|
|
my $v= int(rand()*99)-49;
|
|
$dbh->do("UPDATE test_consistent_snapshot1 SET b = b + ? WHERE a = ?",
|
|
undef, $v, $i1);
|
|
$dbh->do("UPDATE test_consistent_snapshot2 SET b = b - ? WHERE a = ?",
|
|
undef, $v, $i2);
|
|
$dbh->commit();
|
|
}
|
|
|
|
$dbh->disconnect();
|
|
exit(0);
|
|
}
|
|
|
|
sub my_reader {
|
|
my $dbh= my_connect();
|
|
|
|
my $iteration= 0;
|
|
while (time() < $stop_time) {
|
|
$dbh->do("START TRANSACTION WITH CONSISTENT SNAPSHOT");
|
|
my $s1= $dbh->selectrow_arrayref("SELECT SUM(b) FROM test_consistent_snapshot1");
|
|
$s1= $s1->[0];
|
|
my $s2= $dbh->selectrow_arrayref("SELECT SUM(b) FROM test_consistent_snapshot2");
|
|
$s2= $s2->[0];
|
|
$dbh->commit();
|
|
if ($s1 + $s2 != 0) {
|
|
print STDERR "Found inconsistency, s1=$s1 s2=$s2 iteration=$iteration\n";
|
|
last;
|
|
}
|
|
++$iteration;
|
|
}
|
|
|
|
$dbh->disconnect();
|
|
exit(0);
|
|
}
|
|
|
|
my_setup();
|
|
|
|
for (1 .. $UPDATERS) {
|
|
fork() || my_updater();
|
|
}
|
|
|
|
for (1 .. $READERS) {
|
|
fork() || my_reader();
|
|
}
|
|
|
|
waitpid(-1, 0) for (1 .. ($UPDATERS + $READERS));
|
|
|
|
print "All checks done\n";
|