All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic
@ 2018-07-23 22:22 John Snow
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 1/7] iotests: 169: drop deprecated 'autoload' parameter John Snow
                   ` (8 more replies)
  0 siblings, 9 replies; 11+ messages in thread
From: John Snow @ 2018-07-23 22:22 UTC (permalink / raw)
  To: qemu-devel, qemu-block
  Cc: Juan Quintela, qemu-stable, Dr. David Alan Gilbert, John Snow,
	Fam Zheng, Kevin Wolf, Stefan Hajnoczi, eblake, Max Reitz

This is an updated version of Vladimir's proposal for fixing the
handling around migration and persistent dirty bitmaps.

Patches 1, 4, 6, and 7 update the testing for this feature.
Patch 2 touches up an error message.
Patch 3 removes dead code.
Patch 5 contains the real fix.

v2:
 - Add a new patch 4 as a prerequisite for what's now patch 5
 - Rework the fix to be (hopefully) cleaner, see patch 5 notes
 - Adjust error message in patch 2 (Eric)
 - Adjust test logic slightly (patches 6, 7) to deal with changes
   in patch 5.

John Snow (2):
  iotests: 169: actually test block migration
  dirty-bitmaps: clean-up bitmaps loading and migration logic

Vladimir Sementsov-Ogievskiy (5):
  iotests: 169: drop deprecated 'autoload' parameter
  block/qcow2: improve error message in qcow2_inactivate
  block/qcow2: drop dirty_bitmaps_loaded state variable
  iotests: improve 169
  iotests: 169: add cases for source vm resuming

 block.c                        |  4 ---
 block/dirty-bitmap.c           | 20 ------------
 block/qcow2-bitmap.c           | 16 +++++++++
 block/qcow2.c                  | 26 ++++-----------
 block/qcow2.h                  |  1 -
 include/block/dirty-bitmap.h   |  2 +-
 migration/block-dirty-bitmap.c | 11 ++++---
 tests/qemu-iotests/169         | 74 ++++++++++++++++++++++++++++++++++++++++--
 tests/qemu-iotests/169.out     |  4 +--
 9 files changed, 103 insertions(+), 55 deletions(-)

-- 
2.14.4

^ permalink raw reply	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH for-3.0 1/7] iotests: 169: drop deprecated 'autoload' parameter
  2018-07-23 22:22 [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic John Snow
@ 2018-07-23 22:22 ` John Snow
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 2/7] block/qcow2: improve error message in qcow2_inactivate John Snow
                   ` (7 subsequent siblings)
  8 siblings, 0 replies; 11+ messages in thread
From: John Snow @ 2018-07-23 22:22 UTC (permalink / raw)
  To: qemu-devel, qemu-block
  Cc: Juan Quintela, qemu-stable, Dr. David Alan Gilbert, John Snow,
	Fam Zheng, Kevin Wolf, Stefan Hajnoczi, eblake, Max Reitz,
	Vladimir Sementsov-Ogievskiy

From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Message-id: 20180626135035.133432-2-vsementsov@virtuozzo.com
Signed-off-by: John Snow <jsnow@redhat.com>
---
 tests/qemu-iotests/169 | 1 -
 1 file changed, 1 deletion(-)

diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
index f243db9955..df408f8367 100755
--- a/tests/qemu-iotests/169
+++ b/tests/qemu-iotests/169
@@ -58,7 +58,6 @@ class TestDirtyBitmapMigration(iotests.QMPTestCase):
                   'granularity': granularity}
         if persistent:
             params['persistent'] = True
-            params['autoload'] = True
 
         result = vm.qmp('block-dirty-bitmap-add', **params)
         self.assert_qmp(result, 'return', {});
-- 
2.14.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH for-3.0 2/7] block/qcow2: improve error message in qcow2_inactivate
  2018-07-23 22:22 [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic John Snow
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 1/7] iotests: 169: drop deprecated 'autoload' parameter John Snow
@ 2018-07-23 22:22 ` John Snow
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 3/7] block/qcow2: drop dirty_bitmaps_loaded state variable John Snow
                   ` (6 subsequent siblings)
  8 siblings, 0 replies; 11+ messages in thread
From: John Snow @ 2018-07-23 22:22 UTC (permalink / raw)
  To: qemu-devel, qemu-block
  Cc: Juan Quintela, qemu-stable, Dr. David Alan Gilbert, John Snow,
	Fam Zheng, Kevin Wolf, Stefan Hajnoczi, eblake, Max Reitz,
	Vladimir Sementsov-Ogievskiy

From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Signed-off-by: John Snow <jsnow@redhat.com>
---
 block/qcow2.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/block/qcow2.c b/block/qcow2.c
index 6162ed8be2..7444133ccd 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -2127,9 +2127,9 @@ static int qcow2_inactivate(BlockDriverState *bs)
     qcow2_store_persistent_dirty_bitmaps(bs, &local_err);
     if (local_err != NULL) {
         result = -EINVAL;
-        error_report_err(local_err);
-        error_report("Persistent bitmaps are lost for node '%s'",
-                     bdrv_get_device_or_node_name(bs));
+        error_reportf_err(local_err, "Lost persistent bitmaps during "
+                          "inactivation of node '%s': ",
+                          bdrv_get_device_or_node_name(bs));
     }
 
     ret = qcow2_cache_flush(bs, s->l2_table_cache);
-- 
2.14.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH for-3.0 3/7] block/qcow2: drop dirty_bitmaps_loaded state variable
  2018-07-23 22:22 [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic John Snow
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 1/7] iotests: 169: drop deprecated 'autoload' parameter John Snow
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 2/7] block/qcow2: improve error message in qcow2_inactivate John Snow
@ 2018-07-23 22:22 ` John Snow
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 4/7] iotests: 169: actually test block migration John Snow
                   ` (5 subsequent siblings)
  8 siblings, 0 replies; 11+ messages in thread
From: John Snow @ 2018-07-23 22:22 UTC (permalink / raw)
  To: qemu-devel, qemu-block
  Cc: Juan Quintela, qemu-stable, Dr. David Alan Gilbert, John Snow,
	Fam Zheng, Kevin Wolf, Stefan Hajnoczi, eblake, Max Reitz,
	Vladimir Sementsov-Ogievskiy

From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

This variable doesn't work as it should, because it is actually cleared
in qcow2_co_invalidate_cache() by memset(). Drop it, as the following
patch will introduce new behavior.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: John Snow <jsnow@redhat.com>
Signed-off-by: John Snow <jsnow@redhat.com>
---
 block/qcow2.c | 19 ++-----------------
 block/qcow2.h |  1 -
 2 files changed, 2 insertions(+), 18 deletions(-)

diff --git a/block/qcow2.c b/block/qcow2.c
index 7444133ccd..72d4e67b99 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1157,7 +1157,6 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
     uint64_t ext_end;
     uint64_t l1_vm_state_index;
     bool update_header = false;
-    bool header_updated = false;
 
     ret = bdrv_pread(bs->file, 0, &header, sizeof(header));
     if (ret < 0) {
@@ -1496,23 +1495,9 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
         s->autoclear_features &= QCOW2_AUTOCLEAR_MASK;
     }
 
-    if (s->dirty_bitmaps_loaded) {
-        /* It's some kind of reopen. There are no known cases where we need to
-         * reload bitmaps in such a situation, so it's safer to skip them.
-         *
-         * Moreover, if we have some readonly bitmaps and we are reopening for
-         * rw we should reopen bitmaps correspondingly.
-         */
-        if (bdrv_has_readonly_bitmaps(bs) &&
-            !bdrv_is_read_only(bs) && !(bdrv_get_flags(bs) & BDRV_O_INACTIVE))
-        {
-            qcow2_reopen_bitmaps_rw_hint(bs, &header_updated, &local_err);
-        }
-    } else {
-        header_updated = qcow2_load_dirty_bitmaps(bs, &local_err);
-        s->dirty_bitmaps_loaded = true;
+    if (qcow2_load_dirty_bitmaps(bs, &local_err)) {
+        update_header = false;
     }
-    update_header = update_header && !header_updated;
     if (local_err != NULL) {
         error_propagate(errp, local_err);
         ret = -EINVAL;
diff --git a/block/qcow2.h b/block/qcow2.h
index 81b844e936..4b4e61fe61 100644
--- a/block/qcow2.h
+++ b/block/qcow2.h
@@ -295,7 +295,6 @@ typedef struct BDRVQcow2State {
     uint32_t nb_bitmaps;
     uint64_t bitmap_directory_size;
     uint64_t bitmap_directory_offset;
-    bool dirty_bitmaps_loaded;
 
     int flags;
     int qcow_version;
-- 
2.14.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH for-3.0 4/7] iotests: 169: actually test block migration
  2018-07-23 22:22 [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic John Snow
                   ` (2 preceding siblings ...)
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 3/7] block/qcow2: drop dirty_bitmaps_loaded state variable John Snow
@ 2018-07-23 22:22 ` John Snow
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 5/7] dirty-bitmaps: clean-up bitmaps loading and migration logic John Snow
                   ` (4 subsequent siblings)
  8 siblings, 0 replies; 11+ messages in thread
