mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-30 16:35:24 +00:00
a42b46dd7d
When the host is shutting down then we get PrepareForShutdown signal on DBus to which we react by creating a thread which runs virStateStop() and thus qemuStateStop(). But if scheduling the thread is delayed just a but it may happen that we receive SIGTERM (sent by systemd) to which we respond by quitting our event loop and cleaning up everything (including drivers). And only after that the thread gets to run only to find qemu_driver being NULL. What we can do is to delay exiting event loop and join the thread that's executing virStateStop(). If the join doesn't happen in given timeout (currently 30 seconds) then libvirtd shuts down forcefully anyways (see virNetDaemonRun()). Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1895359 Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1739564 Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
92 lines
3.4 KiB
C
92 lines
3.4 KiB
C
/*
|
|
* virnetdaemon.h
|
|
*
|
|
* Copyright (C) 2015 Red Hat, Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library. If not, see
|
|
* <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <signal.h>
|
|
|
|
#include "virnettlscontext.h"
|
|
#include "virobject.h"
|
|
#include "virjson.h"
|
|
#include "virnetserverprogram.h"
|
|
#include "virnetserverclient.h"
|
|
#include "virnetserverservice.h"
|
|
#include "virnetserver.h"
|
|
|
|
virNetDaemonPtr virNetDaemonNew(void);
|
|
|
|
int virNetDaemonAddServer(virNetDaemonPtr dmn,
|
|
virNetServerPtr srv);
|
|
|
|
typedef virNetServerPtr (*virNetDaemonNewServerPostExecRestart)(virNetDaemonPtr dmn,
|
|
const char *name,
|
|
virJSONValuePtr object,
|
|
void *opaque);
|
|
virNetDaemonPtr virNetDaemonNewPostExecRestart(virJSONValuePtr object,
|
|
size_t nDefServerNames,
|
|
const char **defServerNames,
|
|
virNetDaemonNewServerPostExecRestart cb,
|
|
void *opaque);
|
|
|
|
virJSONValuePtr virNetDaemonPreExecRestart(virNetDaemonPtr dmn);
|
|
|
|
bool virNetDaemonIsPrivileged(virNetDaemonPtr dmn);
|
|
|
|
void virNetDaemonAutoShutdown(virNetDaemonPtr dmn,
|
|
unsigned int timeout);
|
|
|
|
void virNetDaemonAddShutdownInhibition(virNetDaemonPtr dmn);
|
|
void virNetDaemonRemoveShutdownInhibition(virNetDaemonPtr dmn);
|
|
|
|
#ifdef WIN32
|
|
# define siginfo_t void
|
|
#endif
|
|
|
|
typedef void (*virNetDaemonSignalFunc)(virNetDaemonPtr dmn, siginfo_t *info, void *opaque);
|
|
|
|
int virNetDaemonAddSignalHandler(virNetDaemonPtr dmn,
|
|
int signum,
|
|
virNetDaemonSignalFunc func,
|
|
void *opaque);
|
|
|
|
void virNetDaemonUpdateServices(virNetDaemonPtr dmn,
|
|
bool enabled);
|
|
|
|
void virNetDaemonSetStateStopWorkerThread(virNetDaemonPtr dmn,
|
|
virThreadPtr *thr);
|
|
|
|
void virNetDaemonRun(virNetDaemonPtr dmn);
|
|
|
|
void virNetDaemonQuit(virNetDaemonPtr dmn);
|
|
|
|
bool virNetDaemonHasClients(virNetDaemonPtr dmn);
|
|
|
|
virNetServerPtr virNetDaemonGetServer(virNetDaemonPtr dmn,
|
|
const char *serverName);
|
|
ssize_t virNetDaemonGetServers(virNetDaemonPtr dmn, virNetServerPtr **servers);
|
|
bool virNetDaemonHasServer(virNetDaemonPtr dmn,
|
|
const char *serverName);
|
|
|
|
typedef int (*virNetDaemonShutdownCallback)(void);
|
|
|
|
void virNetDaemonSetShutdownCallbacks(virNetDaemonPtr dmn,
|
|
virNetDaemonShutdownCallback prepareCb,
|
|
virNetDaemonShutdownCallback waitCb);
|