[libvirt] [PATCH] migration: Usable time statistics without requiring NTP

Michal Privoznik mprivozn at redhat.com
Thu Apr 23 09:40:11 UTC 2015


On 23.04.2015 11:18, Jiri Denemark wrote:
> virDomainGetJobStats is able to report statistics of a completed
> migration, however to get usable downtime and total time statistics both
> hosts have to keep synchronized time. To provide at least some
> estimation of the times even when NTP daemons are not running on both
> hosts we can just ignore the time needed to transfer a migration cookie
> to the destination host. The result will be also inaccurate but a bit
> more predictable. The total/down time will just be at least what we
> report.
> 
> https://bugzilla.redhat.com/show_bug.cgi?id=1213434
> Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
> ---
>  include/libvirt/libvirt-domain.h | 23 ++++++++++++++++++++++-
>  src/qemu/qemu_domain.c           | 15 +++++++++++++++
>  src/qemu/qemu_domain.h           |  9 +++++++++
>  src/qemu/qemu_migration.c        | 26 +++++++++++++-------------
>  tools/virsh-domain.c             | 16 ++++++++++++++++
>  5 files changed, 75 insertions(+), 14 deletions(-)
> 

> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 1da687c..4b3143f 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c

> @@ -3438,18 +3443,9 @@ qemuMigrationConfirmPhase(virQEMUDriverPtr driver,
>      /* Update total times with the values sent by the destination daemon */
>      if (mig->jobInfo) {
>          qemuDomainObjPrivatePtr priv = vm->privateData;
> -        if (priv->job.completed) {
> -            qemuDomainJobInfoPtr jobInfo = priv->job.completed;
> -            if (mig->jobInfo->status.downtime_set) {
> -                jobInfo->status.downtime = mig->jobInfo->status.downtime;
> -                jobInfo->status.downtime_set = true;
> -            }
> -            if (mig->jobInfo->timeElapsed)
> -                jobInfo->timeElapsed = mig->jobInfo->timeElapsed;
> -        } else {
> -            priv->job.completed = mig->jobInfo;
> -            mig->jobInfo = NULL;
> -        }
> +        VIR_FREE(priv->job.completed);
> +        priv->job.completed = mig->jobInfo;
> +        mig->jobInfo = NULL;
>      }
>  
>      if (flags & VIR_MIGRATE_OFFLINE)
> @@ -4041,6 +4037,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
>      if (priv->job.completed) {
>          qemuDomainJobInfoUpdateTime(priv->job.completed);
>          qemuDomainJobInfoUpdateDowntime(priv->job.completed);
> +        ignore_value(virTimeMillisNow(&priv->job.completed->sent));

So here you mark the time of start of the migration (on the source)...

>      }
>  
>      if (priv->job.current->type == VIR_DOMAIN_JOB_UNBOUNDED)
> @@ -5164,8 +5161,11 @@ qemuMigrationFinish(virQEMUDriverPtr driver,
>          }
>  
>          if (mig->jobInfo) {
> -            priv->job.completed = mig->jobInfo;
> +            qemuDomainJobInfoPtr jobInfo = mig->jobInfo;
> +            priv->job.completed = jobInfo;
>              mig->jobInfo = NULL;
> +            if (jobInfo->sent && virTimeMillisNow(&jobInfo->received) == 0)
> +                jobInfo->timeDelta = jobInfo->received - jobInfo->sent;

... and here, once the migration is finished, you compute the time
difference. What I am worried about is, what if time on both machines is
so off that this value makes no sense (e.g. timeDelta would be a
negative number)?

Moreover, don't we have it as a migration prerequisite that time on the
both machines needs to be synchronized? Or is this meant for much finer
granularity and I'm just babbling?

Michal




More information about the libvir-list mailing list