Skip to content

Commit 9abef1c

Browse files
authored
switch-to-configuration-ng: don't block when the lockfile is already locked (#382797)
2 parents 83377f8 + 1aa7e7a commit 9abef1c

File tree

3 files changed

+19
-2
lines changed

3 files changed

+19
-2
lines changed

nixos/modules/system/activation/switch-to-configuration.pl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@
9595

9696
make_path("/run/nixos", { mode => oct(755) });
9797
open(my $stc_lock, '>>', '/run/nixos/switch-to-configuration.lock') or die "Could not open lock - $!";
98-
flock($stc_lock, LOCK_EX) or die "Could not acquire lock - $!";
98+
flock($stc_lock, LOCK_EX|LOCK_NB) or die "Could not acquire lock - $!";
9999
openlog("nixos", "", LOG_USER);
100100

101101
# run pre-switch checks

nixos/tests/switch-test.nix

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -732,6 +732,23 @@ in {
732732
out = switch_to_specialisation("${machine}", "modifiedSystemConf")
733733
assert_contains(out, "starting the following units: ${dbusService}\n")
734734
735+
with subtest("aborts on already locked lock file"):
736+
(exitcode, _) = machine.execute(
737+
'flock -x --nb /run/nixos/switch-to-configuration.lock -c "${otherSystem}/bin/switch-to-configuration test"',
738+
timeout=5
739+
)
740+
# See man timeout, exit codes above 124 come from the timeout command
741+
# We want to make sure that stc actually exited with an error code,
742+
# if instead we hit the timeout, then it means that stc hangs, which is
743+
# what we don't want
744+
# TODO: We cannot match on the exact exit code since it's not consistent between
745+
# stc and stc-ng, since errno/last_os_error is not a very stable interface,
746+
# we should probably get rid of that in stc-ng once we got rid of the
747+
# perl implementation
748+
assert exitcode < 124, \
749+
"switch-to-configuration did not abort as expected, " + \
750+
f"probably it timed out instead (exit code: {exitcode}), 124 means timeout"
751+
735752
with subtest("fstab mounts"):
736753
switch_to_specialisation("${machine}", "")
737754
# add a mountpoint

pkgs/by-name/sw/switch-to-configuration-ng/src/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1037,7 +1037,7 @@ fn do_system_switch(action: Action) -> anyhow::Result<()> {
10371037
die();
10381038
};
10391039

1040-
let Ok(_lock) = Flock::lock(lock, FlockArg::LockExclusive) else {
1040+
let Ok(_lock) = Flock::lock(lock, FlockArg::LockExclusiveNonblock) else {
10411041
eprintln!("Could not acquire lock");
10421042
die();
10431043
};

0 commit comments

Comments
 (0)