]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
virnetdaemon: Introduce virNetDaemonQuitExecRestart
authorPeter Krempa <pkrempa@redhat.com>
Wed, 10 Mar 2021 16:01:23 +0000 (17:01 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Fri, 12 Mar 2021 15:08:28 +0000 (16:08 +0100)
Recent changes which meant to fix daemon shutdown broke the exec-restart
capability of virtlogd and virtlockd, since the code actually closed all
the sockets and shut down all the internals.

Add virNetDaemonQuitExecRestart, which requests a shutdown of the
process, but keeps all the services open and registered since they are
preserved across the restart.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/libvirt_remote.syms
src/rpc/virnetdaemon.c
src/rpc/virnetdaemon.h

index 3cd84a08545c0af8be555dbb4c3550e57694beae..605271bcb2381e6fb63658b600e72f239c9b55b2 100644 (file)
@@ -85,6 +85,7 @@ virNetDaemonNew;
 virNetDaemonNewPostExecRestart;
 virNetDaemonPreExecRestart;
 virNetDaemonQuit;
+virNetDaemonQuitExecRestart;
 virNetDaemonRemoveShutdownInhibition;
 virNetDaemonRun;
 virNetDaemonSetShutdownCallbacks;
index 327540c4b4c9a92932155007b4793a411913bf3b..14bc9e1335315d129715bc1061b99bb7d6f00d78 100644 (file)
@@ -76,6 +76,7 @@ struct _virNetDaemon {
     bool quit;
     bool finished;
     bool graceful;
+    bool execRestart;
 
     unsigned int autoShutdownTimeout;
     size_t autoShutdownInhibitions;
@@ -857,6 +858,10 @@ virNetDaemonRun(virNetDaemonPtr dmn)
 
         virHashForEach(dmn->servers, daemonServerProcessClients, NULL);
 
+        /* don't shutdown services when performing an exec-restart */
+        if (dmn->quit && dmn->execRestart)
+            goto cleanup;
+
         if (dmn->quit && dmn->finishTimer == -1) {
             virHashForEach(dmn->servers, daemonServerClose, NULL);
             if (dmn->shutdownPrepareCb && dmn->shutdownPrepareCb() < 0)
@@ -912,6 +917,20 @@ virNetDaemonQuit(virNetDaemonPtr dmn)
     virObjectUnlock(dmn);
 }
 
+
+void
+virNetDaemonQuitExecRestart(virNetDaemon *dmn)
+{
+    virObjectLock(dmn);
+
+    VIR_DEBUG("Exec-restart requested %p", dmn);
+    dmn->quit = true;
+    dmn->execRestart = true;
+
+    virObjectUnlock(dmn);
+}
+
+
 static int
 daemonServerClose(void *payload,
                   const char *key G_GNUC_UNUSED,
index fcc6e1fdffeb1e37e60367ee44e4af10492d7ec7..7ad5d25b9636d66b0452c575e9cbd8c0c6306bcf 100644 (file)
@@ -75,6 +75,7 @@ void virNetDaemonSetStateStopWorkerThread(virNetDaemonPtr dmn,
 void virNetDaemonRun(virNetDaemonPtr dmn);
 
 void virNetDaemonQuit(virNetDaemonPtr dmn);
+void virNetDaemonQuitExecRestart(virNetDaemon *dmn);
 
 bool virNetDaemonHasClients(virNetDaemonPtr dmn);