[libvirt] [PATCH RFC 6/7] libxl: implement virDomainGetJobInfo

Joao Martins joao.m.martins at oracle.com
Wed Oct 14 12:17:22 UTC 2015



On 10/13/2015 11:02 PM, Jim Fehlig wrote:
> Joao Martins wrote:
>> Introduce support for domainGetJobInfo to get info about the
>> ongoing job. If the job is active it will update the
>> timeElapsed which is computed with the "started" field added to
>> struct libxlDomainJobObj.  For now we support just the very basic
>> info and all jobs have VIR_DOMAIN_JOB_UNBOUNDED (i.e. no completion
>> time estimation) plus timeElapsed computed.
>>
>> Openstack Kilo uses the Job API to monitor live-migration
>> progress which is currently inexistent in libxl driver and
> 
> s/inexistent/nonexistent/ ? I think inexistent is a rarely used form of
> nonexistent, but then again I'm no English major :-).
> 
:)

>> therefore leads to a crash in the nova compute node. Right
>> now, migration doesn't use jobs in the source node and will
>> return VIR_DOMAIN_JOB_NONE. Though nova handles this case and
>> will migrate it properly instead of crashing.
>>
>> Signed-off-by: Joao Martins <joao.m.martins at oracle.com>
>> ---
>>  src/libxl/libxl_domain.c | 29 +++++++++++++++++++++++++++++
>>  src/libxl/libxl_domain.h |  6 ++++++
>>  src/libxl/libxl_driver.c | 38 ++++++++++++++++++++++++++++++++++++++
>>  3 files changed, 73 insertions(+)
>>
>> diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
>> index 40dcea1..d665615 100644
>> --- a/src/libxl/libxl_domain.c
>> +++ b/src/libxl/libxl_domain.c
>> @@ -74,6 +74,10 @@ libxlDomainObjInitJob(libxlDomainObjPrivatePtr priv)
>>      if (virCondInit(&priv->job.cond) < 0)
>>          return -1;
>>  
>> +    if (VIR_ALLOC(priv->job.current) < 0)
>> +        return -1;
>> +
>> +    memset(priv->job.current, 0, sizeof(*(priv->job.current)));
>>      return 0;
>>  }
>>  
>> @@ -84,12 +88,14 @@ libxlDomainObjResetJob(libxlDomainObjPrivatePtr priv)
>>  
>>      job->active = LIBXL_JOB_NONE;
>>      job->owner = 0;
>> +
> 
> Spurious whitespace change.
> 
Will remove it.

