[Pkg-libvirt-commits] [Git][libvirt-team/libvirt][debian/latest] Fix reboot command for LXC containers (Closes: #991773)

Andrea Bolognani (@abologna) gitlab at salsa.debian.org
Wed Dec 22 23:39:29 GMT 2021



Andrea Bolognani pushed to branch debian/latest at Libvirt Packaging Team / libvirt


Commits:
9ae5f141 by Joachim Falk at 2021-12-21T21:40:10+01:00
Fix reboot command for LXC containers (Closes: #991773)

- - - - -


2 changed files:

- + debian/patches/backport/Fix-reboot-command-for-LXC-containers.patch
- debian/patches/series


Changes:

=====================================
debian/patches/backport/Fix-reboot-command-for-LXC-containers.patch
=====================================
@@ -0,0 +1,92 @@
+From: Joachim Falk <joachim.falk at gmx.de>
+Date: Thu, 2 Dec 2021 19:56:07 +0100
+Subject: Fix reboot command for LXC containers (Closes: #991773)
+
+The virNetDaemonQuit(dmn) command in virLXCControllerSignalChildIO triggers an
+early close of all clients of lxc_controller. Here, libvirtd itself is a client
+of this controller, and the client connection is used to notify libvirtd if a
+reboot of the container is required. However, the client connection was closed
+before such a status could be sent to libvirtd. To fix this bug, we will
+immediately send the reboot or shutdown status of the container to libvirtd, and
+only after client disconnect will we trigger virNetDaemonQuit (Closes: #991773).
+
+Fixes: https://gitlab.com/libvirt/libvirt/-/issues/237
+Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=991773
+Signed-off-by: Joachim Falk <joachim.falk at gmx.de>
+Reviewed-by: Michal Privoznik <mprivozn at redhat.com>
+
+(cherry picked from commit 93c47e2c39521aba760486f0238458ef1a37490c)
+---
+ src/lxc/lxc_controller.c | 18 +++++++++++-------
+ 1 file changed, 11 insertions(+), 7 deletions(-)
+
+diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
+index 444f728af4..039efcd7c7 100644
+--- a/src/lxc/lxc_controller.c
++++ b/src/lxc/lxc_controller.c
+@@ -894,8 +894,10 @@ static void virLXCControllerClientCloseHook(virNetServerClient *client)
+     virLXCController *ctrl = virNetServerClientGetPrivateData(client);
+ 
+     VIR_DEBUG("Client %p has closed", client);
+-    if (ctrl->client == client)
++    if (ctrl->client == client) {
+         ctrl->client = NULL;
++        VIR_DEBUG("Client has gone away");
++    }
+     if (ctrl->inShutdown) {
+         VIR_DEBUG("Arm timer to quit event loop");
+         virEventUpdateTimeout(ctrl->timerShutdown, 0);
+@@ -1006,8 +1008,11 @@ static int lxcControllerClearCapabilities(void)
+ static bool wantReboot;
+ static virMutex lock = VIR_MUTEX_INITIALIZER;
+ 
++static int
++virLXCControllerEventSendExit(virLXCController *ctrl,
++                              int exitstatus);
+ 
+-static void virLXCControllerSignalChildIO(virNetDaemon *dmn,
++static void virLXCControllerSignalChildIO(virNetDaemon *dmn G_GNUC_UNUSED,
+                                           siginfo_t *info G_GNUC_UNUSED,
+                                           void *opaque)
+ {
+@@ -1018,7 +1023,6 @@ static void virLXCControllerSignalChildIO(virNetDaemon *dmn,
+     ret = waitpid(-1, &status, WNOHANG);
+     VIR_DEBUG("Got sig child %d vs %lld", ret, (long long)ctrl->initpid);
+     if (ret == ctrl->initpid) {
+-        virNetDaemonQuit(dmn);
+         virMutexLock(&lock);
+         if (WIFSIGNALED(status) &&
+             WTERMSIG(status) == SIGHUP) {
+@@ -1026,6 +1030,7 @@ static void virLXCControllerSignalChildIO(virNetDaemon *dmn,
+             wantReboot = true;
+         }
+         virMutexUnlock(&lock);
++        virLXCControllerEventSendExit(ctrl, wantReboot ? 1 : 0);
+     }
+ }
+ 
+@@ -2276,9 +2281,10 @@ virLXCControllerEventSendExit(virLXCController *ctrl,
+         VIR_DEBUG("Waiting for client to complete dispatch");
+         ctrl->inShutdown = true;
+         virNetServerClientDelayedClose(ctrl->client);
+-        virNetDaemonRun(ctrl->daemon);
++    } else {
++        VIR_DEBUG("Arm timer to quit event loop");
++        virEventUpdateTimeout(ctrl->timerShutdown, 0);
+     }
+-    VIR_DEBUG("Client has gone away");
+     return 0;
+ }
+ 
+@@ -2430,8 +2436,6 @@ virLXCControllerRun(virLXCController *ctrl)
+ 
+     rc = virLXCControllerMain(ctrl);
+ 
+-    virLXCControllerEventSendExit(ctrl, rc);
+-
+  cleanup:
+     VIR_FORCE_CLOSE(control[0]);
+     VIR_FORCE_CLOSE(control[1]);
+-- 
+2.30.2
+


=====================================
debian/patches/series
=====================================
@@ -1,3 +1,4 @@
+backport/Fix-reboot-command-for-LXC-containers.patch
 forward/Skip-vircgrouptest.patch
 forward/Reduce-udevadm-settle-timeout-to-10-seconds.patch
 forward/Pass-GPG_TTY-env-var-to-the-ssh-binary.patch



View it on GitLab: https://salsa.debian.org/libvirt-team/libvirt/-/commit/9ae5f1419d8d57f573533582d928a78dcf367792

-- 
View it on GitLab: https://salsa.debian.org/libvirt-team/libvirt/-/commit/9ae5f1419d8d57f573533582d928a78dcf367792
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-libvirt-commits/attachments/20211222/44ce112c/attachment-0001.htm>


More information about the Pkg-libvirt-commits mailing list