]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Store initpid in the domain status XML for LXC
authorDaniel P. Berrange <berrange@redhat.com>
Thu, 22 Nov 2012 17:15:54 +0000 (17:15 +0000)
committerDaniel P. Berrange <berrange@redhat.com>
Tue, 27 Nov 2012 17:02:22 +0000 (17:02 +0000)
The initpid will be required long term to enable LXC to
implement various hotplug operations. Thus it needs to be
persisted in the domain status XML. LXC has not used the
domain status XML before, so this introduces use of the
helpers.

src/lxc/lxc_domain.c
src/lxc/lxc_domain.h
src/lxc/lxc_process.c

index 17f1d0c51de361f4f959d55fc7ae1dcfa8d7872f..bd80d9fe9a9945ca5fa48e1856af77a6c2336361 100644 (file)
 #include "lxc_domain.h"
 
 #include "memory.h"
+#include "logging.h"
+#include "virterror_internal.h"
+
+#define VIR_FROM_THIS VIR_FROM_LXC
 
 static void *virLXCDomainObjPrivateAlloc(void)
 {
@@ -43,8 +47,36 @@ static void virLXCDomainObjPrivateFree(void *data)
 }
 
 
+static int virLXCDomainObjPrivateXMLFormat(virBufferPtr buf, void *data)
+{
+    virLXCDomainObjPrivatePtr priv = data;
+
+    virBufferAsprintf(buf, "  <init pid='%llu'/>\n",
+                      (unsigned long long)priv->initpid);
+
+    return 0;
+}
+
+static int virLXCDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, void *data)
+{
+    virLXCDomainObjPrivatePtr priv = data;
+    unsigned long long thepid;
+
+    if (virXPathULongLong("string(./init[1]/@pid)", ctxt, &thepid) < 0) {
+        virErrorPtr err = virGetLastError();
+        VIR_WARN("Failed to load init pid from state %s", err ? err->message : "null");
+        priv->initpid = 0;
+    } else {
+        priv->initpid = thepid;
+    }
+
+    return 0;
+}
+
 void virLXCDomainSetPrivateDataHooks(virCapsPtr caps)
 {
     caps->privateDataAllocFunc = virLXCDomainObjPrivateAlloc;
     caps->privateDataFreeFunc = virLXCDomainObjPrivateFree;
+    caps->privateDataXMLFormat = virLXCDomainObjPrivateXMLFormat;
+    caps->privateDataXMLParse = virLXCDomainObjPrivateXMLParse;
 }
index b1dd5d9eade26cc5f518ac49575cefe2d0851bb2..882f34ad9b4898105e28f271d6e72bbf1ac5ebb9 100644 (file)
@@ -34,6 +34,8 @@ struct _virLXCDomainObjPrivate {
     bool doneStopEvent;
     int stopReason;
     bool wantReboot;
+
+    pid_t initpid;
 };
 
 void virLXCDomainSetPrivateDataHooks(virCapsPtr caps);
index 1bf46975e03eff48aa8e28b16f52b2c04e863cf6..d489c048578c65553e2b36a23b7c4ea0fbf25ca6 100644 (file)
@@ -637,11 +637,18 @@ static void virLXCProcessMonitorExitNotify(virLXCMonitorPtr mon ATTRIBUTE_UNUSED
               priv->stopReason, status);
 }
 
+/* XXX a little evil */
+extern virLXCDriverPtr lxc_driver;
 static void virLXCProcessMonitorInitNotify(virLXCMonitorPtr mon ATTRIBUTE_UNUSED,
                                            pid_t initpid,
                                            virDomainObjPtr vm)
 {
+    virLXCDomainObjPrivatePtr priv = vm->privateData;
+    priv->initpid = initpid;
     virDomainAuditInit(vm, initpid);
+
+    if (virDomainSaveStatus(lxc_driver->caps, lxc_driver->stateDir, vm) < 0)
+        VIR_WARN("Cannot update XML with PID for LXC %s", vm->def->name);
 }
 
 static virLXCMonitorCallbacks monitorCallbacks = {