>>  }
>>  
>>  static void
>>  libxlDomainObjFreeJob(libxlDomainObjPrivatePtr priv)
>>  {
>>      ignore_value(virCondDestroy(&priv->job.cond));
>> +    VIR_FREE(priv->job.current);
>>  }
>>  
>>  /* Give up waiting for mutex after 30 seconds */
>> @@ -131,6 +137,8 @@ libxlDomainObjBeginJob(libxlDriverPrivatePtr driver ATTRIBUTE_UNUSED,
>>      VIR_DEBUG("Starting job: %s", libxlDomainJobTypeToString(job));
>>      priv->job.active = job;
>>      priv->job.owner = virThreadSelfID();
>> +    priv->job.started = now;
>> +    priv->job.current->type = VIR_DOMAIN_JOB_UNBOUNDED;
>>  
>>      return 0;
>>  
>> @@ -179,6 +187,27 @@ libxlDomainObjEndJob(libxlDriverPrivatePtr driver ATTRIBUTE_UNUSED,
>>      return virObjectUnref(obj);
>>  }
>>  
>> +int
>> +libxlDomainJobUpdateTime(struct libxlDomainJobObj *job)
>> +{
>> +    virDomainJobInfoPtr jobInfo = job->current;
>> +    unsigned long long now;
>> +
>> +    if (!job->started)
>> +        return 0;
>> +
>> +    if (virTimeMillisNow(&now) < 0)
>> +        return -1;
>> +
>> +    if (now < job->started) {
>> +        job->started = 0;
>> +        return 0;
>> +    }
>> +
>> +    jobInfo->timeElapsed = now - job->started;
>> +    return 0;
>> +}
>> +
>>  static void *
>>  libxlDomainObjPrivateAlloc(void)
>>  {
>> diff --git a/src/libxl/libxl_domain.h b/src/libxl/libxl_domain.h
>> index 44b3e0b..1c1eba3 100644
>> --- a/src/libxl/libxl_domain.h
>> +++ b/src/libxl/libxl_domain.h
>> @@ -53,6 +53,8 @@ struct libxlDomainJobObj {
>>      virCond cond;                       /* Use to coordinate jobs */
>>      enum libxlDomainJob active;         /* Currently running job */
>>      int owner;                          /* Thread which set current job */
>> +    unsigned long long started;         /* When the job started */
>> +    virDomainJobInfoPtr current;        /* Statistics for the current job */
>>  };
>>  
>>  typedef struct _libxlDomainObjPrivate libxlDomainObjPrivate;
>> @@ -88,6 +90,10 @@ libxlDomainObjEndJob(libxlDriverPrivatePtr driver,
>>                       virDomainObjPtr obj)
>>      ATTRIBUTE_RETURN_CHECK;
>>  
>> +int
>> +libxlDomainJobUpdateTime(struct libxlDomainJobObj *job)
>> +    ATTRIBUTE_RETURN_CHECK;
>> +
>>  void
>>  libxlDomainEventQueue(libxlDriverPrivatePtr driver,
>>                        virObjectEventPtr event);
>> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
>> index 01e97fd..eaf6a67 100644
>> --- a/src/libxl/libxl_driver.c
>> +++ b/src/libxl/libxl_driver.c
>> @@ -5282,6 +5282,43 @@ libxlDomainMemoryStats(virDomainPtr dom,
>>      return ret;
>>  }
>>  
>> +static int
>> +libxlDomainGetJobInfo(virDomainPtr dom,
>> +                      virDomainJobInfoPtr info)
>> +{
>> +    libxlDomainObjPrivatePtr priv;
>> +    virDomainObjPtr vm;
>> +    int ret = -1;
>> +
>> +    if (!(vm = libxlDomObjFromDomain(dom)))
>> +        goto cleanup;
>> +
>> +    if (virDomainGetJobInfoEnsureACL(dom->conn, vm->def) < 0)
>> +        goto cleanup;
>> +
>> +    priv = vm->privateData;
>> +    if (!priv->job.active) {
>> +        memset(info, 0, sizeof(*info));
>> +        info->type = VIR_DOMAIN_JOB_NONE;
>> +        ret = 0;
>> +        goto cleanup;
>> +    }
>> +
>> +    /* In libxl we don't have an estimed completion time
> 
> s/estimed/estimated/
> 
>> +     * thus we always set to unbounded and update time
>> +     * for the active job. */
>> +    if (libxlDomainJobUpdateTime(&priv->job) < 0)
>> +        goto cleanup;
>> +
>> +    memcpy(info, priv->job.current, sizeof(virDomainJobInfo));
>> +    ret = 0;
>> +
>> + cleanup:
>> +    if (vm)
>> +        virObjectUnlock(vm);
>> +    return ret;
>> +}
>> +
>>  #undef LIBXL_SET_MEMSTAT
>>  
>>  #define LIBXL_RECORD_UINT(error, key, value, ...) \
>> @@ -6143,6 +6180,7 @@ static virHypervisorDriver libxlHypervisorDriver = {
>>  #endif
>>      .nodeGetFreeMemory = libxlNodeGetFreeMemory, /* 0.9.0 */
>>      .nodeGetCellsFreeMemory = libxlNodeGetCellsFreeMemory, /* 1.1.1 */
>> +    .domainGetJobInfo = libxlDomainGetJobInfo, /* 1.2.20 */
> 
> 1.2.21.
> 
> Other than the nits, looks good!
> 
Glad to hear that!

> Regards,
> Jim
> 




More information about the libvir-list mailing list