summaryrefslogtreecommitdiff
path: root/tests/lock_test.pl
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lock_test.pl')
-rwxr-xr-xtests/lock_test.pl94
1 files changed, 94 insertions, 0 deletions
diff --git a/tests/lock_test.pl b/tests/lock_test.pl
new file mode 100755
index 00000000000..5daeeddad8e
--- /dev/null
+++ b/tests/lock_test.pl
@@ -0,0 +1,94 @@
+#!/usr/bin/perl
+
+# This is a test with uses two processes to a database.
+# The other inserts records in two tables, the other does a lot of joins
+# on these.
+# Every time the read thread outputs info, it does a ALTER TABLE command
+# which should stop the insert thread until the ALTER TABLE command is ready.
+#
+# Warning, the output from this test will differ in 'found' from time to time,
+# but there should never be any errors
+#
+
+$host = shift || "";
+$test_db="test";
+$test_count=10000;
+srand 0; # Repeatable test
+
+use Mysql;
+$|= 1; # Autoflush
+
+$dbh = Mysql->Connect($host) || die "Can't connect: $Mysql::db_errstr\n";
+$dbh->SelectDB($test_db) || die "Can't use database $test_db: $Mysql::db_errstr\n";
+
+$firsttable = "test_lock_1";
+$secondtable = "test_lock_2";
+$dbh->Query("drop table $firsttable");
+$dbh->Query("drop table $secondtable");
+
+print "Creating tables $firsttable and $secondtable in database $test_db\n";
+$dbh->Query("create table $firsttable (id int(6) not null, info char(32), auto int(11) not null auto_increment, primary key(id),key(auto))") or die $Mysql::db_errstr;
+
+$dbh->Query("create table $secondtable (id int(6) not null, info varchar(32), key(id))") or die $Mysql::db_errstr;
+
+$dbh=0; # Close handler
+
+if (fork() == 0)
+{ # Insert process
+ $dbh = Mysql->Connect($host) || die "Can't connect: $Mysql::db_errstr\n";
+ $dbh->SelectDB($test_db) || die "Can't use database $test_db: $Mysql::db_errstr\n";
+ $first_id=1; $second_id=1;
+ $first_count=$second_count=0;
+ print "Writing started\n";
+ for ($i=1 ; $i <= $test_count ; $i++)
+ {
+ if (rand(3) <= 1)
+ {
+ $sth=$dbh->Query("insert into $firsttable values ($first_id,'This is entry $i',NULL)") || die "Got error on insert: $Mysql::db_errstr\n";
+ die "Row not inserted, aborting\n" if ($sth->affected_rows != 1);
+ $first_id++;
+ $first_count++;
+ }
+ else
+ {
+ $sth=$dbh->Query("insert into $secondtable values ($second_id,'This is entry $i')") || die "Got error on insert: $Mysql::db_errstr\n";
+ die "Row not inserted, aborting\n" if ($sth->affected_rows != 1);
+ $second_id++ if (rand(10) <= 1); # Don't always count it up
+ $second_count++;
+ }
+ print "Write: $i\n" if ($i % 1000 == 0);
+ }
+ print "Writing done ($first_count $second_count)\n";
+}
+else
+{
+ $dbh = Mysql->Connect($host) || die "Can't connect: $Mysql::db_errstr\n";
+ $dbh->SelectDB($test_db) || die "Can't use database $test_db: $Mysql::db_errstr\n";
+ $locked=$found=0;
+ print "Reading started\n";
+ for ($i=1 ; $i <= $test_count ; $i++)
+ {
+ $id=int(rand($test_count)/3)+1;
+ $sth=$dbh->Query("select count(*) from $firsttable,$secondtable where $firsttable.id = $secondtable.id and $firsttable.id=$id") || die "Got error on select: $Mysql::db_errstr\n";
+ $found++ if ($sth->numrows);
+ if ($i % 1000 == 0)
+ {
+ print "Read: $i Found: $found\n";
+ if ($found)
+ {
+ $locked=1-$locked;
+ if ($locked)
+ {
+ $sth=$dbh->Query("lock tables $firsttable write,$secondtable write");
+ }
+ $sth=$dbh->Query("alter table $firsttable CHANGE id id int(6) not null") || die "Got error on ALTER TABLE: $Mysql::db_errstr\n";
+ $sth=$dbh->Query("alter table $secondtable CHANGE info info char(32) not null") || die "Got error on ALTER TABLE: $Mysql::db_errstr\n";
+ if ($locked)
+ {
+ $sth=$dbh->Query("unlock tables");
+ }
+ }
+ }
+ }
+ print "Reading done Found: $found\n";
+}