nspawn: restart the whole systemd-nspawn@.service unit on container reboot (#4613)
Since 133 is now used in a few places, add a #define for it.
Also make the status message a bit informative.
Another issue introduced in b006762
. The logic was borked, we were supposed
to return 0 to break the loop, and 133 to restart the container, not the other
way around.
But this doesn't seem to work, reboot fails with:
Nov 08 00:41:32 laptop systemd-nspawn[26564]: Failed to register machine: Machine 'fedora-rawhide' already exists
So actually the version before this patch worked better, since 133 > 0 and we'd
at least loop internally.
This commit is contained in:
parent
45d34fa7fb
commit
2a49b6120f
|
@ -111,6 +111,8 @@
|
|||
* the init process in the container pid can send messages to nspawn following the sd_notify(3) protocol */
|
||||
#define NSPAWN_NOTIFY_SOCKET_PATH "/run/systemd/nspawn/notify"
|
||||
|
||||
#define EXIT_FORCE_RESTART 133
|
||||
|
||||
typedef enum ContainerStatus {
|
||||
CONTAINER_TERMINATED,
|
||||
CONTAINER_REBOOTED
|
||||
|
@ -4002,7 +4004,7 @@ static int run(int master,
|
|||
* because 133 is special-cased in the service file to reboot the container.
|
||||
* otherwise → The container exited with zero status and a reboot was not requested.
|
||||
*/
|
||||
if (r == 133)
|
||||
if (r == EXIT_FORCE_RESTART)
|
||||
r = EXIT_FAILURE; /* replace 133 with the general failure code */
|
||||
*ret = r;
|
||||
return 0; /* finito */
|
||||
|
@ -4017,8 +4019,8 @@ static int run(int master,
|
|||
* file uses RestartForceExitStatus=133 so that this results in a full
|
||||
* nspawn restart. This is necessary since we might have cgroup parameters
|
||||
* set we want to have flushed out. */
|
||||
*ret = 0;
|
||||
return 133;
|
||||
*ret = EXIT_FORCE_RESTART;
|
||||
return 0; /* finito */
|
||||
}
|
||||
|
||||
expose_port_flush(arg_expose_ports, exposed);
|
||||
|
@ -4276,8 +4278,8 @@ int main(int argc, char *argv[]) {
|
|||
|
||||
finish:
|
||||
sd_notify(false,
|
||||
"STOPPING=1\n"
|
||||
"STATUS=Terminating...");
|
||||
r == 0 && ret == EXIT_FORCE_RESTART ? "STOPPING=1\nSTATUS=Restarting..." :
|
||||
"STOPPING=1\nSTATUS=Terminating...");
|
||||
|
||||
if (pid > 0)
|
||||
kill(pid, SIGKILL);
|
||||
|
|
Loading…
Reference in a new issue