[PATCH v5 4/5] migration/dirtyrate: Implement qemuDomainGetDirtyRateInfo

Michal Privoznik mprivozn at redhat.com
Mon Feb 1 14:53:25 UTC 2021


On 2/1/21 10:55 AM, Hao Wang wrote:
> Implement qemuDomainGetDirtyRateInfo: using flags to control behaviors
> -- calculate and/or query dirtyrate. Default flag is both calculate
> and query.
> 
> Signed-off-by: Hao Wang <wanghao232 at huawei.com>
> Reviewed-by: Chuan Zheng <zhengchuan at huawei.com>
> ---
>   src/qemu/qemu_driver.c | 67 ++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 67 insertions(+)
> 
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index ed840a5c8d..2b9ce1c386 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -20289,6 +20289,72 @@ qemuDomainAuthorizedSSHKeysSet(virDomainPtr dom,
>   }
>   
>   
> +#define MIN_DIRTYRATE_CALCULATION_PERIOD 1  /* supported min dirtyrate calc time: 1s */
> +#define MAX_DIRTYRATE_CALCULATION_PERIOD 60 /* supported max dirtyrate calc time: 60s */
> +
> +static int
> +qemuDomainGetDirtyRateInfo(virDomainPtr dom,
> +                           virDomainDirtyRateInfoPtr info,
> +                           int sec,
> +                           unsigned int flags)
> +{
> +    virQEMUDriverPtr driver = dom->conn->privateData;
> +    virDomainObjPtr vm = NULL;
> +    int ret = -1;


Here should be virCheckFlags() call with all flags supported enumarated. 
The idea is that if a new flag is ever invented then instead of ignoring 
it silently an error is produced.

> +
> +    if (!(vm = qemuDomainObjFromDomain(dom)))
> +        return -1;
> +
> +    if (virDomainGetDirtyRateInfoEnsureACL(dom->conn, vm->def) < 0)
> +        goto cleanup;
> +
> +    if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0)
> +        goto cleanup;
> +
> +    /* flags is default to both calculate and query */
> +    if (flags == VIR_DOMAIN_DIRTYRATE_DEFAULT)
> +        flags |= VIR_DOMAIN_DIRTYRATE_CALC | VIR_DOMAIN_DIRTYRATE_QUERY;
> +
> +    /* calculating */
> +    if (flags & VIR_DOMAIN_DIRTYRATE_CALC) {
> +        if (sec < MIN_DIRTYRATE_CALCULATION_PERIOD ||
> +            sec > MAX_DIRTYRATE_CALCULATION_PERIOD) {
> +            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                           _("seconds=%d is invalid, please choose value within [%d, %d]."),
> +                           sec,
> +                           MIN_DIRTYRATE_CALCULATION_PERIOD,
> +                           MAX_DIRTYRATE_CALCULATION_PERIOD);
> +            goto endjob;
> +        }
> +
> +        if (qemuDomainCalculateDirtyRate(driver, vm, sec) < 0)
> +            goto endjob;
> +    }
> +
> +    /* querying */
> +    if (flags & VIR_DOMAIN_DIRTYRATE_QUERY) {
> +        /* wait sec and extra 50ms to let last calculation finish */
> +        if (flags & VIR_DOMAIN_DIRTYRATE_CALC) {
> +            virObjectUnlock(vm);
> +            g_usleep((sec * 1000 + 50) * 1000);
> +            virObjectLock(vm);

I know this will probably change, but anyway - waiting X seconds is not 
good IMO. Also, it performs two operations at once. What if the 
calculation was successfully started but then querying fails? How can a 
caller distinguish this from a case where the calculation failed to start?

Michal




More information about the libvir-list mailing list