On Mon, Jun 10, 2019 at 21:49:51 -0500, Eric Blake wrote:
On 6/7/19 2:08 AM, Peter Krempa wrote:
> On Thu, Jun 06, 2019 at 08:41:26 -0500, Eric Blake wrote:
>> On 6/6/19 7:48 AM, Peter Krempa wrote:
>>> On Wed, Jun 05, 2019 at 22:01:09 -0500, Eric Blake wrote:
>>>> The upcoming virDomainBackup() API needs to take advantage of various
>>>> qcow2 bitmap manipulations as the basis to virDomainCheckpoints and
>>>> incremental backups. Add four functions to expose
>>>> block-dirty-bitmap-{add,enable,disable,merge} (this is the
>>>> recently-added QEMU_CAPS_BITMAP_MERGE capability).
>>>>
>>>> Signed-off-by: Eric Blake <eblake(a)redhat.com>
>>>> ---
>>>> src/qemu/qemu_monitor.h | 19 ++++++
>>>> src/qemu/qemu_monitor_json.h | 17 +++++
>>>> src/qemu/qemu_monitor.c | 51 +++++++++++++++
>>>> src/qemu/qemu_monitor_json.c | 119 +++++++++++++++++++++++++++++++++++
>>>> 4 files changed, 206 insertions(+)
>>>
>>> I'd suggest you add GEN_TEST_FUNC/DO_TEST_GEN tests for those. It's
>>> simple to add and gives you checking of the arguments against the QAPI
>>> schema for free.
>>
>> Will do. Do you need to see the amended patch with that added, or should
>> I go ahead and push once I have it working?
>
> ACK if you add those with all the fields excercised.
Here's what I'm squashing in. The MergeBitmaps test depends on my
cleanup to use TestNewSchema everywhere. Also, I noticed that if we
wanted to use VIR_AUTOPTR(qemuMonitorTest) it might make a lot of the
file easier to read, but that should be a separate patch (including fixing:
qemumonitorjsontest.c:1431:5: error: cleanup argument not a function
VIR_AUTOPTR(qemuMonitorTest) test = NULL;
As I've pointed out in the RFC patch you've sent, adding the automatic
freeing function is a good idea, but refactoring old code does seem to
be a waste of time.
You certainly can use the new format in the code you are adding though.
^~~~~~~~~~~
)
diff --git i/tests/qemumonitorjsontest.c w/tests/qemumonitorjsontest.c
index 2e7e976e9b..c07d8bf548 100644
--- i/tests/qemumonitorjsontest.c
+++ w/tests/qemumonitorjsontest.c
@@ -1375,6 +1375,9 @@ GEN_TEST_FUNC(qemuMonitorJSONBlockdevTrayOpen,
"foodev", true)
GEN_TEST_FUNC(qemuMonitorJSONBlockdevTrayClose, "foodev")
GEN_TEST_FUNC(qemuMonitorJSONBlockdevMediumRemove, "foodev")
GEN_TEST_FUNC(qemuMonitorJSONBlockdevMediumInsert, "foodev",
"newnode")
+GEN_TEST_FUNC(qemuMonitorJSONAddBitmap, "node", "bitmap", true)
+GEN_TEST_FUNC(qemuMonitorJSONEnableBitmap, "node", "bitmap")
+GEN_TEST_FUNC(qemuMonitorJSONDeleteBitmap, "node", "bitmap")
static int
testQemuMonitorJSONqemuMonitorJSONNBDServerStart(const void *opaque)
@@ -1419,6 +1422,44 @@
testQemuMonitorJSONqemuMonitorJSONNBDServerStart(const void *opaque)
return ret;
}
+static int
+testQemuMonitorJSONqemuMonitorJSONMergeBitmaps(const void *opaque)
+{
+ const testGenericData *data = opaque;
+ virDomainXMLOptionPtr xmlopt = data->xmlopt;
+ qemuMonitorTestPtr test = qemuMonitorTestNewSchema(xmlopt,
data->schema);
+ int ret = -1;
+ VIR_AUTOPTR(virJSONValue) arr = NULL;
+
+
+ if (!test)
+ return -1;
+
+ if (!(arr = virJSONValueNewArray()))
+ goto cleanup;
+
+ if (virJSONValueArrayAppendString(arr, "b1") < 0 ||
+ virJSONValueArrayAppendString(arr, "b2") < 0)
+ goto cleanup;
+
+ if (qemuMonitorTestAddItem(test, "block-dirty-bitmap-merge",
+ "{\"return\":{}}") < 0)
+ goto cleanup;
+
+ if (qemuMonitorJSONMergeBitmaps(qemuMonitorTestGetMonitor(test),
+ "node", "dst", &arr) <
0)
+ goto cleanup;
+
+ if (arr)
+ goto cleanup;
+
+ ret = 0;
+
+ cleanup:
+ qemuMonitorTestFree(test);
+ return ret;
+}
+
static bool
testQemuMonitorJSONqemuMonitorJSONQueryCPUsEqual(struct
qemuMonitorQueryCpusEntry *a,
struct
qemuMonitorQueryCpusEntry *b)
@@ -3109,6 +3150,9 @@ mymain(void)
DO_TEST_GEN(qemuMonitorJSONBlockdevTrayClose);
DO_TEST_GEN(qemuMonitorJSONBlockdevMediumRemove);
DO_TEST_GEN(qemuMonitorJSONBlockdevMediumInsert);
+ DO_TEST_GEN(qemuMonitorJSONAddBitmap);
+ DO_TEST_GEN(qemuMonitorJSONEnableBitmap);
+ DO_TEST_GEN(qemuMonitorJSONDeleteBitmap);
DO_TEST(qemuMonitorJSONGetBalloonInfo);
DO_TEST(qemuMonitorJSONGetBlockInfo);
DO_TEST(qemuMonitorJSONGetAllBlockStatsInfo);
@@ -3125,6 +3169,7 @@ mymain(void)
DO_TEST(qemuMonitorJSONSendKeyHoldtime);
DO_TEST(qemuMonitorSupportsActiveCommit);
DO_TEST(qemuMonitorJSONNBDServerStart);
+ DO_TEST(qemuMonitorJSONMergeBitmaps);
DO_TEST_CPU_DATA("host");
DO_TEST_CPU_DATA("full");
ACK to the squash-in regardless of if you decide to use AUTOPTR for the
test monitor in testQemuMonitorJSONqemuMonitorJSONMergeBitmaps.