Commit 6de6b97e authored by unknown's avatar unknown
Browse files

fixes for mtr_unique.pl


mysql-test/lib/mtr_unique.pl:
  - add info message to mtr_require_unique_id_and_wait as suggested
  - fix for security issue
  - locks for pids of processes that don't exist anymore are reused, if ps is present and working as expected
parent c3d6927d
Loading
Loading
Loading
Loading
+40 −3
Original line number Diff line number Diff line
@@ -35,6 +35,13 @@ sub mtr_require_unique_id($$$) {
	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";
@@ -43,6 +50,11 @@ sub mtr_require_unique_id($$$) {
		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;
@@ -52,15 +64,30 @@ sub mtr_require_unique_id($$$) {
		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;
			}
		}
	}
	seek FILE, 0, 2;
	for(my $i=$min; $i<=$max; ++$i) {
		if(! exists $taken{$i}) {
			print FILE "$i $$\n";
			$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;
@@ -75,8 +102,9 @@ sub mtr_require_unique_id($$$) {
sub mtr_require_unique_id_and_wait($$$) {
	my $ret = mtr_require_unique_id($_[0],$_[1],$_[2]);
	while(! defined $ret) {
		sleep 10;
		sleep 30;
		$ret = mtr_require_unique_id($_[0],$_[1],$_[2]);
		print "Waiting for unique id to become available...\n" unless $ret;
	}
	return $ret;
}
@@ -88,8 +116,17 @@ 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;