On 22.03.2013 13:11, Daniel P. Berrange wrote:
From: "Daniel P. Berrange" <berrange(a)redhat.com>
Some of the LXC callbacks did not lock the virDomainObjPtr
instance. This caused transient errors like
error: Failed to start domain busy-mount
error: cannot rename file '/var/run/libvirt/lxc/busy-mount.xml.new' as
'/var/run/libvirt/lxc/busy-mount.xml': No such file or directory
as 2 threads tried to update the status file concurrently
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
src/lxc/lxc_process.c | 17 ++++++++++++++++-
1 file changed, 16 insertions(+), 1 deletion(-)
diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
index 670a032..39a6ea2 100644
--- a/src/lxc/lxc_process.c
+++ b/src/lxc/lxc_process.c
@@ -610,8 +610,13 @@ static void virLXCProcessMonitorExitNotify(virLXCMonitorPtr mon
ATTRIBUTE_UNUSED
virLXCMonitorExitStatus status,
virDomainObjPtr vm)
{
+ virLXCDriverPtr driver = lxc_driver;
virLXCDomainObjPrivatePtr priv = vm->privateData;
+ lxcDriverLock(driver);
+ virObjectLock(vm);
+ lxcDriverUnlock(driver);
+
switch (status) {
case VIR_LXC_MONITOR_EXIT_STATUS_SHUTDOWN:
priv->stopReason = VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN;
@@ -629,6 +634,8 @@ static void virLXCProcessMonitorExitNotify(virLXCMonitorPtr mon
ATTRIBUTE_UNUSED
}
VIR_DEBUG("Domain shutoff reason %d (from status %d)",
priv->stopReason, status);
+
+ virObjectUnlock(vm);
}
static int
@@ -667,9 +674,15 @@ static void virLXCProcessMonitorInitNotify(virLXCMonitorPtr mon
ATTRIBUTE_UNUSED
pid_t initpid,
virDomainObjPtr vm)
{
- virLXCDomainObjPrivatePtr priv = vm->privateData;
+ virLXCDriverPtr driver = lxc_driver;
+ virLXCDomainObjPrivatePtr priv;
ino_t inode;
+ lxcDriverLock(driver);
+ virObjectLock(vm);
+ lxcDriverUnlock(driver);
+
+ priv = vm->privateData;
priv->initpid = initpid;
if (virLXCProcessGetNsInode(initpid, "pid", &inode) < 0) {
@@ -684,6 +697,8 @@ static void virLXCProcessMonitorInitNotify(virLXCMonitorPtr mon
ATTRIBUTE_UNUSED
if (virDomainSaveStatus(lxc_driver->xmlconf, lxc_driver->stateDir, vm) <
0)
VIR_WARN("Cannot update XML with PID for LXC %s",
vm->def->name);
+
+ virObjectUnlock(vm);
}
static virLXCMonitorCallbacks monitorCallbacks = {
ACK
Michal