bhyve: monitor: do not override domain's privateData

Current monitor code overrides domain object's privateData, e.g.
in virBhyveProcessStart():

  vm->privateData = bhyveMonitorOpen(vm, driver);

where bhyveMonitorPtr() returns bhyveMonitorPtr.

This is not right thing to do, so make bhyveMonitorPtr
a part of the bhyveDomainObjPrivate struct and change related code
accordingly.
This commit is contained in:
Roman Bogorodskiy 2015-11-04 18:08:00 +03:00
parent c9014a0df6
commit 89316b2caa
3 changed files with 30 additions and 21 deletions

View File

@ -26,11 +26,15 @@
# include "domain_addr.h"
# include "domain_conf.h"
# include "bhyve_monitor.h"
typedef struct _bhyveDomainObjPrivate bhyveDomainObjPrivate;
typedef bhyveDomainObjPrivate *bhyveDomainObjPrivatePtr;
struct _bhyveDomainObjPrivate {
virDomainPCIAddressSetPtr pciaddrs;
bool persistentAddrs;
bhyveMonitorPtr mon;
};
extern virDomainXMLPrivateDataCallbacks virBhyveDriverPrivateDataCallbacks;

View File

@ -27,6 +27,7 @@
#include <sys/time.h>
#include <sys/wait.h>
#include "bhyve_domain.h"
#include "bhyve_monitor.h"
#include "bhyve_process.h"
#include "viralloc.h"
@ -41,7 +42,6 @@ VIR_LOG_INIT("bhyve.bhyve_monitor");
struct _bhyveMonitor {
int kq;
int watch;
virDomainObjPtr vm;
bhyveConnPtr driver;
};
@ -49,7 +49,9 @@ static void
bhyveMonitorIO(int watch, int kq, int events ATTRIBUTE_UNUSED, void *opaque)
{
const struct timespec zerowait = { 0, 0 };
bhyveMonitorPtr mon = opaque;
virDomainObjPtr vm = opaque;
bhyveDomainObjPrivatePtr priv = vm->privateData;
bhyveMonitorPtr mon = priv->mon;
struct kevent kev;
int rc, status;
@ -75,10 +77,10 @@ bhyveMonitorIO(int watch, int kq, int events ATTRIBUTE_UNUSED, void *opaque)
}
if (kev.filter == EVFILT_PROC && (kev.fflags & NOTE_EXIT) != 0) {
if ((pid_t)kev.ident != mon->vm->pid) {
if ((pid_t)kev.ident != vm->pid) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("event from unexpected proc %ju!=%ju"),
(uintmax_t)mon->vm->pid, (uintmax_t)kev.ident);
(uintmax_t)vm->pid, (uintmax_t)kev.ident);
return;
}
@ -86,28 +88,28 @@ bhyveMonitorIO(int watch, int kq, int events ATTRIBUTE_UNUSED, void *opaque)
if (WIFSIGNALED(status) && WCOREDUMP(status)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Guest %s got signal %d and crashed"),
mon->vm->def->name,
vm->def->name,
WTERMSIG(status));
virBhyveProcessStop(mon->driver, mon->vm,
virBhyveProcessStop(mon->driver, vm,
VIR_DOMAIN_SHUTOFF_CRASHED);
} else if (WIFEXITED(status)) {
if (WEXITSTATUS(status) == 0) {
/* 0 - reboot */
/* TODO: Implementing reboot is a little more complicated. */
VIR_INFO("Guest %s rebooted; destroying domain.",
mon->vm->def->name);
virBhyveProcessStop(mon->driver, mon->vm,
vm->def->name);
virBhyveProcessStop(mon->driver, vm,
VIR_DOMAIN_SHUTOFF_SHUTDOWN);
} else if (WEXITSTATUS(status) < 3) {
/* 1 - shutdown, 2 - halt, 3 - triple fault. others - error */
VIR_INFO("Guest %s shut itself down; destroying domain.",
mon->vm->def->name);
virBhyveProcessStop(mon->driver, mon->vm,
vm->def->name);
virBhyveProcessStop(mon->driver, vm,
VIR_DOMAIN_SHUTOFF_SHUTDOWN);
} else {
VIR_INFO("Guest %s had an error and exited with status %d; destroying domain.",
mon->vm->def->name, WEXITSTATUS(status));
virBhyveProcessStop(mon->driver, mon->vm,
vm->def->name, WEXITSTATUS(status));
virBhyveProcessStop(mon->driver, vm,
VIR_DOMAIN_SHUTOFF_UNKNOWN);
}
}
@ -117,24 +119,24 @@ bhyveMonitorIO(int watch, int kq, int events ATTRIBUTE_UNUSED, void *opaque)
static void
bhyveMonitorRelease(void *opaque)
{
bhyveMonitorPtr mon = opaque;
virDomainObjPtr vm = opaque;
bhyveDomainObjPrivatePtr priv = vm->privateData;
bhyveMonitorPtr mon = priv->mon;
VIR_FORCE_CLOSE(mon->kq);
virObjectUnref(mon->vm);
VIR_FREE(mon);
}
bhyveMonitorPtr
bhyveMonitorOpen(virDomainObjPtr vm, bhyveConnPtr driver)
{
bhyveMonitorPtr mon;
bhyveMonitorPtr mon = NULL;
struct kevent kev;
int rc;
if (VIR_ALLOC(mon) < 0)
return NULL;
mon->vm = virObjectRef(vm);
mon->driver = driver;
mon->kq = kqueue();
@ -157,7 +159,7 @@ bhyveMonitorOpen(virDomainObjPtr vm, bhyveConnPtr driver)
VIR_EVENT_HANDLE_ERROR |
VIR_EVENT_HANDLE_HANGUP,
bhyveMonitorIO,
mon,
vm,
bhyveMonitorRelease);
if (mon->watch < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",

View File

@ -113,6 +113,7 @@ virBhyveProcessStart(virConnectPtr conn,
virCommandPtr cmd = NULL;
virCommandPtr load_cmd = NULL;
bhyveConnPtr privconn = conn->privateData;
bhyveDomainObjPrivatePtr priv = vm->privateData;
int ret = -1, rc;
if (virAsprintf(&logfile, "%s/%s.log",
@ -210,7 +211,7 @@ virBhyveProcessStart(virConnectPtr conn,
vm->def->id = vm->pid;
virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, reason);
vm->privateData = bhyveMonitorOpen(vm, driver);
priv->mon = bhyveMonitorOpen(vm, driver);
if (virDomainSaveStatus(driver->xmlopt,
BHYVE_STATE_DIR,
@ -257,6 +258,7 @@ virBhyveProcessStop(bhyveConnPtr driver,
{
int ret = -1;
virCommandPtr cmd = NULL;
bhyveDomainObjPrivatePtr priv = vm->privateData;
if (!virDomainObjIsActive(vm)) {
VIR_DEBUG("VM '%s' not active", vm->def->name);
@ -270,8 +272,8 @@ virBhyveProcessStop(bhyveConnPtr driver,
return -1;
}
if (vm->privateData != NULL)
bhyveMonitorClose((bhyveMonitorPtr)vm->privateData);
if ((priv != NULL) && (priv->mon != NULL))
bhyveMonitorClose(priv->mon);
/* First, try to kill 'bhyve' process */
if (virProcessKillPainfully(vm->pid, true) != 0)
@ -358,6 +360,7 @@ virBhyveProcessReconnect(virDomainObjPtr vm,
int nprocs;
char **proc_argv;
char *expected_proctitle = NULL;
bhyveDomainObjPrivatePtr priv = vm->privateData;
int ret = -1;
if (!virDomainObjIsActive(vm))
@ -379,7 +382,7 @@ virBhyveProcessReconnect(virDomainObjPtr vm,
if (proc_argv && proc_argv[0]) {
if (STREQ(expected_proctitle, proc_argv[0])) {
ret = 0;
vm->privateData = bhyveMonitorOpen(vm, data->driver);
priv->mon = bhyveMonitorOpen(vm, data->driver);
}
}