mirror of
git://git.proxmox.com/git/pve-common.git
synced 2025-03-10 16:58:40 +03:00
test: have lock file test use run_fork() helper
There are differences for error handling in the old and new helper, in particular when the child is signaled. But the test here does not explicitly check for specific error conditions or messages and is therefore still correct with the new helper. Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
This commit is contained in:
parent
fb96ee89f2
commit
903d285751
@ -11,50 +11,6 @@ use PVE::Tools 'lock_file_full';
|
||||
|
||||
my $name = "test.lockfile.$$-";
|
||||
|
||||
# Utilities:
|
||||
|
||||
sub forked($$) {
|
||||
my ($code1, $code2) = @_;
|
||||
|
||||
pipe(my $except_r, my $except_w) or die "pipe: $!\n";
|
||||
|
||||
my $pid = fork();
|
||||
die "fork failed: $!\n" if !defined($pid);
|
||||
|
||||
if ($pid == 0) {
|
||||
close($except_r);
|
||||
eval { $code1->() };
|
||||
if ($@) {
|
||||
print {$except_w} $@;
|
||||
$except_w->flush();
|
||||
POSIX::_exit(1);
|
||||
}
|
||||
POSIX::_exit(0);
|
||||
}
|
||||
close($except_w);
|
||||
|
||||
eval { $code2->() };
|
||||
my $err = $@;
|
||||
if ($err) {
|
||||
kill(15, $pid);
|
||||
} else {
|
||||
my $err = do { local $/ = undef; <$except_r> };
|
||||
}
|
||||
die "interrupted\n" if waitpid($pid, 0) != $pid;
|
||||
die $err if $err;
|
||||
|
||||
# Check exit code:
|
||||
my $status = POSIX::WEXITSTATUS($?);
|
||||
if ($? == -1) {
|
||||
die "failed to execute\n";
|
||||
} elsif (POSIX::WIFSIGNALED($?)) {
|
||||
my $sig = POSIX::WTERMSIG($?);
|
||||
die "got signal $sig\n";
|
||||
} elsif ($status != 0) {
|
||||
die "exit code $status\n";
|
||||
}
|
||||
}
|
||||
|
||||
# Book-keeping:
|
||||
|
||||
my %_ran;
|
||||
@ -82,38 +38,42 @@ sub forktest1($) {
|
||||
# socket pair for synchronization
|
||||
socketpair(my $fmain, my $fother, AF_UNIX, SOCK_STREAM, PF_UNSPEC)
|
||||
or die "socketpair(): $!\n";
|
||||
forked sub {
|
||||
# other side
|
||||
close($fmain);
|
||||
my $line;
|
||||
lock_file_full($name, 60, $shared, sub {
|
||||
ran('other side');
|
||||
# tell parent we've acquired the lock
|
||||
print {$fother} "1\n";
|
||||
$fother->flush();
|
||||
# wait for parent to be done trying to lock
|
||||
$line = <$fother>;
|
||||
});
|
||||
die $@ if $@;
|
||||
die "parent failed\n" if !$line || $line ne "2\n";
|
||||
assert('other side');
|
||||
}, sub {
|
||||
# main process
|
||||
# Wait for our child to lock:
|
||||
close($fother);
|
||||
my $line = <$fmain>;
|
||||
die "child failed to acquire a lock\n" if !$line || $line ne "1\n";
|
||||
lock_file_full($name, 1, $shared, sub {
|
||||
ran('local side');
|
||||
});
|
||||
if ($shared) {
|
||||
assert('local side');
|
||||
} else {
|
||||
assert_not('local side');
|
||||
}
|
||||
print {$fmain} "2\n";
|
||||
$fmain->flush();
|
||||
my $other = sub {
|
||||
# other side
|
||||
close($fmain);
|
||||
my $line;
|
||||
lock_file_full($name, 60, $shared, sub {
|
||||
ran('other side');
|
||||
# tell parent we've acquired the lock
|
||||
print {$fother} "1\n";
|
||||
$fother->flush();
|
||||
# wait for parent to be done trying to lock
|
||||
$line = <$fother>;
|
||||
});
|
||||
die $@ if $@;
|
||||
die "parent failed\n" if !$line || $line ne "2\n";
|
||||
assert('other side');
|
||||
return;
|
||||
};
|
||||
my $main = sub {
|
||||
# main process
|
||||
# Wait for our child to lock:
|
||||
close($fother);
|
||||
my $line = <$fmain>;
|
||||
die "child failed to acquire a lock\n" if !$line || $line ne "1\n";
|
||||
lock_file_full($name, 1, $shared, sub {
|
||||
ran('local side');
|
||||
});
|
||||
if ($shared) {
|
||||
assert('local side');
|
||||
} else {
|
||||
assert_not('local side');
|
||||
}
|
||||
print {$fmain} "2\n";
|
||||
$fmain->flush();
|
||||
};
|
||||
|
||||
PVE::Tools::run_fork($other, { afterfork => $main });
|
||||
close($fmain);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user