[libvirt] [PATCH] Fix thread safety in LXC callback handling
Michal Privoznik
mprivozn at redhat.com
Fri Mar 22 12:20:59 UTC 2013
On 22.03.2013 13:11, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at 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 at 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
More information about the libvir-list
mailing list