2
# Copyright (C) 2006 MySQL AB
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; version 2 of the License.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
# This file is used from mysql-test-run.pl when choosing
19
# port numbers and directories to use for running mysqld.
26
# Requested IDs are stored in a hash and released upon END.
28
my %mtr_unique_assigned_ids = ();
31
$mtr_unique_pid = $$ unless defined $mtr_unique_pid;
34
if($mtr_unique_pid == $$) {
35
while(my ($id,$file) = each(%mtr_unique_assigned_ids)) {
36
print "Autoreleasing $file:$id\n";
37
mtr_release_unique_id($file, $id);
43
# Require a unique, numerical ID, given a file name (where all
44
# requested IDs are stored), a minimum and a maximum value.
46
# We use flock to implement locking for the ID file and ignore
47
# possible problems arising from lack of support for it on
48
# some platforms (it should work on most, and the possible
49
# race condition would occur rarely). The proper solution for
50
# this is a daemon that manages IDs, of course.
52
# If no unique ID within the specified parameters can be
53
# obtained, return undef.
55
sub mtr_require_unique_id($$$) {
62
my $can_use_ps = `ps -e | grep '^[ ]*$$ '`;
64
if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
65
die 'lock file is a symbolic link';
68
chmod 0777, "$file.sem";
69
open SEM, ">", "$file.sem" or die "can't write to $file.sem";
70
flock SEM, LOCK_EX or die "can't lock $file.sem";
72
open FILE, ">", $file or die "can't create $file";
76
if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
77
die 'lock file is a symbolic link';
81
open FILE, "+<", $file or die "can't open $file";
82
select undef,undef,undef,0.2;
87
my ($id, $pid) = split / /;
90
my $res = `ps -e | grep '^[ ]*$pid '`;
92
print "Ignoring slot $id used by missing process $pid.\n";
98
for(my $i=$min; $i<=$max; ++$i) {
99
if(! exists $taken{$i}) {
108
truncate FILE, 0 or die "can't truncate $file";
109
for my $k (keys %taken) {
110
print FILE $k . ' ' . $taken{$k} . "\n";
114
flock SEM, LOCK_UN or warn "can't unlock $file.sem";
116
$mtr_unique_assigned_ids{$ret} = $file if defined $ret;
121
# Require a unique ID like above, but sleep if no ID can be
122
# obtained immediately.
124
sub mtr_require_unique_id_and_wait($$$) {
125
my $ret = mtr_require_unique_id($_[0],$_[1],$_[2]);
126
while(! defined $ret) {
128
$ret = mtr_require_unique_id($_[0],$_[1],$_[2]);
129
print "Waiting for unique id to become available...\n" unless $ret;
135
# Release a unique ID.
137
sub mtr_release_unique_id($$) {
141
if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
142
die 'lock file is a symbolic link';
145
open SEM, ">", "$file.sem" or die "can't write to $file.sem";
146
flock SEM, LOCK_EX or die "can't lock $file.sem";
148
if(eval("readlink '$file'") || eval("readlink '$file.sem'")) {
149
die 'lock file is a symbolic link';
153
open FILE, ">", $file or die "can't create $file";
156
open FILE, "+<", $file or die "can't open $file";
157
select undef,undef,undef,0.2;
162
my ($id, $pid) = split / /;
165
delete $taken{$myid};
167
truncate FILE, 0 or die "can't truncate $file";
168
for my $k (keys %taken) {
169
print FILE $k . ' ' . $taken{$k} . "\n";
172
flock SEM, LOCK_UN or warn "can't unlock $file.sem";
174
delete $mtr_unique_assigned_ids{$myid};