[libvirt] [PATCHv2 01/14] Check for domain liveness in qemuDomainObjExitMonitor
John Ferlan
jferlan at redhat.com
Mon Jan 12 19:02:51 UTC 2015
On 01/07/2015 10:42 AM, Ján Tomko wrote:
> The domain might disappear during the time in monitor when
> the virDomainObjPtr is unlocked, so the caller needs to check
> if it's still alive.
>
> Since most of the callers are going to need it, put the
> check inside qemuDomainObjExitMonitor and return -1 if
> the domain died in the meantime.
> ---
> src/qemu/THREADS.txt | 5 +++++
> src/qemu/qemu_domain.c | 16 ++++++++++++++--
> src/qemu/qemu_domain.h | 4 ++--
> 3 files changed, 21 insertions(+), 4 deletions(-)
>
> diff --git a/src/qemu/THREADS.txt b/src/qemu/THREADS.txt
> index add2a35..dfa372b 100644
> --- a/src/qemu/THREADS.txt
> +++ b/src/qemu/THREADS.txt
> @@ -160,6 +160,11 @@ To acquire the QEMU monitor lock
> - Acquires the virDomainObjPtr lock
>
> These functions must not be used by an asynchronous job.
> + Note that the virDomainObj is unlocked during the time in
> + monitor and it can be changed, e.g. if QEMU dies, qemuProcessStop
> + may free the live domain definition and put the persistent
> + definition back in vm->def. The callers should check the return
> + value of ExitMonitor to see if the domain is still alive.
>
>
> To acquire the QEMU monitor lock as part of an asynchronous job
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 3d4023c..c942b02 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -1586,11 +1586,23 @@ void qemuDomainObjEnterMonitor(virQEMUDriverPtr driver,
> /* obj must NOT be locked before calling
> *
> * Should be paired with an earlier qemuDomainObjEnterMonitor() call
> + *
> + * Returns -1 if the domain is no longer alive after exiting the monitor.
> + * In that case, the caller should be careful when using obj's data,
> + * e.g. the live definition in vm->def has been freed by qemuProcessStop
> + * and replaced by the persistent definition, so pointers stolen
> + * from the live definition could no longer be valid.
> */
> -void qemuDomainObjExitMonitor(virQEMUDriverPtr driver,
> - virDomainObjPtr obj)
> +int qemuDomainObjExitMonitor(virQEMUDriverPtr driver,
> + virDomainObjPtr obj)
> {
> qemuDomainObjExitMonitorInternal(driver, obj);
> + if (!virDomainObjIsActive(obj)) {
> + virReportError(VIR_ERR_OPERATION_FAILED, "%s",
> + _("domain is no longer running"));
> + return -1;
> + }
> + return 0;
Do we have to worry about caller paths perhaps using virReportError and
this overwriting the other message for the last message? Does it really
matter?
ACK
John
> }
>
> /*
> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
> index 6b52f03..fd91d83 100644
> --- a/src/qemu/qemu_domain.h
> +++ b/src/qemu/qemu_domain.h
> @@ -245,8 +245,8 @@ void qemuDomainObjReleaseAsyncJob(virDomainObjPtr obj);
> void qemuDomainObjEnterMonitor(virQEMUDriverPtr driver,
> virDomainObjPtr obj)
> ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
> -void qemuDomainObjExitMonitor(virQEMUDriverPtr driver,
> - virDomainObjPtr obj)
> +int qemuDomainObjExitMonitor(virQEMUDriverPtr driver,
> + virDomainObjPtr obj)
> ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
> int qemuDomainObjEnterMonitorAsync(virQEMUDriverPtr driver,
> virDomainObjPtr obj,
>
More information about the libvir-list
mailing list