[libvirt] [PATCH 5/6] qemu: Recompute downtime and total time when migration completes

Jiri Denemark jdenemar at redhat.com
Tue Sep 9 09:44:49 UTC 2014


On Fri, Sep 05, 2014 at 14:47:35 -0400, John Ferlan wrote:
> 
> 
> On 09/01/2014 11:05 AM, Jiri Denemark wrote:
> > Total time of a migration and total downtime transfered from a source to
> > a destination host do not count with the transfer time to the
> > destination host and with the time elapsed before guest CPUs are
> > resumed. Thus, source libvirtd remembers when migration started and when
> > guest CPUs were paused. Both timestamps are transferred to destination
> > libvirtd which uses them to compute total migration time and total
> > downtime. This, obviously, requires clock to be synchronized between the
> 
> s/This, obviously,/Obviously this/
> 
> "requires clock" reads funny... "requires the time" seems closer
> 
> > two hosts. The reported times are useless otherwise but they would be
> > equally useless if we didn't do this recomputation so don't lose
> > anything by doing it.
> > 
> 
> Say nothing of inter-timezone migrations right?

There are no timezones in timestamps. It's all UTC until you try to
convert it into something humans understand, which we don't need to do
:-)

> > Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
> > ---
> >  src/libvirt.c             |  5 ++++-
> >  src/qemu/qemu_domain.c    | 28 ++++++++++++++++++++++++++++
> >  src/qemu/qemu_domain.h    |  2 ++
> >  src/qemu/qemu_migration.c | 15 ++++++++++++++-
> >  src/qemu/qemu_process.c   |  9 ++++++++-
> >  tools/virsh.pod           |  5 ++++-
> >  6 files changed, 60 insertions(+), 4 deletions(-)
> > 
...
> > diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> > index 18a3761..cec7828 100644
> > --- a/src/qemu/qemu_domain.c
> > +++ b/src/qemu/qemu_domain.c
> > @@ -222,11 +222,39 @@ qemuDomainJobInfoUpdateTime(qemuDomainJobInfoPtr jobInfo)
> >      if (virTimeMillisNow(&now) < 0)
> >          return -1;
> >  
> > +    if (now < jobInfo->started) {
> > +        VIR_WARN("Async job starts in the future");
> > +        jobInfo->started = 0;
> > +        return 0;
> > +    }
> > +
> >      jobInfo->timeElapsed = now - jobInfo->started;
> >      return 0;
> >  }
> >  
> >  int
> > +qemuDomainJobInfoUpdateDowntime(qemuDomainJobInfoPtr jobInfo)
> > +{
> > +    unsigned long long now;
> > +
> 
> Can jobInfo == NULL? - It's the qemuMigrationWaitForCompletion() path
> timing concern from patch 1.

No, I added ATTRIBUTE_NONNULL to this API too.

> 
> > +    if (!jobInfo->stopped)
> > +        return 0;
> > +
> > +    if (virTimeMillisNow(&now) < 0)
> > +        return -1;
> > +
> > +    if (now < jobInfo->stopped) {
> > +        VIR_WARN("Guest's CPUs stopped in the future");
> > +        jobInfo->stopped = 0;
> > +        return 0;
> > +    }
> > +
> > +    jobInfo->status.downtime = now - jobInfo->stopped;
> > +    jobInfo->status.downtime_set = true;
> > +    return 0;
> > +}
> > +
> > +int
> >  qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo,
> >                          virDomainJobInfoPtr info)
> >  {
> > diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
> > index 365238b..435a22b 100644
> > --- a/src/qemu/qemu_domain.h
> > +++ b/src/qemu/qemu_domain.h
> > @@ -105,6 +105,7 @@ typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
> >  struct _qemuDomainJobInfo {
> >      virDomainJobType type;
> >      unsigned long long started; /* When the async job started */
> > +    unsigned long long stopped; /* When the domain's CPUs were stopped */
> >      /* Computed values */
> >      unsigned long long timeElapsed;
> >      unsigned long long timeRemaining;
> > @@ -390,6 +391,7 @@ bool qemuDomainAgentAvailable(qemuDomainObjPrivatePtr priv,
> >                                bool reportError);
> >  
> >  int qemuDomainJobInfoUpdateTime(qemuDomainJobInfoPtr jobInfo);
> > +int qemuDomainJobInfoUpdateDowntime(qemuDomainJobInfoPtr jobInfo);
> 
> Does this also need some sort of ATTRIBUTE_NONNULL(1)?

Done.

Jirka




More information about the libvir-list mailing list