5 changed files with 134 additions and 6 deletions
@ -1,3 +0,0 @@ |
|||
version https://git-lfs.github.com/spec/v1 |
|||
oid sha256:c86c7f758391b895ec90f76f965a56266167028978ac6dce824fea4d6a036b6d |
|||
size 10461608 |
|||
@ -0,0 +1,3 @@ |
|||
version https://git-lfs.github.com/spec/v1 |
|||
oid sha256:4fff62f08fdf938fe7fd21e260a908a44193cc6d34c42d3b1afdcadd34120357 |
|||
size 10659480 |
|||
@ -0,0 +1,119 @@ |
|||
From 36c833cacb0d001ab43ba9662fe432922491c3b5 Mon Sep 17 00:00:00 2001 |
|||
Message-ID: <36c833cacb0d001ab43ba9662fe432922491c3b5.1782911963.git.jdenemar@redhat.com> |
|||
From: Peter Krempa <pkrempa@redhat.com> |
|||
Date: Mon, 15 Jun 2026 13:01:01 +0200 |
|||
Subject: [PATCH] qemu: Ensure proper shutdown ordering of virtlockd/virtlogd |
|||
daemons |
|||
|
|||
For socket activation to work our systemd unit files use the following |
|||
pattern: |
|||
|
|||
[virtlogd.socket] <----(After)--- [virtlogd.service] |
|||
[virtqemud.socket] <----(After)--- [virtqemud.service] |
|||
|
|||
Now the qemu daemon also wants to use the services provided by those |
|||
daemons so we have dependency between the two too: |
|||
|
|||
[virtlogd.socket] <----(After)--- [virtlogd.service] |
|||
^ |
|||
+-------------(After+Requires)-------+ |
|||
| |
|||
[virtqemud.socket] <----(After)--- [virtqemud.service] |
|||
|
|||
Now on startup everything is fine, because with socket activation, when |
|||
'virtqemud.service' wants to use 'virtlogd' services the socket is |
|||
already up due to the dependency+ordering and opening a connection will |
|||
cause 'virtlogd.service' to be socket-activated. |
|||
|
|||
On shutdown though there's no transitive 'After' ordering between |
|||
'virtqemud.service' and 'virtlogd.service' and thus nothing explicitly |
|||
telling systemd that if virtlogd was started. In fact systemd is free to |
|||
translate it that 'virtlogd' and 'virtqemud' need to be stopped before |
|||
stopping 'virtlogd.socket'. |
|||
|
|||
To illustrate what happens consider the following scenario: |
|||
|
|||
A host is running a VM under virtqemud. 'virtqemud' is configured to |
|||
attempt shutdown on the VMs before killing them (daemon-based guest |
|||
shutdown, but the same reproduces also with libvirt-guests). The host |
|||
is being rebooted. |
|||
|
|||
(virtqemud attempts to shut down guests, but guest takes more than the |
|||
configured shutdown inhibition timeout, journald output follows): |
|||
|
|||
06:44:02 fedora systemd-logind[664]: Delay lock is active (UID 0/root, PID 991/virtqemud) but inhibitor timeout is reached. |
|||
06:44:02 fedora systemd-logind[664]: System is rebooting. |
|||
[...] |
|||
06:44:02 fedora virtlogd[802]: 802: debug : virSystemdNotify:667 : Notify 'STOPPING=1' |
|||
06:44:02 fedora systemd[1]: Stopping virtlogd.service - libvirt logging daemon... |
|||
06:44:02 fedora systemd[1]: Stopping virtqemud.service - libvirt QEMU daemon... |
|||
06:44:02 fedora virtqemud[991]: 991: debug : virSystemdNotify:667 : Notify 'STOPPING=1' |
|||
06:44:02 fedora systemd[1]: virtlogd.service: Deactivated successfully. |
|||
06:44:02 fedora systemd[1]: Stopped virtlogd.service - libvirt logging daemon. |
|||
|
|||
(the shutdown times out, virtqemud kills the unresponsive vm) |
|||
|
|||
06:44:27 fedora virtqemud[991]: 1053: debug : qemuProcessStop:8916 : Shutting down vm=0x7f71ac032670 name=virt-vm1 id=1 pid=805, reason=destroyed, asyncJob=none, flags=0x0 |
|||
06:44:27 fedora virtqemud[991]: 1053: debug : qemuDomainLogAppendMessage:5757 : Append log message (vm='virt-vm1' message='2026-06-15 10:44:27.427+0000: shutting down, reason=destroyed |
|||
) stdioLogD=1 |
|||
06:44:27 fedora virtqemud[991]: 1053: error : virNetSocketReadWire:1767 : Cannot recv data: Connection reset by peer |
|||
06:44:27 fedora virtqemud[991]: 1053: debug : qemuProcessKill:8811 : vm=0x7f71ac032670 name=virt-vm1 pid=805 flags=0x5 |
|||
|
|||
Now the log shows that we want to add VM log file message in |
|||
'qemuDomainLogAppendMessage' but it fails because virtlogd is dead |
|||
already. |
|||
|
|||
Now the same happens also with 'virtlockd' but with much worse outcome, |
|||
especially if the configured action is to save the VMs because shutdown |
|||
of 'virtlockd' when locks are held ends up 'fencing' the VMs by killing |
|||
them. |
|||
|
|||
The same also happens when libvirt-guests is used to shutdown the guests |
|||
instead. |
|||
|
|||
This patch adds an explicit 'After=virtlo[ck|g]d.service' to the daemons |
|||
containing the qemu driver to ensure that the shutdown ordering makes |
|||
sense. This doesn't break socket activation (e.g. the log/lock daemons |
|||
are not started unless first invoked). |
|||
|
|||
Signed-off-by: Peter Krempa <pkrempa@redhat.com> |
|||
Reviewed-by: Jiri Denemark <jdenemar@redhat.com> |
|||
(cherry picked from commit aa1bf13b9caa4ef893cd4fdbaa111d5da73aa120) |
|||
https://redhat.atlassian.net/browse/RHEL-180876 |
|||
---
|
|||
src/qemu/virtqemud.service.extra.in | 4 ++++ |
|||
src/remote/libvirtd.service.in | 4 ++++ |
|||
2 files changed, 8 insertions(+) |
|||
|
|||
diff --git a/src/qemu/virtqemud.service.extra.in b/src/qemu/virtqemud.service.extra.in
|
|||
index cc16b6a9bb..3cc2edcfd0 100644
|
|||
--- a/src/qemu/virtqemud.service.extra.in
|
|||
+++ b/src/qemu/virtqemud.service.extra.in
|
|||
@@ -6,6 +6,10 @@ Requires=virtlogd.socket
|
|||
Wants=virtlockd.socket |
|||
After=virtlogd.socket |
|||
After=virtlockd.socket |
|||
+# To ensure that our helper daemons are not shut down before the main daemon
|
|||
+# shuts down we need also explicit ordering with the .service unit
|
|||
+After=virtlogd.service
|
|||
+After=virtlock.service
|
|||
Wants=systemd-machined.service |
|||
After=systemd-machined.service |
|||
After=remote-fs.target |
|||
diff --git a/src/remote/libvirtd.service.in b/src/remote/libvirtd.service.in
|
|||
index b0a062e885..f26494d646 100644
|
|||
--- a/src/remote/libvirtd.service.in
|
|||
+++ b/src/remote/libvirtd.service.in
|
|||
@@ -15,6 +15,10 @@ Requires=virtlogd.socket
|
|||
Wants=virtlockd.socket |
|||
After=virtlogd.socket |
|||
After=virtlockd.socket |
|||
+# To ensure that our helper daemons are not shut down before the main daemon
|
|||
+# shuts down we need also explicit ordering with the .service unit
|
|||
+After=virtlogd.service
|
|||
+After=virtlock.service
|
|||
Wants=systemd-machined.service |
|||
After=network.target |
|||
After=dbus.service |
|||
--
|
|||
2.54.0 |
|||
Loading…
Reference in new issue