switch-to-configuration-ng: handle transition to socket activation (#533299)

This commit is contained in:
Ramses
2026-06-23 15:38:24 +00:00
committed by GitHub
2 changed files with 30 additions and 17 deletions
+18
View File
@@ -541,6 +541,12 @@ in
systemd.services."accept-socket@".serviceConfig.X-Test = "test";
};
socket-activated-without-socket.configuration = {
imports = [ simple-socket.configuration ];
systemd.sockets.socket-activated.enable = false;
systemd.services.socket-activated.wantedBy = [ "multi-user.target" ];
};
mount.configuration = {
systemd.mounts = [
{
@@ -1620,6 +1626,18 @@ in
if machine.succeed("socat - UNIX-CONNECT:/run/test.sock") != "hello":
raise Exception("Socket was not properly activated after the service was restarted")
# A service transitioning to socket activation is not started directly,
# it's left for the newly started socket to activate on demand
switch_to_specialisation("${machine}", "socket-activated-without-socket")
machine.succeed("systemctl is-active socket-activated.service")
out = switch_to_specialisation("${machine}", "simple-socket-stop-if-changed")
assert_contains(out, "stopping the following units: socket-activated.service\n")
assert_lacks(out, "\nstarting the following units:")
assert_contains(out, "the following new units were started: socket-activated.socket\n")
machine.succeed("[ -S /run/test.sock ]")
if machine.succeed("socat - UNIX-CONNECT:/run/test.sock") != "hello":
raise Exception("Socket was not properly activated after the transition")
with subtest("socket-activated services with Accept=yes"):
# Socket-activated services don't get started, just the socket
machine.fail("[ -S /run/accept-test.sock ]")
@@ -743,11 +743,6 @@ fn handle_modified_unit(
// This unit should be restarted instead of stopped and started.
units_to_restart.insert(unit.to_string(), ());
record_unit(&restart_list, unit);
// Remove from units to reload so we don't restart and reload
if units_to_reload.contains_key(unit) {
units_to_reload.remove(unit);
unrecord_unit(&reload_list, unit);
}
} else {
// If this unit is socket-activated, then stop the socket unit(s) as well, and
// restart the socket(s) instead of the service.
@@ -777,6 +772,9 @@ fn handle_modified_unit(
}
for socket in &sockets {
let socket_in_new_config =
toplevel.join(scope.etc_dir()).join(socket).exists();
if active_cur.contains_key(socket) {
// We can now be sure this is a socket-activated unit
@@ -787,7 +785,7 @@ fn handle_modified_unit(
}
// Only restart sockets that actually exist in new configuration:
if toplevel.join(scope.etc_dir()).join(socket).exists() {
if socket_in_new_config {
if use_restart_as_stop_and_start {
units_to_restart.insert(socket.to_string(), ());
record_unit(&restart_list, socket);
@@ -798,12 +796,9 @@ fn handle_modified_unit(
socket_activated = true;
}
// Remove from units to reload so we don't restart and reload
if units_to_reload.contains_key(unit) {
units_to_reload.remove(unit);
unrecord_unit(&reload_list, unit);
}
} else if socket_in_new_config {
// Transitioning to socket activation; let the socket start it.
socket_activated = true;
}
}
}
@@ -832,11 +827,11 @@ fn handle_modified_unit(
} else {
units_to_stop.insert(unit.to_string(), ());
}
// Remove from units to reload so we don't restart and reload
if units_to_reload.contains_key(unit) {
units_to_reload.remove(unit);
unrecord_unit(&reload_list, unit);
}
}
// Remove from units to reload so we don't restart and reload
if units_to_reload.remove(unit).is_some() {
unrecord_unit(&reload_list, unit);
}
}
}