mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
Move LXC monitor code out into separate file
Move the code that handles the LXC monitor out of the lxc_process.c file and into lxc_monitor.{c,h} Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
This commit is contained in:
parent
357866c379
commit
de4b32e4bf
@ -47,6 +47,7 @@ src/lxc/lxc_container.c
|
|||||||
src/lxc/lxc_conf.c
|
src/lxc/lxc_conf.c
|
||||||
src/lxc/lxc_controller.c
|
src/lxc/lxc_controller.c
|
||||||
src/lxc/lxc_driver.c
|
src/lxc/lxc_driver.c
|
||||||
|
src/lxc/lxc_monitor.c
|
||||||
src/lxc/lxc_process.c
|
src/lxc/lxc_process.c
|
||||||
src/libxl/libxl_driver.c
|
src/libxl/libxl_driver.c
|
||||||
src/libxl/libxl_conf.c
|
src/libxl/libxl_conf.c
|
||||||
|
@ -392,6 +392,7 @@ LXC_DRIVER_SOURCES = \
|
|||||||
lxc/lxc_container.c lxc/lxc_container.h \
|
lxc/lxc_container.c lxc/lxc_container.h \
|
||||||
lxc/lxc_cgroup.c lxc/lxc_cgroup.h \
|
lxc/lxc_cgroup.c lxc/lxc_cgroup.h \
|
||||||
lxc/lxc_domain.c lxc/lxc_domain.h \
|
lxc/lxc_domain.c lxc/lxc_domain.h \
|
||||||
|
lxc/lxc_monitor.c lxc/lxc_monitor.h \
|
||||||
lxc/lxc_process.c lxc/lxc_process.h \
|
lxc/lxc_process.c lxc/lxc_process.h \
|
||||||
lxc/lxc_driver.c lxc/lxc_driver.h
|
lxc/lxc_driver.c lxc/lxc_driver.h
|
||||||
|
|
||||||
|
@ -24,13 +24,13 @@
|
|||||||
# define __LXC_DOMAIN_H__
|
# define __LXC_DOMAIN_H__
|
||||||
|
|
||||||
# include "lxc_conf.h"
|
# include "lxc_conf.h"
|
||||||
# include "rpc/virnetclient.h"
|
# include "lxc_monitor.h"
|
||||||
|
|
||||||
|
|
||||||
typedef struct _virLXCDomainObjPrivate virLXCDomainObjPrivate;
|
typedef struct _virLXCDomainObjPrivate virLXCDomainObjPrivate;
|
||||||
typedef virLXCDomainObjPrivate *virLXCDomainObjPrivatePtr;
|
typedef virLXCDomainObjPrivate *virLXCDomainObjPrivatePtr;
|
||||||
struct _virLXCDomainObjPrivate {
|
struct _virLXCDomainObjPrivate {
|
||||||
virNetClientPtr monitor;
|
virLXCMonitorPtr monitor;
|
||||||
bool doneStopEvent;
|
bool doneStopEvent;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
176
src/lxc/lxc_monitor.c
Normal file
176
src/lxc/lxc_monitor.c
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2012 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* lxc_monitor.c: client for LXC controller monitor
|
||||||
|
*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
#include "lxc_monitor.h"
|
||||||
|
#include "lxc_conf.h"
|
||||||
|
|
||||||
|
#include "memory.h"
|
||||||
|
|
||||||
|
#include "virterror_internal.h"
|
||||||
|
#include "logging.h"
|
||||||
|
#include "threads.h"
|
||||||
|
#include "rpc/virnetclient.h"
|
||||||
|
|
||||||
|
#define VIR_FROM_THIS VIR_FROM_LXC
|
||||||
|
|
||||||
|
struct _virLXCMonitor {
|
||||||
|
int refs;
|
||||||
|
|
||||||
|
virMutex lock; /* also used to protect refs */
|
||||||
|
|
||||||
|
virDomainObjPtr vm;
|
||||||
|
virLXCMonitorCallbacksPtr cb;
|
||||||
|
|
||||||
|
virNetClientPtr client;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void virLXCMonitorFree(virLXCMonitorPtr mon);
|
||||||
|
|
||||||
|
|
||||||
|
static void virLXCMonitorEOFNotify(virNetClientPtr client ATTRIBUTE_UNUSED,
|
||||||
|
int reason ATTRIBUTE_UNUSED,
|
||||||
|
void *opaque)
|
||||||
|
{
|
||||||
|
virLXCMonitorPtr mon = opaque;
|
||||||
|
virLXCMonitorCallbackEOFNotify eofNotify;
|
||||||
|
virDomainObjPtr vm;
|
||||||
|
|
||||||
|
virLXCMonitorLock(mon);
|
||||||
|
eofNotify = mon->cb->eofNotify;
|
||||||
|
vm = mon->vm;
|
||||||
|
virLXCMonitorUnlock(mon);
|
||||||
|
|
||||||
|
eofNotify(mon, vm);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void virLXCMonitorCloseFreeCallback(void *opaque)
|
||||||
|
{
|
||||||
|
virLXCMonitorPtr mon = opaque;
|
||||||
|
virLXCMonitorLock(mon);
|
||||||
|
if (virLXCMonitorUnref(mon) > 0)
|
||||||
|
virLXCMonitorUnlock(mon);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
virLXCMonitorPtr virLXCMonitorNew(virDomainObjPtr vm,
|
||||||
|
const char *socketdir,
|
||||||
|
virLXCMonitorCallbacksPtr cb)
|
||||||
|
{
|
||||||
|
virLXCMonitorPtr mon;
|
||||||
|
char *sockpath = NULL;
|
||||||
|
|
||||||
|
if (VIR_ALLOC(mon) < 0) {
|
||||||
|
virReportOOMError();
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
mon->refs = 1;
|
||||||
|
|
||||||
|
if (virMutexInit(&mon->lock) < 0) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("cannot initialize monitor mutex"));
|
||||||
|
VIR_FREE(mon);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (virAsprintf(&sockpath, "%s/%s.sock",
|
||||||
|
socketdir, vm->def->name) < 0)
|
||||||
|
goto no_memory;
|
||||||
|
|
||||||
|
if (!(mon->client = virNetClientNewUNIX(sockpath, false, NULL)))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
|
||||||
|
mon->vm = vm;
|
||||||
|
mon->cb = cb;
|
||||||
|
|
||||||
|
virLXCMonitorRef(mon);
|
||||||
|
virNetClientSetCloseCallback(mon->client, virLXCMonitorEOFNotify, mon,
|
||||||
|
virLXCMonitorCloseFreeCallback);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
VIR_FREE(sockpath);
|
||||||
|
return mon;
|
||||||
|
|
||||||
|
no_memory:
|
||||||
|
virReportOOMError();
|
||||||
|
error:
|
||||||
|
virLXCMonitorFree(mon);
|
||||||
|
mon = NULL;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void virLXCMonitorFree(virLXCMonitorPtr mon)
|
||||||
|
{
|
||||||
|
VIR_DEBUG("mon=%p", mon);
|
||||||
|
if (mon->client)
|
||||||
|
virLXCMonitorClose(mon);
|
||||||
|
|
||||||
|
if (mon->cb && mon->cb->destroy)
|
||||||
|
(mon->cb->destroy)(mon, mon->vm);
|
||||||
|
virMutexDestroy(&mon->lock);
|
||||||
|
VIR_FREE(mon);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int virLXCMonitorRef(virLXCMonitorPtr mon)
|
||||||
|
{
|
||||||
|
mon->refs++;
|
||||||
|
return mon->refs;
|
||||||
|
}
|
||||||
|
|
||||||
|
int virLXCMonitorUnref(virLXCMonitorPtr mon)
|
||||||
|
{
|
||||||
|
mon->refs--;
|
||||||
|
|
||||||
|
if (mon->refs == 0) {
|
||||||
|
virLXCMonitorUnlock(mon);
|
||||||
|
virLXCMonitorFree(mon);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return mon->refs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void virLXCMonitorClose(virLXCMonitorPtr mon)
|
||||||
|
{
|
||||||
|
if (mon->client) {
|
||||||
|
virNetClientClose(mon->client);
|
||||||
|
virNetClientFree(mon->client);
|
||||||
|
mon->client = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void virLXCMonitorLock(virLXCMonitorPtr mon)
|
||||||
|
{
|
||||||
|
virMutexLock(&mon->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void virLXCMonitorUnlock(virLXCMonitorPtr mon)
|
||||||
|
{
|
||||||
|
virMutexUnlock(&mon->lock);
|
||||||
|
}
|
54
src/lxc/lxc_monitor.h
Normal file
54
src/lxc/lxc_monitor.h
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2012 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* lxc_monitor.h: client for LXC controller monitor
|
||||||
|
*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __LXC_MONITOR_H__
|
||||||
|
# define __LXC_MONITOR_H__
|
||||||
|
|
||||||
|
# include "domain_conf.h"
|
||||||
|
|
||||||
|
typedef struct _virLXCMonitor virLXCMonitor;
|
||||||
|
typedef virLXCMonitor *virLXCMonitorPtr;
|
||||||
|
|
||||||
|
typedef struct _virLXCMonitorCallbacks virLXCMonitorCallbacks;
|
||||||
|
typedef virLXCMonitorCallbacks *virLXCMonitorCallbacksPtr;
|
||||||
|
|
||||||
|
typedef void (*virLXCMonitorCallbackDestroy)(virLXCMonitorPtr mon,
|
||||||
|
virDomainObjPtr vm);
|
||||||
|
typedef void (*virLXCMonitorCallbackEOFNotify)(virLXCMonitorPtr mon,
|
||||||
|
virDomainObjPtr vm);
|
||||||
|
|
||||||
|
struct _virLXCMonitorCallbacks {
|
||||||
|
virLXCMonitorCallbackDestroy destroy;
|
||||||
|
virLXCMonitorCallbackEOFNotify eofNotify;
|
||||||
|
};
|
||||||
|
|
||||||
|
virLXCMonitorPtr virLXCMonitorNew(virDomainObjPtr vm,
|
||||||
|
const char *socketdir,
|
||||||
|
virLXCMonitorCallbacksPtr cb);
|
||||||
|
|
||||||
|
void virLXCMonitorClose(virLXCMonitorPtr mon);
|
||||||
|
|
||||||
|
void virLXCMonitorLock(virLXCMonitorPtr mon);
|
||||||
|
void virLXCMonitorUnlock(virLXCMonitorPtr mon);
|
||||||
|
|
||||||
|
int virLXCMonitorRef(virLXCMonitorPtr mon);
|
||||||
|
int virLXCMonitorUnref(virLXCMonitorPtr mon);
|
||||||
|
|
||||||
|
#endif /* __LXC_MONITOR_H__ */
|
@ -181,9 +181,13 @@ static void virLXCProcessCleanup(virLXCDriverPtr driver,
|
|||||||
/* Stop autodestroy in case guest is restarted */
|
/* Stop autodestroy in case guest is restarted */
|
||||||
virLXCProcessAutoDestroyRemove(driver, vm);
|
virLXCProcessAutoDestroyRemove(driver, vm);
|
||||||
|
|
||||||
virNetClientClose(priv->monitor);
|
if (priv->monitor) {
|
||||||
virNetClientFree(priv->monitor);
|
virLXCMonitorClose(priv->monitor);
|
||||||
|
virLXCMonitorLock(priv->monitor);
|
||||||
|
if (virLXCMonitorUnref(priv->monitor) > 0)
|
||||||
|
virLXCMonitorUnlock(priv->monitor);
|
||||||
priv->monitor = NULL;
|
priv->monitor = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
virPidFileDelete(driver->stateDir, vm->def->name);
|
virPidFileDelete(driver->stateDir, vm->def->name);
|
||||||
virDomainDeleteConfig(driver->stateDir, NULL, vm);
|
virDomainDeleteConfig(driver->stateDir, NULL, vm);
|
||||||
@ -474,13 +478,25 @@ cleanup:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void virLXCProcessMonitorDestroy(virLXCMonitorPtr mon,
|
||||||
|
virDomainObjPtr vm)
|
||||||
|
{
|
||||||
|
virLXCDomainObjPrivatePtr priv;
|
||||||
|
|
||||||
|
virDomainObjLock(vm);
|
||||||
|
priv = vm->privateData;
|
||||||
|
if (priv->monitor == mon)
|
||||||
|
priv->monitor = NULL;
|
||||||
|
if (virDomainObjUnref(vm) > 0)
|
||||||
|
virDomainObjUnlock(vm);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
extern virLXCDriverPtr lxc_driver;
|
extern virLXCDriverPtr lxc_driver;
|
||||||
static void virLXCProcessMonitorEOFNotify(virNetClientPtr client ATTRIBUTE_UNUSED,
|
static void virLXCProcessMonitorEOFNotify(virLXCMonitorPtr mon ATTRIBUTE_UNUSED,
|
||||||
int reason ATTRIBUTE_UNUSED,
|
virDomainObjPtr vm)
|
||||||
void *opaque)
|
|
||||||
{
|
{
|
||||||
virLXCDriverPtr driver = lxc_driver;
|
virLXCDriverPtr driver = lxc_driver;
|
||||||
virDomainObjPtr vm = opaque;
|
|
||||||
virDomainEventPtr event = NULL;
|
virDomainEventPtr event = NULL;
|
||||||
virLXCDomainObjPrivatePtr priv;
|
virLXCDomainObjPrivatePtr priv;
|
||||||
|
|
||||||
@ -513,36 +529,39 @@ static void virLXCProcessMonitorEOFNotify(virNetClientPtr client ATTRIBUTE_UNUSE
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static virNetClientPtr virLXCProcessConnectMonitor(virLXCDriverPtr driver,
|
static virLXCMonitorCallbacks monitorCallbacks = {
|
||||||
|
.eofNotify = virLXCProcessMonitorEOFNotify,
|
||||||
|
.destroy = virLXCProcessMonitorDestroy,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static virLXCMonitorPtr virLXCProcessConnectMonitor(virLXCDriverPtr driver,
|
||||||
virDomainObjPtr vm)
|
virDomainObjPtr vm)
|
||||||
{
|
{
|
||||||
char *sockpath = NULL;
|
virLXCMonitorPtr monitor = NULL;
|
||||||
virNetClientPtr monitor = NULL;
|
|
||||||
|
|
||||||
if (virAsprintf(&sockpath, "%s/%s.sock",
|
|
||||||
driver->stateDir, vm->def->name) < 0) {
|
|
||||||
virReportOOMError();
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (virSecurityManagerSetSocketLabel(driver->securityManager, vm->def) < 0)
|
if (virSecurityManagerSetSocketLabel(driver->securityManager, vm->def) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
monitor = virNetClientNewUNIX(sockpath, false, NULL);
|
/* Hold an extra reference because we can't allow 'vm' to be
|
||||||
|
* deleted while the monitor is active */
|
||||||
|
virDomainObjRef(vm);
|
||||||
|
|
||||||
|
monitor = virLXCMonitorNew(vm, driver->stateDir, &monitorCallbacks);
|
||||||
|
|
||||||
|
if (monitor == NULL)
|
||||||
|
ignore_value(virDomainObjUnref(vm));
|
||||||
|
|
||||||
if (virSecurityManagerClearSocketLabel(driver->securityManager, vm->def) < 0) {
|
if (virSecurityManagerClearSocketLabel(driver->securityManager, vm->def) < 0) {
|
||||||
virNetClientFree(monitor);
|
if (monitor) {
|
||||||
|
virLXCMonitorLock(monitor);
|
||||||
|
virLXCMonitorUnref(monitor);
|
||||||
monitor = NULL;
|
monitor = NULL;
|
||||||
|
}
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!monitor)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
virNetClientSetCloseCallback(monitor, virLXCProcessMonitorEOFNotify, vm, NULL);
|
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
VIR_FREE(sockpath);
|
|
||||||
return monitor;
|
return monitor;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1051,9 +1070,12 @@ cleanup:
|
|||||||
VIR_FREE(veths[i]);
|
VIR_FREE(veths[i]);
|
||||||
}
|
}
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
virNetClientClose(priv->monitor);
|
if (priv->monitor) {
|
||||||
virNetClientFree(priv->monitor);
|
virLXCMonitorLock(priv->monitor);
|
||||||
|
if (virLXCMonitorUnref(priv->monitor) > 0)
|
||||||
|
virLXCMonitorUnlock(priv->monitor);
|
||||||
priv->monitor = NULL;
|
priv->monitor = NULL;
|
||||||
|
}
|
||||||
virDomainConfVMNWFilterTeardown(vm);
|
virDomainConfVMNWFilterTeardown(vm);
|
||||||
|
|
||||||
virSecurityManagerRestoreAllLabel(driver->securityManager,
|
virSecurityManagerRestoreAllLabel(driver->securityManager,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user