[libvirt] [PATCH 4/9] Add QEMU driver support for job info on migration ops
Daniel P. Berrange
berrange at redhat.com
Mon Mar 1 13:02:32 UTC 2010
On Fri, Feb 26, 2010 at 06:51:05PM +0100, Daniel Veillard wrote:
> 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
Yeah, the public API comment was wrong - we were passing milliseconds out
to the client app, and virsh is processing it as milliseconds.
>
> > 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.
Migration still starts immediately, we merely have a 1/2 second delay
for detecting its completion. We need to improve this regardless though
since migraiton is supposed to be seemless !
>
> > + struct timespec ts = { .tv_sec = 0, .tv_nsec = 500 * 1000ull };
> > + struct timeval now;
> > + int rc;
> > +
> > + qemuDomainObjEnterMonitorWithDriver(driver, vm);
>
> ACK,
>
Daniel
--
|: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :|
|: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|
More information about the libvir-list
mailing list