2020-04-07 17:53:19 +03:00
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
2020-03-17 10:55:24 +03:00
|
|
|
From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= <f.gruenbichler@proxmox.com>
|
2020-04-07 17:53:19 +03:00
|
|
|
Date: Mon, 6 Apr 2020 12:17:08 +0200
|
|
|
|
Subject: [PATCH] mirror: move some checks to qmp
|
2020-03-17 10:55:24 +03:00
|
|
|
MIME-Version: 1.0
|
|
|
|
Content-Type: text/plain; charset=UTF-8
|
|
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
|
|
|
|
and assert the passing conditions in block/mirror.c. while incremental
|
|
|
|
mode was never available for drive-mirror, it makes the interface more
|
|
|
|
uniform w.r.t. backup block jobs.
|
|
|
|
|
|
|
|
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
2022-01-13 12:34:33 +03:00
|
|
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
update submodule and patches to QEMU 8.0.0
Many changes were necessary this time around:
* QAPI was changed to avoid redundant has_* variables, see commit
44ea9d9be3 ("qapi: Start to elide redundant has_FOO in generated C")
for details. This affected many QMP commands added by Proxmox too.
* Pending querying for migration got split into two functions, one to
estimate, one for exact value, see commit c8df4a7aef ("migration:
Split save_live_pending() into state_pending_*") for details. Relevant
for savevm-async and PBS dirty bitmap.
* Some block (driver) functions got converted to coroutines, so the
Proxmox block drivers needed to be adapted.
* Alloc track auto-detaching during PBS live restore got broken by
AioContext-related changes resulting in a deadlock. The current, hacky
method was replaced by a simpler one. Stefan apparently ran into a
problem with that when he wrote the driver, but there were
improvements in the stream job code since then and I didn't manage to
reproduce the issue. It's a separate patch "alloc-track: fix deadlock
during drop" for now, you can find the details there.
* Async snapshot-related changes:
- The pending querying got adapted to the above-mentioned split and
a patch is added to optimize it/make it more similar to what
upstream code does.
- Added initialization of the compression counters (for
future-proofing).
- It's necessary the hold the BQL (big QEMU lock = iothread mutex)
during the setup phase, because block layer functions are used there
and not doing so leads to racy, hard-to-debug crashes or hangs. It's
necessary to change some upstream code too for this, a version of
the patch "migration: for snapshots, hold the BQL during setup
callbacks" is intended to be upstreamed.
- Need to take the bdrv graph read lock before flushing.
* hmp_info_balloon was moved to a different file.
* Needed to include a new headers from time to time to still get the
correct functions.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
2023-05-15 16:39:53 +03:00
|
|
|
[FE: rebase for 8.0]
|
|
|
|
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
2020-03-17 10:55:24 +03:00
|
|
|
---
|
|
|
|
block/mirror.c | 28 +++------------
|
|
|
|
blockdev.c | 29 +++++++++++++++
|
2020-04-07 17:53:19 +03:00
|
|
|
tests/qemu-iotests/384.out | 72 +++++++++++++++++++-------------------
|
2020-03-17 10:55:24 +03:00
|
|
|
3 files changed, 70 insertions(+), 59 deletions(-)
|
|
|
|
|
|
|
|
diff --git a/block/mirror.c b/block/mirror.c
|
update submodule and patches to QEMU 8.0.0
Many changes were necessary this time around:
* QAPI was changed to avoid redundant has_* variables, see commit
44ea9d9be3 ("qapi: Start to elide redundant has_FOO in generated C")
for details. This affected many QMP commands added by Proxmox too.
* Pending querying for migration got split into two functions, one to
estimate, one for exact value, see commit c8df4a7aef ("migration:
Split save_live_pending() into state_pending_*") for details. Relevant
for savevm-async and PBS dirty bitmap.
* Some block (driver) functions got converted to coroutines, so the
Proxmox block drivers needed to be adapted.
* Alloc track auto-detaching during PBS live restore got broken by
AioContext-related changes resulting in a deadlock. The current, hacky
method was replaced by a simpler one. Stefan apparently ran into a
problem with that when he wrote the driver, but there were
improvements in the stream job code since then and I didn't manage to
reproduce the issue. It's a separate patch "alloc-track: fix deadlock
during drop" for now, you can find the details there.
* Async snapshot-related changes:
- The pending querying got adapted to the above-mentioned split and
a patch is added to optimize it/make it more similar to what
upstream code does.
- Added initialization of the compression counters (for
future-proofing).
- It's necessary the hold the BQL (big QEMU lock = iothread mutex)
during the setup phase, because block layer functions are used there
and not doing so leads to racy, hard-to-debug crashes or hangs. It's
necessary to change some upstream code too for this, a version of
the patch "migration: for snapshots, hold the BQL during setup
callbacks" is intended to be upstreamed.
- Need to take the bdrv graph read lock before flushing.
* hmp_info_balloon was moved to a different file.
* Needed to include a new headers from time to time to still get the
correct functions.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
2023-05-15 16:39:53 +03:00
|
|
|
index f42953837b..8f79efaa87 100644
|
2020-03-17 10:55:24 +03:00
|
|
|
--- a/block/mirror.c
|
|
|
|
+++ b/block/mirror.c
|
update submodule and patches to QEMU 8.0.0
Many changes were necessary this time around:
* QAPI was changed to avoid redundant has_* variables, see commit
44ea9d9be3 ("qapi: Start to elide redundant has_FOO in generated C")
for details. This affected many QMP commands added by Proxmox too.
* Pending querying for migration got split into two functions, one to
estimate, one for exact value, see commit c8df4a7aef ("migration:
Split save_live_pending() into state_pending_*") for details. Relevant
for savevm-async and PBS dirty bitmap.
* Some block (driver) functions got converted to coroutines, so the
Proxmox block drivers needed to be adapted.
* Alloc track auto-detaching during PBS live restore got broken by
AioContext-related changes resulting in a deadlock. The current, hacky
method was replaced by a simpler one. Stefan apparently ran into a
problem with that when he wrote the driver, but there were
improvements in the stream job code since then and I didn't manage to
reproduce the issue. It's a separate patch "alloc-track: fix deadlock
during drop" for now, you can find the details there.
* Async snapshot-related changes:
- The pending querying got adapted to the above-mentioned split and
a patch is added to optimize it/make it more similar to what
upstream code does.
- Added initialization of the compression counters (for
future-proofing).
- It's necessary the hold the BQL (big QEMU lock = iothread mutex)
during the setup phase, because block layer functions are used there
and not doing so leads to racy, hard-to-debug crashes or hangs. It's
necessary to change some upstream code too for this, a version of
the patch "migration: for snapshots, hold the BQL during setup
callbacks" is intended to be upstreamed.
- Need to take the bdrv graph read lock before flushing.
* hmp_info_balloon was moved to a different file.
* Needed to include a new headers from time to time to still get the
correct functions.
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
2023-05-15 16:39:53 +03:00
|
|
|
@@ -1688,31 +1688,13 @@ static BlockJob *mirror_start_job(
|
2021-05-27 13:43:32 +03:00
|
|
|
uint64_t target_perms, target_shared_perms;
|
2020-03-17 10:55:24 +03:00
|
|
|
int ret;
|
|
|
|
|
|
|
|
- if (sync_mode == MIRROR_SYNC_MODE_INCREMENTAL) {
|
|
|
|
- error_setg(errp, "Sync mode '%s' not supported",
|
|
|
|
- MirrorSyncMode_str(sync_mode));
|
|
|
|
- return NULL;
|
|
|
|
- } else if (sync_mode == MIRROR_SYNC_MODE_BITMAP) {
|
|
|
|
- if (!bitmap) {
|
|
|
|
- error_setg(errp, "Must provide a valid bitmap name for '%s'"
|
|
|
|
- " sync mode",
|
|
|
|
- MirrorSyncMode_str(sync_mode));
|
|
|
|
- return NULL;
|
|
|
|
- }
|
|
|
|
- } else if (bitmap) {
|
|
|
|
- error_setg(errp,
|
|
|
|
- "sync mode '%s' is not compatible with bitmaps",
|
|
|
|
- MirrorSyncMode_str(sync_mode));
|
|
|
|
- return NULL;
|
|
|
|
- }
|
|
|
|
+ /* QMP interface protects us from these cases */
|
|
|
|
+ assert(sync_mode != MIRROR_SYNC_MODE_INCREMENTAL);
|
|
|
|
+ assert((bitmap && sync_mode == MIRROR_SYNC_MODE_BITMAP) ||
|
|
|
|
+ (!bitmap && sync_mode != MIRROR_SYNC_MODE_BITMAP));
|
|
|
|
+ assert(!(bitmap && granularity));
|
|
|
|
|
|
|
|
if (bitmap) {
|
|
|
|
- if (granularity) {
|
|
|
|
- error_setg(errp, "granularity (%d)"
|
|
|
|
- "cannot be specified when a bitmap is provided",
|
|
|
|
- granularity);
|
|
|
|
- return NULL;
|
|
|
|
- }
|
|
|
|
granularity = bdrv_dirty_bitmap_granularity(bitmap);
|
|
|
|
|
|
|
|
if (bitmap_mode != BITMAP_SYNC_MODE_NEVER) {
|
|
|
|
diff --git a/blockdev.c b/blockdev.c
|
2023-06-15 14:39:00 +03:00
|
|
|
index e6b2b1e338..bdae211a54 100644
|
2020-03-17 10:55:24 +03:00
|
|
|
--- a/blockdev.c
|
|
|
|
+++ b/blockdev.c
|
2023-05-15 16:39:54 +03:00
|
|
|
@@ -3015,7 +3015,36 @@ static void blockdev_mirror_common(const char *job_id, BlockDriverState *bs,
|
2020-03-17 10:55:24 +03:00
|
|
|
sync = MIRROR_SYNC_MODE_FULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
+ if ((sync == MIRROR_SYNC_MODE_BITMAP) ||
|
|
|
|
+ (sync == MIRROR_SYNC_MODE_INCREMENTAL)) {
|
|
|
|
+ /* done before desugaring 'incremental' to print the right message */
|
2023-06-15 14:39:00 +03:00
|
|
|
+ if (!bitmap_name) {
|
2020-03-17 10:55:24 +03:00
|
|
|
+ error_setg(errp, "Must provide a valid bitmap name for "
|
|
|
|
+ "'%s' sync mode", MirrorSyncMode_str(sync));
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (sync == MIRROR_SYNC_MODE_INCREMENTAL) {
|
|
|
|
+ if (has_bitmap_mode &&
|
|
|
|
+ bitmap_mode != BITMAP_SYNC_MODE_ON_SUCCESS) {
|
|
|
|
+ error_setg(errp, "Bitmap sync mode must be '%s' "
|
|
|
|
+ "when using sync mode '%s'",
|
|
|
|
+ BitmapSyncMode_str(BITMAP_SYNC_MODE_ON_SUCCESS),
|
|
|
|
+ MirrorSyncMode_str(sync));
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ has_bitmap_mode = true;
|
|
|
|
+ sync = MIRROR_SYNC_MODE_BITMAP;
|
|
|
|
+ bitmap_mode = BITMAP_SYNC_MODE_ON_SUCCESS;
|
|
|
|
+ }
|
|
|
|
+
|
2023-06-15 14:39:00 +03:00
|
|
|
if (bitmap_name) {
|
2020-03-17 10:55:24 +03:00
|
|
|
+ if (sync != MIRROR_SYNC_MODE_BITMAP) {
|
|
|
|
+ error_setg(errp, "Sync mode '%s' not supported with bitmap.",
|
|
|
|
+ MirrorSyncMode_str(sync));
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
if (granularity) {
|
|
|
|
error_setg(errp, "Granularity and bitmap cannot both be set");
|
|
|
|
return;
|
2020-04-07 17:53:19 +03:00
|
|
|
diff --git a/tests/qemu-iotests/384.out b/tests/qemu-iotests/384.out
|
2020-03-17 10:55:24 +03:00
|
|
|
index 9b7408b6d6..06a2e29058 100644
|
2020-04-07 17:53:19 +03:00
|
|
|
--- a/tests/qemu-iotests/384.out
|
|
|
|
+++ b/tests/qemu-iotests/384.out
|
2020-03-17 10:55:24 +03:00
|
|
|
@@ -2681,45 +2681,45 @@ qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
|
|
|
|
-- Sync mode incremental tests --
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Must provide a valid bitmap name for 'incremental' sync mode"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Must provide a valid bitmap name for 'incremental' sync mode"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Must provide a valid bitmap name for 'incremental' sync mode"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Sync mode 'incremental' not supported"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Must provide a valid bitmap name for 'incremental' sync mode"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
|
|
|
|
{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be 'on-success' when using sync mode 'incremental'"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be 'on-success' when using sync mode 'incremental'"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Sync mode 'incremental' not supported"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be 'on-success' when using sync mode 'incremental'"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "incremental", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Sync mode 'incremental' not supported"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Bitmap sync mode must be 'on-success' when using sync mode 'incremental'"}}
|
|
|
|
|
|
|
|
-- Sync mode bitmap tests --
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "bitmap", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Must provide a valid bitmap name for 'bitmap' sync mode"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "bitmap", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Must provide a valid bitmap name for 'bitmap' sync mode"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "bitmap", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Must provide a valid bitmap name for 'bitmap' sync mode"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "bitmap", "target": "mirror_target"}}
|
|
|
|
{"error": {"class": "GenericError", "desc": "Must provide a valid bitmap name for 'bitmap' sync mode"}}
|
|
|
|
@@ -2751,28 +2751,28 @@ qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
|
|
|
|
{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "sync mode 'full' is not compatible with bitmaps"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "sync mode 'full' is not compatible with bitmaps"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "sync mode 'full' is not compatible with bitmaps"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "full", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
-- Sync mode top tests --
|
|
|
|
|
|
|
|
@@ -2786,28 +2786,28 @@ qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
|
|
|
|
{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "sync mode 'full' is not compatible with bitmaps"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "sync mode 'full' is not compatible with bitmaps"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "sync mode 'full' is not compatible with bitmaps"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "top", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'full' not supported with bitmap."}}
|
|
|
|
|
|
|
|
-- Sync mode none tests --
|
|
|
|
|
|
|
|
@@ -2821,26 +2821,26 @@ qemu_img compare "TEST_DIR/PID-img" "TEST_DIR/PID-fmirror3" ==> Identical, OK!
|
|
|
|
{"error": {"class": "GenericError", "desc": "Cannot specify bitmap sync mode without a bitmap"}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'none' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'none' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "Dirty bitmap 'bitmap404' not found"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'none' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap404", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'none' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "on-success", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "sync mode 'none' is not compatible with bitmaps"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'none' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "always", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "sync mode 'none' is not compatible with bitmaps"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'none' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "bitmap-mode": "never", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "sync mode 'none' is not compatible with bitmaps"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'none' not supported with bitmap."}}
|
|
|
|
|
|
|
|
{"execute": "blockdev-mirror", "arguments": {"bitmap": "bitmap0", "device": "drive0", "filter-node-name": "mirror-top", "job-id": "api_job", "sync": "none", "target": "mirror_target"}}
|
|
|
|
-{"error": {"class": "GenericError", "desc": "bitmap-mode must be specified if a bitmap is provided"}}
|
|
|
|
+{"error": {"class": "GenericError", "desc": "Sync mode 'none' not supported with bitmap."}}
|
|
|
|
|