Fixed with test: Test bug #35820: sem breaks if $HOME is not writable

This commit is contained in:
Ole Tange 2012-05-13 16:03:13 +02:00
parent aad8d689ba
commit 1371108e64
3 changed files with 31 additions and 4 deletions

View file

@ -5000,9 +5000,9 @@ sub new {
$id=~s/([^-_a-z0-9])/unpack("H*",$1)/ige; # Convert non-word chars to hex $id=~s/([^-_a-z0-9])/unpack("H*",$1)/ige; # Convert non-word chars to hex
$id="id-".$id; # To distinguish it from a process id $id="id-".$id; # To distinguish it from a process id
my $parallel_dir = $ENV{'HOME'}."/.parallel"; my $parallel_dir = $ENV{'HOME'}."/.parallel";
-d $parallel_dir or mkdir $parallel_dir; -d $parallel_dir or mkdir_or_die($parallel_dir);
my $parallel_locks = $parallel_dir."/semaphores"; my $parallel_locks = $parallel_dir."/semaphores";
-d $parallel_locks or mkdir $parallel_locks; -d $parallel_locks or mkdir_or_die($parallel_locks);
my $lockdir = "$parallel_locks/$id"; my $lockdir = "$parallel_locks/$id";
my $lockfile = $lockdir.".lock"; my $lockfile = $lockdir.".lock";
if($count < 1) { ::die_bug("semaphore-count: $count"); } if($count < 1) { ::die_bug("semaphore-count: $count"); }
@ -5082,7 +5082,7 @@ sub atomic_link_if_count_less_than {
$self->lock(); $self->lock();
::debug($self->nlinks()."<".$self->{'count'}); ::debug($self->nlinks()."<".$self->{'count'});
if($self->nlinks() < $self->{'count'}) { if($self->nlinks() < $self->{'count'}) {
-d $self->{'lockdir'} || mkdir $self->{'lockdir'}; -d $self->{'lockdir'} or mkdir_or_die($self->{'lockdir'});
if(not -e $self->{'idfile'}) { if(not -e $self->{'idfile'}) {
open (A, ">", $self->{'idfile'}) or open (A, ">", $self->{'idfile'}) or
::die_bug("write_idfile: $self->{'idfile'}"); ::die_bug("write_idfile: $self->{'idfile'}");
@ -5137,6 +5137,23 @@ sub unlock {
::debug("unlocked\n"); ::debug("unlocked\n");
} }
sub mkdir_or_die {
# If dir is not writable: die
my $dir = shift;
my @dir_parts = split(m:/:,$dir);
my ($ddir,$part);
while(defined ($part = shift @dir_parts)) {
$part eq "" and next;
$ddir .= "/".$part;
-d $ddir and next;
mkdir $ddir;
}
if(not -w $dir) {
print STDERR "$Global::progname: Cannot write to $dir: $!\n";
exit(255);
}
}
# Keep perl -w happy # Keep perl -w happy
$::opt_x = $Semaphore::timeout = $Semaphore::wait = $::opt_shebang = $::opt_x = $Semaphore::timeout = $Semaphore::wait = $::opt_shebang =
0; 0;

View file

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
echo '### Test fix #32191' echo '### Test fix #32191'
seq 1 150 | parallel -j9 --retries 2 -S localhost,: "/bin/non-existant 2>/dev/null" seq 1 150 | nice nice parallel -j9 --retries 2 -S localhost,: "/bin/non-existant 2>/dev/null"
echo '### Test --tagstring' echo '### Test --tagstring'
parallel -j1 -X -v --tagstring a{}b echo ::: 3 4 parallel -j1 -X -v --tagstring a{}b echo ::: 3 4
@ -9,3 +9,9 @@ parallel -j1 -k -v --tagstring a{}b echo ::: 3 4
parallel -j1 -k -v --tagstring a{}b echo job{#} ::: 3 4 parallel -j1 -k -v --tagstring a{}b echo job{#} ::: 3 4
parallel -j1 -k -v --tagstring ajob{#}b echo job{#} ::: 3 4 parallel -j1 -k -v --tagstring ajob{#}b echo job{#} ::: 3 4
echo '### Test bug #35820: sem breaks if $HOME is not writable'
echo 'Workaround: use another writable dir'
rm -rf /tmp/.parallel
HOME=/tmp sem echo OK
HOME=/tmp sem --wait
HOME=/usr/this/should/fail stdout sem echo should fail

View file

@ -14,3 +14,7 @@ echo job1
ajob1b job1 ajob1b job1
echo job2 echo job2
ajob2b job2 ajob2b job2
### Test bug #35820: sem breaks if $HOME is not writable
Workaround: use another writable dir
OK
parallel: Cannot write to /usr/this/should/fail/.parallel: No such file or directory