5
0
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:
Fiona Ebner 2024-11-14 16:07:34 +01:00 committed by Thomas Lamprecht
parent fb96ee89f2
commit 903d285751

View File

@ -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);
}