From: John Snow @ 2018-07-23 22:22 UTC (permalink / raw)
  To: qemu-devel, qemu-block
  Cc: Juan Quintela, qemu-stable, Dr. David Alan Gilbert, John Snow,
	Fam Zheng, Kevin Wolf, Stefan Hajnoczi, eblake, Max Reitz

Presently, we emulate a block migration by just using a different
target file. Update the test to actually request a block migration.

Signed-off-by: John Snow <jsnow@redhat.com>
---
 tests/qemu-iotests/169 | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
index df408f8367..87edc85f43 100755
--- a/tests/qemu-iotests/169
+++ b/tests/qemu-iotests/169
@@ -89,6 +89,9 @@ class TestDirtyBitmapMigration(iotests.QMPTestCase):
         mig_caps = [{'capability': 'events', 'state': True}]
         if migrate_bitmaps:
             mig_caps.append({'capability': 'dirty-bitmaps', 'state': True})
+        if not shared_storage:
+            mig_caps.append({'capability': 'block', 'state': True})
+
 
         result = self.vm_a.qmp('migrate-set-capabilities',
                                capabilities=mig_caps)
-- 
2.14.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH for-3.0 5/7] dirty-bitmaps: clean-up bitmaps loading and migration logic
  2018-07-23 22:22 [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic John Snow
                   ` (3 preceding siblings ...)
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 4/7] iotests: 169: actually test block migration John Snow
@ 2018-07-23 22:22 ` John Snow
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 6/7] iotests: improve 169 John Snow
                   ` (3 subsequent siblings)
  8 siblings, 0 replies; 11+ messages in thread
From: John Snow @ 2018-07-23 22:22 UTC (permalink / raw)
  To: qemu-devel, qemu-block
  Cc: Juan Quintela, qemu-stable, Dr. David Alan Gilbert, John Snow,
	Fam Zheng, Kevin Wolf, Stefan Hajnoczi, eblake, Max Reitz,
	Vladimir Sementsov-Ogievskiy

This patch aims to bring the following behavior:

1. Bitmaps are not loaded on open if BDRV_O_INACTIVE is set, which occurs
   for incoming migration cases. We will load these persistent bitmaps
   on invalidate instead.

2. Regardless of the migration circumstances, persistent bitmaps are
   always flushed to disk on inactivate or close.

3. Bitmaps are read from disk and loaded into memory on any invalidation:
   A) Normal, RW open
   B) Migration target invalidation: With or without dirty-bitmaps
      capability, any bitmaps found on-disk will be loaded.
   C) Migration source invalidation: If the migration fails and the
      source QEMU is resumed, it will re-load bitmaps from disk.

4. When using the dirty-bitmaps migration capability, persistent bitmaps
   are skipped if we are performing a shared storage migration. The
   destination QEMU will load them from disk on invalidate.
   (Transient, non-persistent bitmaps still get migrated.)

   For block migrations, persistent bitmaps are both flushed to disk
   on the source and migrated live across the migration channel.

5. Persistent bitmaps are not unloaded from memory in the inactivate
   handler. Instead, they are removed on-store which occurs during
   inactivate. The effect is functionally the same, but keeps bitmap
   management more inside the module.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Signed-off-by: John Snow <jsnow@redhat.com>
---
 block.c                        |  4 ----
 block/dirty-bitmap.c           | 20 --------------------
 block/qcow2-bitmap.c           | 16 ++++++++++++++++
 block/qcow2.c                  |  5 +++--
 include/block/dirty-bitmap.h   |  2 +-
 migration/block-dirty-bitmap.c | 11 ++++++-----
 6 files changed, 26 insertions(+), 32 deletions(-)

diff --git a/block.c b/block.c
index a2fe05ea96..f16bf106d1 100644
--- a/block.c
+++ b/block.c
@@ -4497,10 +4497,6 @@ static int bdrv_inactivate_recurse(BlockDriverState *bs,
         }
     }
 
-    /* At this point persistent bitmaps should be already stored by the format
-     * driver */
-    bdrv_release_persistent_dirty_bitmaps(bs);
-
     return 0;
 }
 
diff --git a/block/dirty-bitmap.c b/block/dirty-bitmap.c
index c9b8a6fd52..e44061fe2e 100644
--- a/block/dirty-bitmap.c
+++ b/block/dirty-bitmap.c
@@ -383,26 +383,6 @@ void bdrv_release_named_dirty_bitmaps(BlockDriverState *bs)
     bdrv_dirty_bitmaps_unlock(bs);
 }
 
-/**
- * Release all persistent dirty bitmaps attached to a BDS (for use in
- * bdrv_inactivate_recurse()).
- * There must not be any frozen bitmaps attached.
- * This function does not remove persistent bitmaps from the storage.
- * Called with BQL taken.
- */
-void bdrv_release_persistent_dirty_bitmaps(BlockDriverState *bs)
-{
-    BdrvDirtyBitmap *bm, *next;
-
-    bdrv_dirty_bitmaps_lock(bs);
-    QLIST_FOREACH_SAFE(bm, &bs->dirty_bitmaps, list, next) {
-        if (bdrv_dirty_bitmap_get_persistance(bm)) {
-            bdrv_release_dirty_bitmap_locked(bm);
-        }
-    }
-    bdrv_dirty_bitmaps_unlock(bs);
-}
-
 /**
  * Remove persistent dirty bitmap from the storage if it exists.
  * Absence of bitmap is not an error, because we have the following scenario:
diff --git a/block/qcow2-bitmap.c b/block/qcow2-bitmap.c
index ba978ad2aa..b5f1b3563d 100644
--- a/block/qcow2-bitmap.c
+++ b/block/qcow2-bitmap.c
@@ -1418,6 +1418,22 @@ void qcow2_store_persistent_dirty_bitmaps(BlockDriverState *bs, Error **errp)
         g_free(tb);
     }
 
+    QSIMPLEQ_FOREACH(bm, bm_list, entry) {
+        /* For safety, we remove bitmap after storing.
+         * We may be here in two cases:
+         * 1. bdrv_close. It's ok to drop bitmap.
+         * 2. inactivation. It means migration without 'dirty-bitmaps'
+         *    capability, so bitmaps are not marked with
+         *    BdrvDirtyBitmap.migration flags. It's not bad to drop them too,
+         *    and reload on invalidation.
+         */
+        if (bm->dirty_bitmap == NULL) {
+            continue;
+        }
+
+        bdrv_release_dirty_bitmap(bs, bm->dirty_bitmap);
+    }
+
     bitmap_list_free(bm_list);
     return;
 
diff --git a/block/qcow2.c b/block/qcow2.c
index 72d4e67b99..b958cec83d 100644
--- a/block/qcow2.c
+++ b/block/qcow2.c
@@ -1495,8 +1495,9 @@ static int coroutine_fn qcow2_do_open(BlockDriverState *bs, QDict *options,
         s->autoclear_features &= QCOW2_AUTOCLEAR_MASK;
     }
 
-    if (qcow2_load_dirty_bitmaps(bs, &local_err)) {
-        update_header = false;
+    if (!(bdrv_get_flags(bs) & BDRV_O_INACTIVE)) {
+        bool header_updated = qcow2_load_dirty_bitmaps(bs, &local_err);
+        update_header = update_header && !header_updated;
     }
     if (local_err != NULL) {
         error_propagate(errp, local_err);
diff --git a/include/block/dirty-bitmap.h b/include/block/dirty-bitmap.h
index 259bd27c40..95c7847ec6 100644
--- a/include/block/dirty-bitmap.h
+++ b/include/block/dirty-bitmap.h
@@ -26,7 +26,6 @@ BdrvDirtyBitmap *bdrv_find_dirty_bitmap(BlockDriverState *bs,
                                         const char *name);
 void bdrv_release_dirty_bitmap(BlockDriverState *bs, BdrvDirtyBitmap *bitmap);
 void bdrv_release_named_dirty_bitmaps(BlockDriverState *bs);
-void bdrv_release_persistent_dirty_bitmaps(BlockDriverState *bs);
 void bdrv_remove_persistent_dirty_bitmap(BlockDriverState *bs,
                                          const char *name,
                                          Error **errp);
@@ -72,6 +71,7 @@ void bdrv_dirty_bitmap_set_persistance(BdrvDirtyBitmap *bitmap,
 void bdrv_dirty_bitmap_set_qmp_locked(BdrvDirtyBitmap *bitmap, bool qmp_locked);
 void bdrv_merge_dirty_bitmap(BdrvDirtyBitmap *dest, const BdrvDirtyBitmap *src,
                              Error **errp);
+void bdrv_dirty_bitmap_set_migration(BdrvDirtyBitmap *bitmap, bool migration);
 
 /* Functions that require manual locking.  */
 void bdrv_dirty_bitmap_lock(BdrvDirtyBitmap *bitmap);
diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
index 477826330c..dac8270d1f 100644
--- a/migration/block-dirty-bitmap.c
+++ b/migration/block-dirty-bitmap.c
@@ -295,6 +295,12 @@ static int init_dirty_bitmap_migration(void)
                 continue;
             }
 
+            /* Skip persistant bitmaps, unless it's a block migration: */
+            if (bdrv_dirty_bitmap_get_persistance(bitmap) &&
+                !migrate_use_block()) {
+                continue;
+            }
+
             if (drive_name == NULL) {
                 error_report("Found bitmap '%s' in unnamed node %p. It can't "
                              "be migrated", bdrv_dirty_bitmap_name(bitmap), bs);
@@ -335,11 +341,6 @@ static int init_dirty_bitmap_migration(void)
         }
     }
 
-    /* unset persistance here, to not roll back it */
-    QSIMPLEQ_FOREACH(dbms, &dirty_bitmap_mig_state.dbms_list, entry) {
-        bdrv_dirty_bitmap_set_persistance(dbms->bitmap, false);
-    }
-
     if (QSIMPLEQ_EMPTY(&dirty_bitmap_mig_state.dbms_list)) {
         dirty_bitmap_mig_state.no_bitmaps = true;
     }
-- 
2.14.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH for-3.0 6/7] iotests: improve 169
  2018-07-23 22:22 [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic John Snow
                   ` (4 preceding siblings ...)
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 5/7] dirty-bitmaps: clean-up bitmaps loading and migration logic John Snow
@ 2018-07-23 22:22 ` John Snow
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 7/7] iotests: 169: add cases for source vm resuming John Snow
                   ` (2 subsequent siblings)
  8 siblings, 0 replies; 11+ messages in thread
