[libvirt] [PATCH 4/9] Add QEMU driver support for job info on migration ops
Daniel Veillard
veillard at redhat.com
Fri Feb 26 17:51:05 UTC 2010
On Thu, Feb 18, 2010 at 03:56:10PM +0000, Daniel P. Berrange wrote:
> Introduce support for virDomainGetJobInfo in the QEMU driver. This
> allows for monitoring of any API that uses the 'info migrate' monitor
> command. ie virDomainMigrate, virDomainSave and virDomainCoreDump
>
> Unfortunately QEMU does not provide a way to monitor incoming migration
> so we can't wire up virDomainRestore yet.
>
> The virsh tool gets a new command 'domjobinfo' to query status
>
> * src/qemu/qemu_driver.c: Record virDomainJobInfo and start time
> in qemuDomainObjPrivatePtr objects. Add generic shared handler
> for calling 'info migrate' with all migration based APIs.
> * src/qemu/qemu_monitor_text.c: Fix parsing of 'info migration' reply
> * tools/virsh.c: add new 'domjobinfo' command to query progress
> ---
> src/qemu/qemu_driver.c | 208 +++++++++++++++++++++++++++++++++++-------
> src/qemu/qemu_monitor_text.c | 7 +-
> tools/virsh.c | 129 ++++++++++++++++++++++----
> 3 files changed, 288 insertions(+), 56 deletions(-)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index a6dc4f9..b245eb2 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -87,6 +87,8 @@ struct _qemuDomainObjPrivate {
> int jobActive; /* Non-zero if a job is active. Only 1 job is allowed at any time
> * A job includes *all* monitor commands, even those just querying
> * information, not merely actions */
> + virDomainJobInfo jobInfo;
> + unsigned long long jobStart;
>
> qemuMonitorPtr mon;
> virDomainChrDefPtr monConfig;
> @@ -329,6 +331,8 @@ static int qemuDomainObjBeginJob(virDomainObjPtr obj)
> }
> }
> priv->jobActive = 1;
> + priv->jobStart = (now.tv_sec * 1000ull) + (now.tv_usec / 1000);
> + memset(&priv->jobInfo, 0, sizeof(priv->jobInfo));
>
> return 0;
> }
> @@ -373,6 +377,8 @@ static int qemuDomainObjBeginJobWithDriver(struct qemud_driver *driver,
> }
> }
> priv->jobActive = 1;
> + priv->jobStart = (now.tv_sec * 1000ull) + (now.tv_usec / 1000);
> + memset(&priv->jobInfo, 0, sizeof(priv->jobInfo));
Hum, I though the time was measured in second in the job strcture, why
keep a millisecond timestamp here ? Maybe seconds are too coarse in the
API anyway
> virDomainObjUnlock(obj);
> qemuDriverLock(driver);
> @@ -395,6 +401,8 @@ static int ATTRIBUTE_RETURN_CHECK qemuDomainObjEndJob(virDomainObjPtr obj)
> qemuDomainObjPrivatePtr priv = obj->privateData;
>
> priv->jobActive = 0;
> + priv->jobStart = 0;
> + memset(&priv->jobInfo, 0, sizeof(priv->jobInfo));
> virCondSignal(&priv->jobCond);
>
> return virDomainObjUnref(obj);
> @@ -3919,6 +3927,96 @@ cleanup:
> }
>
>
> +static int
> +qemuDomainWaitForMigrationComplete(struct qemud_driver *driver, virDomainObjPtr vm)
> +{
> + int ret = -1;
> + int status;
> + unsigned long long memProcessed;
> + unsigned long long memRemaining;
> + unsigned long long memTotal;
> + qemuDomainObjPrivatePtr priv = vm->privateData;
> +
> + priv->jobInfo.type = VIR_DOMAIN_JOB_UNBOUNDED;
> +
> + while (priv->jobInfo.type == VIR_DOMAIN_JOB_UNBOUNDED) {
> + /* Poll every 1/2 second for progress & to allow cancellation */
that's way larger than an human perception window so from
an UI perspective the user will percieve the time between
the request and when it takes effect, probably not a big deal
but could be refined in the future.
> + struct timespec ts = { .tv_sec = 0, .tv_nsec = 500 * 1000ull };
> + struct timeval now;
> + int rc;
> +
> + qemuDomainObjEnterMonitorWithDriver(driver, vm);
ACK,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list