[PATCH 17/19] qemu: migration: Clean up temporary bitmaps when cancelling a migration

Peter Krempa posted 19 patches 4 years, 12 months ago
There is a newer version of this series
[PATCH 17/19] qemu: migration: Clean up temporary bitmaps when cancelling a migration
Posted by Peter Krempa 4 years, 12 months ago
In case when the block migration job required temporary bitmaps for
merging the appropriate checkpoints we need to clean them up when
cancelling the job. On success we don't need to do that though as the
bitmaps are just temporary thus are not written to disk.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
---
 src/qemu/qemu_migration.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 37f0d43d24..36424f8493 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -834,6 +834,32 @@ qemuMigrationSrcNBDCopyCancel(virQEMUDriverPtr driver,
 }


+static int
+qemuMigrationSrcCancelRemoveTempBitmaps(virDomainObjPtr vm,
+                                        qemuDomainAsyncJob asyncJob)
+{
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+    virQEMUDriverPtr driver = priv->driver;
+    qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
+    GSList *next;
+
+    if (!jobPriv->migTempBitmaps)
+        return 0;
+
+    for (next = jobPriv->migTempBitmaps; next; next = next->next) {
+        qemuDomainJobPrivateMigrateTempBitmapPtr t = next->data;
+
+        if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
+            return -1;
+        qemuMonitorBitmapRemove(priv->mon, t->nodename, t->bitmapname);
+        if (qemuDomainObjExitMonitor(driver, vm) < 0)
+            return -1;
+    }
+
+    return 0;
+}
+
+
 static virStorageSourcePtr
 qemuMigrationSrcNBDStorageCopyBlockdevPrepareSource(virDomainDiskDefPtr disk,
                                                     const char *host,
@@ -3999,6 +4025,8 @@ qemuMigrationSrcRun(virQEMUDriverPtr driver,
                                           QEMU_ASYNC_JOB_MIGRATION_OUT,
                                           dconn);

+        qemuMigrationSrcCancelRemoveTempBitmaps(vm, QEMU_ASYNC_JOB_MIGRATION_OUT);
+
         if (priv->job.current->status != QEMU_DOMAIN_JOB_STATUS_CANCELED)
             priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
     }
@@ -5701,6 +5729,9 @@ qemuMigrationSrcCancel(virQEMUDriverPtr driver,
                                       QEMU_ASYNC_JOB_NONE, NULL) < 0)
         return -1;

+    if (qemuMigrationSrcCancelRemoveTempBitmaps(vm, QEMU_ASYNC_JOB_NONE) < 0)
+        return -1;
+
     return 0;
 }

-- 
2.29.2

Re: [PATCH 17/19] qemu: migration: Clean up temporary bitmaps when cancelling a migration
Posted by Jiri Denemark 4 years, 11 months ago
On Thu, Feb 11, 2021 at 16:37:56 +0100, Peter Krempa wrote:
> In case when the block migration job required temporary bitmaps for
> merging the appropriate checkpoints we need to clean them up when
> cancelling the job. On success we don't need to do that though as the
> bitmaps are just temporary thus are not written to disk.
> 
> Signed-off-by: Peter Krempa <pkrempa@redhat.com>
> ---
>  src/qemu/qemu_migration.c | 31 +++++++++++++++++++++++++++++++
>  1 file changed, 31 insertions(+)
> 
> diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
> index 37f0d43d24..36424f8493 100644
> --- a/src/qemu/qemu_migration.c
> +++ b/src/qemu/qemu_migration.c
> @@ -834,6 +834,32 @@ qemuMigrationSrcNBDCopyCancel(virQEMUDriverPtr driver,
>  }
> 
> 
> +static int
> +qemuMigrationSrcCancelRemoveTempBitmaps(virDomainObjPtr vm,
> +                                        qemuDomainAsyncJob asyncJob)
> +{
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> +    virQEMUDriverPtr driver = priv->driver;
> +    qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
> +    GSList *next;
> +
> +    if (!jobPriv->migTempBitmaps)
> +        return 0;

This check is pretty much redundant as the loop will do exactly the
same.

> +
> +    for (next = jobPriv->migTempBitmaps; next; next = next->next) {
> +        qemuDomainJobPrivateMigrateTempBitmapPtr t = next->data;
> +
> +        if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
> +            return -1;
> +        qemuMonitorBitmapRemove(priv->mon, t->nodename, t->bitmapname);
> +        if (qemuDomainObjExitMonitor(driver, vm) < 0)
> +            return -1;
> +    }
> +
> +    return 0;
> +}
> +
> +
>  static virStorageSourcePtr
>  qemuMigrationSrcNBDStorageCopyBlockdevPrepareSource(virDomainDiskDefPtr disk,
>                                                      const char *host,
...

Reviewed-by: Jiri Denemark <jdenemar@redhat.com>