From: John Snow @ 2018-07-23 22:22 UTC (permalink / raw)
  To: qemu-devel, qemu-block
  Cc: Juan Quintela, qemu-stable, Dr. David Alan Gilbert, John Snow,
	Fam Zheng, Kevin Wolf, Stefan Hajnoczi, eblake, Max Reitz,
	Vladimir Sementsov-Ogievskiy

From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

Before previous patch, iotest 169 was actually broken for the case
test_persistent__not_migbitmap__offline_shared, while formally
passing.

After migration log of vm_b had message:

    qemu-system-x86_64: Could not reopen qcow2 layer: Bitmap already
    exists: bitmap0

which means that invalidation failed and bs->drv = NULL.

It was because we've loaded bitmap twice: on open and on invalidation.

Add code to 169, to catch such fails.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Signed-off-by: John Snow <jsnow@redhat.com>
---
 tests/qemu-iotests/169 | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
index 87edc85f43..24027da8e1 100755
--- a/tests/qemu-iotests/169
+++ b/tests/qemu-iotests/169
@@ -24,6 +24,7 @@ import time
 import itertools
 import operator
 import new
+import re
 from iotests import qemu_img
 
 
@@ -136,6 +137,16 @@ class TestDirtyBitmapMigration(iotests.QMPTestCase):
 
         if should_migrate:
             self.vm_b.shutdown()
