summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMagnus Svensson <msvensson@mysql.com>2008-08-10 19:46:43 +0200
committerMagnus Svensson <msvensson@mysql.com>2008-08-10 19:46:43 +0200
commit182b14114a8bc2a75f7d457b2bc11cca8017952d (patch)
tree60e1c6442c2dd28dc92df1d73a83b123ae118333
parent36bebcc13cd165416db7c2ab10e2859e070a9eb3 (diff)
downloadmariadb-git-182b14114a8bc2a75f7d457b2bc11cca8017952d.tar.gz
Fixup mtr_unique. Remove usage of ps and grep. Make it a module. Move _process_alive to Platform.pm. Rename opt_baseport to baseport, it's not an option
-rw-r--r--mysql-test/lib/My/Platform.pm14
-rw-r--r--mysql-test/lib/My/SafeProcess.pm11
-rw-r--r--mysql-test/lib/mtr_unique.pl178
-rw-r--r--mysql-test/lib/mtr_unique.pm184
-rwxr-xr-xmysql-test/mysql-test-run.pl22
5 files changed, 209 insertions, 200 deletions
diff --git a/mysql-test/lib/My/Platform.pm b/mysql-test/lib/My/Platform.pm
index b934b08f522..1db6985771d 100644
--- a/mysql-test/lib/My/Platform.pm
+++ b/mysql-test/lib/My/Platform.pm
@@ -21,7 +21,7 @@ use strict;
use base qw(Exporter);
our @EXPORT= qw(IS_CYGWIN IS_WINDOWS IS_WIN32PERL
native_path posix_path mixed_path
- check_socket_path_length);
+ check_socket_path_length process_alive);
BEGIN {
if ($^O eq "cygwin") {
@@ -123,4 +123,16 @@ sub check_socket_path_length {
}
+sub process_alive {
+ my ($pid)= @_;
+ die "usage: process_alive(pid)" unless $pid;
+
+ return kill(0, $pid) unless IS_WINDOWS;
+
+ my @list= split(/,/, `tasklist /FI "PID eq $pid" /NH /FO CSV`);
+ my $ret_pid= eval($list[1]);
+ return ($ret_pid == $pid);
+}
+
+
1;
diff --git a/mysql-test/lib/My/SafeProcess.pm b/mysql-test/lib/My/SafeProcess.pm
index 7762441496c..83749514622 100644
--- a/mysql-test/lib/My/SafeProcess.pm
+++ b/mysql-test/lib/My/SafeProcess.pm
@@ -100,17 +100,6 @@ else
}
-sub _process_alive {
- my ($pid)= @_;
-
- return kill(0, $pid) unless IS_WINDOWS;
-
- my @list= split(/,/, `tasklist /FI "PID eq $pid" /NH /FO CSV`);
- my $ret_pid= eval($list[1]);
- return ($ret_pid == $pid);
-}
-
-
sub new {
my $class= shift;
diff --git a/mysql-test/lib/mtr_unique.pl b/mysql-test/lib/mtr_unique.pl
deleted file mode 100644
index a668fc097c7..00000000000
--- a/mysql-test/lib/mtr_unique.pl
+++ /dev/null
@@ -1,178 +0,0 @@
-# -*- cperl -*-
-# Copyright (C) 2006 MySQL AB
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; version 2 of the License.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-#
-# This file is used from mysql-test-run.pl when choosing
-# port numbers and directories to use for running mysqld.
-#
-
-use strict;
-use Fcntl ':flock';
-
-#
-# Requested IDs are stored in a hash and released upon END.
-#
-my %mtr_unique_assigned_ids = ();
-my $mtr_unique_pid;
-BEGIN {
- $mtr_unique_pid = $$ unless defined $mtr_unique_pid;
-}
-END {
- if($mtr_unique_pid == $$) {
- while(my ($id,$file) = each(%mtr_unique_assigned_ids)) {
- print "Autoreleasing $file:$id\n";
- mtr_release_unique_id($file, $id);
- }
- }
-}
-
-#
-# Require a unique, numerical ID, given a file name (where all
-# requested IDs are stored), a minimum and a maximum value.
-#
-# We use flock to implement locking for the ID file and ignore
-# possible problems arising from lack of support for it on
-# some platforms (it should work on most, and the possible
-# race condition would occur rarely). The proper solution for
-# this is a daemon that manages IDs, of course.
-#
-# If no unique ID within the specified parameters can be
-# obtained, return undef.
-#
-sub mtr_require_unique_id($$$) {
- my $file = shift;
- my $min = shift;
- my $max = shift;
- my $ret = undef;
- my $changed = 0;
-
- my $can_use_ps = `ps -e | grep '^[ ]*$$ '`;
-
- if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
- die 'lock file is a symbolic link';
- }
-
- chmod 0777, "$file.sem";
- open SEM, ">", "$file.sem" or die "can't write to $file.sem";
- flock SEM, LOCK_EX or die "can't lock $file.sem";
- if(! -e $file) {
- open FILE, ">", $file or die "can't create $file";
- close FILE;
- }
-
- if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
- die 'lock file is a symbolic link';
- }
-
- chmod 0777, $file;
- open FILE, "+<", $file or die "can't open $file";
- select undef,undef,undef,0.2;
- seek FILE, 0, 0;
- my %taken = ();
- while(<FILE>) {
- chomp;
- my ($id, $pid) = split / /;
- $taken{$id} = $pid;
- if($can_use_ps) {
- my $res = `ps -e | grep '^[ ]*$pid '`;
- if(!$res) {
- print "Ignoring slot $id used by missing process $pid.\n";
- delete $taken{$id};
- ++$changed;
- }
- }
- }
- for(my $i=$min; $i<=$max; ++$i) {
- if(! exists $taken{$i}) {
- $ret = $i;
- $taken{$i} = $$;
- ++$changed;
- last;
- }
- }
- if($changed) {
- seek FILE, 0, 0;
- truncate FILE, 0 or die "can't truncate $file";
- for my $k (keys %taken) {
- print FILE $k . ' ' . $taken{$k} . "\n";
- }
- }
- close FILE;
- flock SEM, LOCK_UN or warn "can't unlock $file.sem";
- close SEM;
- $mtr_unique_assigned_ids{$ret} = $file if defined $ret;
- return $ret;
-}
-
-#
-# Require a unique ID like above, but sleep if no ID can be
-# obtained immediately.
-#
-sub mtr_require_unique_id_and_wait($$$) {
- my $ret = mtr_require_unique_id($_[0],$_[1],$_[2]);
- while(! defined $ret) {
- sleep 30;
- $ret = mtr_require_unique_id($_[0],$_[1],$_[2]);
- print "Waiting for unique id to become available...\n" unless $ret;
- }
- return $ret;
-}
-
-#
-# Release a unique ID.
-#
-sub mtr_release_unique_id($$) {
- my $file = shift;
- my $myid = shift;
-
- if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
- die 'lock file is a symbolic link';
- }
-
- open SEM, ">", "$file.sem" or die "can't write to $file.sem";
- flock SEM, LOCK_EX or die "can't lock $file.sem";
-
- if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
- die 'lock file is a symbolic link';
- }
-
- if(! -e $file) {
- open FILE, ">", $file or die "can't create $file";
- close FILE;
- }
- open FILE, "+<", $file or die "can't open $file";
- select undef,undef,undef,0.2;
- seek FILE, 0, 0;
- my %taken = ();
- while(<FILE>) {
- chomp;
- my ($id, $pid) = split / /;
- $taken{$id} = $pid;
- }
- delete $taken{$myid};
- seek FILE, 0, 0;
- truncate FILE, 0 or die "can't truncate $file";
- for my $k (keys %taken) {
- print FILE $k . ' ' . $taken{$k} . "\n";
- }
- close FILE;
- flock SEM, LOCK_UN or warn "can't unlock $file.sem";
- close SEM;
- delete $mtr_unique_assigned_ids{$myid};
-}
-
-1;
-
diff --git a/mysql-test/lib/mtr_unique.pm b/mysql-test/lib/mtr_unique.pm
new file mode 100644
index 00000000000..22a23644540
--- /dev/null
+++ b/mysql-test/lib/mtr_unique.pm
@@ -0,0 +1,184 @@
+# -*- cperl -*-
+# Copyright (C) 2006 MySQL AB
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+package mtr_unique;
+
+use strict;
+use Fcntl ':flock';
+
+use base qw(Exporter);
+our @EXPORT= qw(mtr_get_unique_id mtr_release_unique_id);
+
+use My::Platform;
+
+sub msg {
+ # print "### unique($$) - ", join(" ", @_), "\n";
+}
+
+my $file= "/tmp/mysql-test-ports";
+
+my %mtr_unique_ids;
+
+END {
+ my $allocated_id= $mtr_unique_ids{$$};
+ if (defined $allocated_id)
+ {
+ mtr_release_unique_id($allocated_id);
+ }
+ delete $mtr_unique_ids{$$};
+}
+
+#
+# Get a unique, numerical ID, given a file name (where all
+# requested IDs are stored), a minimum and a maximum value.
+#
+# If no unique ID within the specified parameters can be
+# obtained, return undef.
+#
+sub mtr_get_unique_id($$) {
+ my ($min, $max)= @_;;
+
+ msg("get, '$file', $min-$max");
+
+ die "Can only get one unique id per process!" if $mtr_unique_ids{$$};
+
+ my $ret = undef;
+ my $changed = 0;
+
+ if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
+ die 'lock file is a symbolic link';
+ }
+
+ chmod 0777, "$file.sem";
+ open SEM, ">", "$file.sem" or die "can't write to $file.sem";
+ flock SEM, LOCK_EX or die "can't lock $file.sem";
+ if(! -e $file) {
+ open FILE, ">", $file or die "can't create $file";
+ close FILE;
+ }
+
+ msg("HAVE THE LOCK");
+
+ if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
+ die 'lock file is a symbolic link';
+ }
+
+ chmod 0777, $file;
+ open FILE, "+<", $file or die "can't open $file";
+ #select undef,undef,undef,0.2;
+ seek FILE, 0, 0;
+ my %taken = ();
+ while(<FILE>) {
+ chomp;
+ my ($id, $pid) = split / /;
+ $taken{$id} = $pid;
+ msg("taken: $id, $pid");
+ # Check if process with given pid is alive
+ if(!process_alive($pid)) {
+ msg("Removing slot $id used by missing process $pid");;
+ delete $taken{$id};
+ $changed++;
+ }
+ }
+ for(my $i=$min; $i<=$max; ++$i) {
+ if(! exists $taken{$i}) {
+ $ret = $i;
+ $taken{$i} = $$;
+ $changed++;
+ # Remember the id this process got
+ $mtr_unique_ids{$$}= $i;
+ msg(" got $i");
+ last;
+ }
+ }
+ if($changed) {
+ seek FILE, 0, 0;
+ truncate FILE, 0 or die "can't truncate $file";
+ for my $k (keys %taken) {
+ print FILE $k . ' ' . $taken{$k} . "\n";
+ }
+ }
+ close FILE;
+
+ msg("RELEASING THE LOCK");
+ flock SEM, LOCK_UN or warn "can't unlock $file.sem";
+ close SEM;
+
+ return $ret;
+}
+
+
+#
+# Release a unique ID.
+#
+sub mtr_release_unique_id($) {
+ my ($myid)= @_;
+
+ msg("release, $myid");
+
+
+ if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
+ die 'lock file is a symbolic link';
+ }
+
+ open SEM, ">", "$file.sem" or die "can't write to $file.sem";
+ flock SEM, LOCK_EX or die "can't lock $file.sem";
+
+ msg("HAVE THE LOCK");
+
+ if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
+ die 'lock file is a symbolic link';
+ }
+
+ if(! -e $file) {
+ open FILE, ">", $file or die "can't create $file";
+ close FILE;
+ }
+ open FILE, "+<", $file or die "can't open $file";
+ #select undef,undef,undef,0.2;
+ seek FILE, 0, 0;
+ my %taken = ();
+ while(<FILE>) {
+ chomp;
+ my ($id, $pid) = split / /;
+ msg(" taken, $id $pid");
+ $taken{$id} = $pid;
+ }
+
+ if ($taken{$myid} != $$)
+ {
+ msg(" The unique id for this process does not match pid");
+ }
+
+
+ msg(" removing $myid");
+ delete $taken{$myid};
+ seek FILE, 0, 0;
+ truncate FILE, 0 or die "can't truncate $file";
+ for my $k (keys %taken) {
+ print FILE $k . ' ' . $taken{$k} . "\n";
+ }
+ close FILE;
+
+ msg("RELEASE THE LOCK");
+
+ flock SEM, LOCK_UN or warn "can't unlock $file.sem";
+ close SEM;
+}
+
+
+1;
+
diff --git a/mysql-test/mysql-test-run.pl b/mysql-test/mysql-test-run.pl
index 212cf07ef0e..2dc3fce6ba0 100755
--- a/mysql-test/mysql-test-run.pl
+++ b/mysql-test/mysql-test-run.pl
@@ -53,6 +53,7 @@ use My::SysInfo;
use mtr_cases;
use mtr_report;
use mtr_match;
+use mtr_unique;
use IO::Socket::INET;
use IO::Select;
@@ -60,7 +61,6 @@ require "lib/mtr_process.pl";
require "lib/mtr_io.pl";
require "lib/mtr_gcov.pl";
require "lib/mtr_misc.pl";
-require "lib/mtr_unique.pl";
$SIG{INT}= sub { mtr_error("Got ^C signal"); };
@@ -143,7 +143,7 @@ our $opt_client_debugger;
my $config; # The currently running config
my $current_config_name; # The currently running config file template
-my $opt_baseport;
+my $baseport;
my $opt_build_thread= $ENV{'MTR_BUILD_THREAD'} || "auto";
my $opt_record;
@@ -1181,24 +1181,26 @@ sub set_build_thread_ports($) {
if ( lc($build_thread) eq 'auto' ) {
mtr_report("Requesting build thread... ");
- $build_thread=
- mtr_require_unique_id_and_wait("/tmp/mysql-test-ports", 200, 299);
+ $build_thread= mtr_get_unique_id(200, 299);
+ if ( !defined $build_thread ) {
+ mtr_error("Could not get a unique build thread id");
+ }
mtr_report(" - got $build_thread");
}
$ENV{MTR_BUILD_THREAD}= $build_thread;
$opt_build_thread= $build_thread;
# Calculate baseport
- $opt_baseport= $build_thread * 10 + 10000;
- if ( $opt_baseport < 5001 or $opt_baseport + 9 >= 32767 )
+ $baseport= $build_thread * 10 + 10000;
+ if ( $baseport < 5001 or $baseport + 9 >= 32767 )
{
mtr_error("MTR_BUILD_THREAD number results in a port",
"outside 5001 - 32767",
- "($opt_baseport - $opt_baseport + 9)");
+ "($baseport - $baseport + 9)");
}
mtr_report("Using MTR_BUILD_THREAD $build_thread,",
- "with reserved ports $opt_baseport..".($opt_baseport+9));
+ "with reserved ports $baseport..".($baseport+9));
}
@@ -2286,7 +2288,7 @@ sub kill_leftovers ($) {
sub check_ports_free
{
my @ports_to_check;
- for ($opt_baseport..$opt_baseport+9){
+ for ($baseport..$baseport+9){
push(@ports_to_check, $_);
}
mtr_report("Checking ports...");
@@ -2931,7 +2933,7 @@ sub run_testcase ($) {
extra_template_path => $tinfo->{extra_template_path},
vardir => $opt_vardir,
tmpdir => $opt_tmpdir,
- baseport => $opt_baseport,
+ baseport => $baseport,
#hosts => [ 'host1', 'host2' ],
user => $opt_user,
password => '',