+
+            # catch 'Could not reopen qcow2 layer: Bitmap already exists'
+            # possible error
+            log = self.vm_b.get_log()
+            log = re.sub(r'^\[I \d+\.\d+\] OPENED\n', '', log)
+            log = re.sub(r'Receiving block device images\n', '', log)
+            log = re.sub(r'Completed \d+ %\r?\n?', '', log)
+            log = re.sub(r'\[I \+\d+\.\d+\] CLOSED\n?$', '', log)
+            self.assertEqual(log, '')
+
             # recreate vm_b, as we don't want -incoming option (this will lead
             # to "cat" process left alive after test finish)
             self.vm_b = iotests.VM(path_suffix='b')
-- 
2.14.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [Qemu-devel] [PATCH for-3.0 7/7] iotests: 169: add cases for source vm resuming
  2018-07-23 22:22 [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic John Snow
                   ` (5 preceding siblings ...)
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 6/7] iotests: improve 169 John Snow
@ 2018-07-23 22:22 ` John Snow
  2018-07-24 12:00 ` [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic Stefan Hajnoczi
  2018-07-30 17:06 ` Michael Roth
  8 siblings, 0 replies; 11+ messages in thread
From: John Snow @ 2018-07-23 22:22 UTC (permalink / raw)
  To: qemu-devel, qemu-block
  Cc: Juan Quintela, qemu-stable, Dr. David Alan Gilbert, John Snow,
	Fam Zheng, Kevin Wolf, Stefan Hajnoczi, eblake, Max Reitz,
	Vladimir Sementsov-Ogievskiy

From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

Test that we can resume source vm after [failed] migration, and bitmaps
are ok.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Signed-off-by: John Snow <jsnow@redhat.com>
---
 tests/qemu-iotests/169     | 59 +++++++++++++++++++++++++++++++++++++++++++++-
 tests/qemu-iotests/169.out |  4 ++--
 2 files changed, 60 insertions(+), 3 deletions(-)

diff --git a/tests/qemu-iotests/169 b/tests/qemu-iotests/169
index 24027da8e1..9cd8853d3c 100755
--- a/tests/qemu-iotests/169
+++ b/tests/qemu-iotests/169
@@ -77,6 +77,57 @@ class TestDirtyBitmapMigration(iotests.QMPTestCase):
             self.assert_qmp(result, 'error/desc',
                             "Dirty bitmap 'bitmap0' not found");
 
+    def do_test_migration_resume_source(self, persistent, migrate_bitmaps):
+        granularity = 512
+
+        # regions = ((start, count), ...)
+        regions = ((0, 0x10000),
+                   (0xf0000, 0x10000),
+                   (0xa0201, 0x1000))
+
+        mig_caps = [{'capability': 'events', 'state': True}]
+        if migrate_bitmaps:
+            mig_caps.append({'capability': 'dirty-bitmaps', 'state': True})
+
+        result = self.vm_a.qmp('migrate-set-capabilities',
+                               capabilities=mig_caps)
+        self.assert_qmp(result, 'return', {})
+
+        self.add_bitmap(self.vm_a, granularity, persistent)
+        for r in regions:
+            self.vm_a.hmp_qemu_io('drive0', 'write %d %d' % r)
+        sha256 = self.get_bitmap_hash(self.vm_a)
+
+        result = self.vm_a.qmp('migrate', uri=mig_cmd)
+        while True:
+            event = self.vm_a.event_wait('MIGRATION')
+            if event['data']['status'] == 'completed':
+                break
+
+        # test that bitmap is still here
+        self.check_bitmap(self.vm_a, False if persistent else sha256)
+
+        self.vm_a.qmp('cont')
+
+        # test that bitmap is still here after invalidation
+        self.check_bitmap(self.vm_a, sha256)
+
+        # shutdown and check that invalidation didn't fail
+        self.vm_a.shutdown()
+
+        # catch 'Could not reopen qcow2 layer: Bitmap already exists'
+        # possible error
+        log = self.vm_a.get_log()
+        log = re.sub(r'^\[I \d+\.\d+\] OPENED\n', '', log)
+        log = re.sub(r'^(wrote .* bytes at offset .*\n.*KiB.*ops.*sec.*\n){3}',
+                     '', log)
+        log = re.sub(r'\[I \+\d+\.\d+\] CLOSED\n?$', '', log)
+        self.assertEqual(log, '')
+
+        # test that bitmap is still persistent
+        self.vm_a.launch()
+        self.check_bitmap(self.vm_a, sha256 if persistent else False)
+
     def do_test_migration(self, persistent, migrate_bitmaps, online,
                           shared_storage):
         granularity = 512
@@ -157,7 +208,7 @@ class TestDirtyBitmapMigration(iotests.QMPTestCase):
 
 def inject_test_case(klass, name, method, *args, **kwargs):
     mc = operator.methodcaller(method, *args, **kwargs)
-    setattr(klass, 'test_' + name, new.instancemethod(mc, None, klass))
+    setattr(klass, 'test_' + method + name, new.instancemethod(mc, None, klass))
 
 for cmb in list(itertools.product((True, False), repeat=4)):
     name = ('_' if cmb[0] else '_not_') + 'persistent_'
@@ -168,6 +219,12 @@ for cmb in list(itertools.product((True, False), repeat=4)):
     inject_test_case(TestDirtyBitmapMigration, name, 'do_test_migration',
                      *list(cmb))
 
+for cmb in list(itertools.product((True, False), repeat=2)):
+    name = ('_' if cmb[0] else '_not_') + 'persistent_'
+    name += ('_' if cmb[1] else '_not_') + 'migbitmap'
+
+    inject_test_case(TestDirtyBitmapMigration, name,
+                     'do_test_migration_resume_source', *list(cmb))
 
 if __name__ == '__main__':
     iotests.main(supported_fmts=['qcow2'])
diff --git a/tests/qemu-iotests/169.out b/tests/qemu-iotests/169.out
index b6f257674e..3a89159833 100644
--- a/tests/qemu-iotests/169.out
+++ b/tests/qemu-iotests/169.out
@@ -1,5 +1,5 @@
-................
+....................
 ----------------------------------------------------------------------
-Ran 16 tests
+Ran 20 tests
 
 OK
-- 
2.14.4

^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic
  2018-07-23 22:22 [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic John Snow
                   ` (6 preceding siblings ...)
  2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 7/7] iotests: 169: add cases for source vm resuming John Snow
@ 2018-07-24 12:00 ` Stefan Hajnoczi
  2018-07-30 17:06 ` Michael Roth
  8 siblings, 0 replies; 11+ messages in thread
From: Stefan Hajnoczi @ 2018-07-24 12:00 UTC (permalink / raw)
  To: John Snow
  Cc: qemu-devel, qemu-block, Juan Quintela, qemu-stable,
	Dr. David Alan Gilbert, Fam Zheng, Kevin Wolf, eblake, Max Reitz

[-- Attachment #1: Type: text/plain, Size: 1639 bytes --]

On Mon, Jul 23, 2018 at 06:22:03PM -0400, John Snow wrote:
> This is an updated version of Vladimir's proposal for fixing the
> handling around migration and persistent dirty bitmaps.
> 
> Patches 1, 4, 6, and 7 update the testing for this feature.
> Patch 2 touches up an error message.
> Patch 3 removes dead code.
> Patch 5 contains the real fix.
> 
> v2:
>  - Add a new patch 4 as a prerequisite for what's now patch 5
>  - Rework the fix to be (hopefully) cleaner, see patch 5 notes
>  - Adjust error message in patch 2 (Eric)
>  - Adjust test logic slightly (patches 6, 7) to deal with changes
>    in patch 5.
> 
> John Snow (2):
>   iotests: 169: actually test block migration
>   dirty-bitmaps: clean-up bitmaps loading and migration logic
> 
> Vladimir Sementsov-Ogievskiy (5):
>   iotests: 169: drop deprecated 'autoload' parameter
>   block/qcow2: improve error message in qcow2_inactivate
>   block/qcow2: drop dirty_bitmaps_loaded state variable
>   iotests: improve 169
>   iotests: 169: add cases for source vm resuming
> 
>  block.c                        |  4 ---
>  block/dirty-bitmap.c           | 20 ------------
>  block/qcow2-bitmap.c           | 16 +++++++++
>  block/qcow2.c                  | 26 ++++-----------
>  block/qcow2.h                  |  1 -
>  include/block/dirty-bitmap.h   |  2 +-
>  migration/block-dirty-bitmap.c | 11 ++++---
>  tests/qemu-iotests/169         | 74 ++++++++++++++++++++++++++++++++++++++++--
>  tests/qemu-iotests/169.out     |  4 +--
>  9 files changed, 103 insertions(+), 55 deletions(-)

Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 455 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic
  2018-07-23 22:22 [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic John Snow
                   ` (7 preceding siblings ...)
  2018-07-24 12:00 ` [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic Stefan Hajnoczi
@ 2018-07-30 17:06 ` Michael Roth
  2018-07-30 17:43   ` John Snow
  8 siblings, 1 reply; 11+ messages in thread
From: Michael Roth @ 2018-07-30 17:06 UTC (permalink / raw)
  To: John Snow, qemu-block, qemu-devel
  Cc: Kevin Wolf, Fam Zheng, Juan Quintela, qemu-stable,
	Dr. David Alan Gilbert, Stefan Hajnoczi, Max Reitz

Quoting John Snow (2018-07-23 17:22:03)
> This is an updated version of Vladimir's proposal for fixing the
> handling around migration and persistent dirty bitmaps.

Are these still being considered for 3.0 rc3/rc4? 2.12.1 releases this week
and I'm not sure how badly these are needed.

> 
> Patches 1, 4, 6, and 7 update the testing for this feature.
> Patch 2 touches up an error message.
> Patch 3 removes dead code.
> Patch 5 contains the real fix.
> 
> v2:
>  - Add a new patch 4 as a prerequisite for what's now patch 5
>  - Rework the fix to be (hopefully) cleaner, see patch 5 notes
>  - Adjust error message in patch 2 (Eric)
>  - Adjust test logic slightly (patches 6, 7) to deal with changes
>    in patch 5.
> 
> John Snow (2):
>   iotests: 169: actually test block migration
>   dirty-bitmaps: clean-up bitmaps loading and migration logic
> 
> Vladimir Sementsov-Ogievskiy (5):
>   iotests: 169: drop deprecated 'autoload' parameter
>   block/qcow2: improve error message in qcow2_inactivate
>   block/qcow2: drop dirty_bitmaps_loaded state variable
>   iotests: improve 169
>   iotests: 169: add cases for source vm resuming
> 
>  block.c                        |  4 ---
>  block/dirty-bitmap.c           | 20 ------------
>  block/qcow2-bitmap.c           | 16 +++++++++
>  block/qcow2.c                  | 26 ++++-----------
>  block/qcow2.h                  |  1 -
>  include/block/dirty-bitmap.h   |  2 +-
>  migration/block-dirty-bitmap.c | 11 ++++---
>  tests/qemu-iotests/169         | 74 ++++++++++++++++++++++++++++++++++++++++--
>  tests/qemu-iotests/169.out     |  4 +--
>  9 files changed, 103 insertions(+), 55 deletions(-)
> 
> -- 
> 2.14.4
> 
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic
  2018-07-30 17:06 ` Michael Roth
@ 2018-07-30 17:43   ` John Snow
  0 siblings, 0 replies; 11+ messages in thread
From: John Snow @ 2018-07-30 17:43 UTC (permalink / raw)
  To: Michael Roth, qemu-block, qemu-devel
  Cc: Kevin Wolf, Fam Zheng, Juan Quintela, qemu-stable,
	Dr. David Alan Gilbert, Stefan Hajnoczi, Max Reitz



On 07/30/2018 01:06 PM, Michael Roth wrote:
> Quoting John Snow (2018-07-23 17:22:03)
>> This is an updated version of Vladimir's proposal for fixing the
>> handling around migration and persistent dirty bitmaps.
> 
> Are these still being considered for 3.0 rc3/rc4? 2.12.1 releases this week
> and I'm not sure how badly these are needed.
> 

Good question. I'd still LIKE them in 3.0, but further fixes are
actually still needed, and I'm working on this right now.

I think you'll find that you might have trouble applying them to 2.12.1
without a fairly long trail of prerequisites, so it might not be easily
plausible.

>>
>> Patches 1, 4, 6, and 7 update the testing for this feature.
>> Patch 2 touches up an error message.
>> Patch 3 removes dead code.
>> Patch 5 contains the real fix.
>>
>> v2:
>>  - Add a new patch 4 as a prerequisite for what's now patch 5
>>  - Rework the fix to be (hopefully) cleaner, see patch 5 notes
>>  - Adjust error message in patch 2 (Eric)
>>  - Adjust test logic slightly (patches 6, 7) to deal with changes
>>    in patch 5.
>>
>> John Snow (2):
>>   iotests: 169: actually test block migration
>>   dirty-bitmaps: clean-up bitmaps loading and migration logic
>>
>> Vladimir Sementsov-Ogievskiy (5):
>>   iotests: 169: drop deprecated 'autoload' parameter
>>   block/qcow2: improve error message in qcow2_inactivate
>>   block/qcow2: drop dirty_bitmaps_loaded state variable
>>   iotests: improve 169
>>   iotests: 169: add cases for source vm resuming
>>
>>  block.c                        |  4 ---
>>  block/dirty-bitmap.c           | 20 ------------
>>  block/qcow2-bitmap.c           | 16 +++++++++
>>  block/qcow2.c                  | 26 ++++-----------
>>  block/qcow2.h                  |  1 -
>>  include/block/dirty-bitmap.h   |  2 +-
>>  migration/block-dirty-bitmap.c | 11 ++++---
>>  tests/qemu-iotests/169         | 74 ++++++++++++++++++++++++++++++++++++++++--
>>  tests/qemu-iotests/169.out     |  4 +--
>>  9 files changed, 103 insertions(+), 55 deletions(-)
>>
>> -- 
>> 2.14.4
>>
>>

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2018-07-30 17:43 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-23 22:22 [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic John Snow
2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 1/7] iotests: 169: drop deprecated 'autoload' parameter John Snow
2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 2/7] block/qcow2: improve error message in qcow2_inactivate John Snow
2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 3/7] block/qcow2: drop dirty_bitmaps_loaded state variable John Snow
2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 4/7] iotests: 169: actually test block migration John Snow
2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 5/7] dirty-bitmaps: clean-up bitmaps loading and migration logic John Snow
2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 6/7] iotests: improve 169 John Snow
2018-07-23 22:22 ` [Qemu-devel] [PATCH for-3.0 7/7] iotests: 169: add cases for source vm resuming John Snow
2018-07-24 12:00 ` [Qemu-devel] [PATCH for-3.0 0/7] fix persistent bitmaps migration logic Stefan Hajnoczi
2018-07-30 17:06 ` Michael Roth
2018-07-30 17:43   ` John Snow

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.