[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-block] [PATCH v2 3/6] nbd: Allow bitmap export during QMP nbd-
From: |
Nikolay Shirokovskiy |
Subject: |
Re: [Qemu-block] [PATCH v2 3/6] nbd: Allow bitmap export during QMP nbd-server-add |
Date: |
Thu, 10 Jan 2019 15:11:21 +0000 |
On 10.01.2019 15:02, Vladimir Sementsov-Ogievskiy wrote:
> cc Nikolay
>
> 10.01.2019 10:13, Eric Blake wrote:
>> With the experimental x-nbd-server-add-bitmap command, there was
>> a window of time where an NBD client could see the export but not
>> the associated dirty bitmap, which can cause a client that planned
>> on using the dirty bitmap to be forced to treat the entire image
>> as dirty as a safety fallback. Furthermore, if the QMP client
>> successfully exports a disk but then fails to add the bitmap, it
>> has to take on the burden of removing the export. Since we don't
>> allow changing the exposed dirty bitmap (whether to a different
>> bitmap, or removing advertisement of the bitmap), it is nicer to
>> make the bitmap tied to the export at the time the export is
>> created, with automatic failure to export if the bitmap is not
>> available.
>>
>> The experimental command included an optional 'bitmap-export-name'
>> field for remapping the name exposed over NBD to be different from
>> the bitmap name stored on disk.
>
>
> Nikolay, do you have comments on this?
>
>
> However, my libvirt demo code
>> for implementing differential backups on top of persistent bitmaps
>> did not need to take advantage of that feature (it is instead
>> possible to create a new temporary bitmap with the desired name,
>> use block-dirty-bitmap-merge to merge one or more persistent
>> bitmaps into the temporary, then associate the temporary with the
>> NBD export, if control is needed over the exported bitmap name).
With bitmap-export-name we can use shorter bitmap names in NBD export.
For example it can be just UUID of corresponding snapshot. With merge
strategy this should be at least export-$UUID because $UUID is already
used for bitmaps created during snapshots.
Nikolay
>> Hence, I'm not copying that part of the experiment over to the
>> stable addition. For more details on the libvirt demo, see
>> https://www.redhat.com/archives/libvir-list/2018-October/msg01254.html,
>> https://kvmforum2018.sched.com/event/FzuB/facilitating-incremental-backup-eric-blake-red-hat
>>
>> This patch focuses on the user interface, and reduces (but does
>> not completely eliminate) the window where an NBD client can see
>> the export but not the dirty bitmap. Later patches will add
>> further cleanups now that this interface is declared stable via a
>> single QMP command, including removing the race window.
>>
>> Update test 223 to use the new interface, including a demonstration
>> that it is now easier to handle failures.
>>
>> Signed-off-by: Eric Blake <address@hidden>
>> ---
>> qapi/block.json | 7 ++++++-
>> blockdev-nbd.c | 12 +++++++++++-
>> hmp.c | 5 +++--
>> tests/qemu-iotests/223 | 17 ++++++-----------
>> tests/qemu-iotests/223.out | 5 +----
>> 5 files changed, 27 insertions(+), 19 deletions(-)
>>
>> diff --git a/qapi/block.json b/qapi/block.json
>> index 11f01f28efe..3d70420f763 100644
>> --- a/qapi/block.json
>> +++ b/qapi/block.json
>> @@ -246,6 +246,10 @@
>> #
>> # @writable: Whether clients should be able to write to the device via the
>> # NBD connection (default false).
>> +
>> +# @bitmap: Also export the dirty bitmap reachable from @device, so the
>> +# NBD client can use NBD_OPT_SET_META_CONTEXT with
>> +# "qemu:dirty-bitmap:NAME" to inspect the bitmap. (since 4.0)
>> #
>> # Returns: error if the server is not running, or export with the same name
>> # already exists.
>> @@ -253,7 +257,8 @@
>> # Since: 1.3.0
>> ##
>> { 'command': 'nbd-server-add',
>> - 'data': {'device': 'str', '*name': 'str', '*writable': 'bool'} }
>> + 'data': {'device': 'str', '*name': 'str', '*writable': 'bool',
>> + '*bitmap': 'str' } }
>>
>> ##
>> # @NbdServerRemoveMode:
>> diff --git a/blockdev-nbd.c b/blockdev-nbd.c
>> index f5edbc27d88..ac7e993c35f 100644
>> --- a/blockdev-nbd.c
>> +++ b/blockdev-nbd.c
>> @@ -140,7 +140,8 @@ void qmp_nbd_server_start(SocketAddressLegacy *addr,
>> }
>>
>> void qmp_nbd_server_add(const char *device, bool has_name, const char
>> *name,
>> - bool has_writable, bool writable, Error **errp)
>> + bool has_writable, bool writable,
>> + bool has_bitmap, const char *bitmap, Error **errp)
>> {
>> BlockDriverState *bs = NULL;
>> BlockBackend *on_eject_blk;
>> @@ -185,6 +186,15 @@ void qmp_nbd_server_add(const char *device, bool
>> has_name, const char *name,
>> * our only way of accessing it is through nbd_export_find(), so we
>> can drop
>> * the strong reference that is @exp. */
>> nbd_export_put(exp);
>> +
>> + if (has_bitmap) {
>> + Error *err = NULL;
>> + nbd_export_bitmap(exp, bitmap, bitmap, &err);
>> + if (err) {
>> + error_propagate(errp, err);
>> + nbd_export_remove(exp, NBD_SERVER_REMOVE_MODE_HARD, NULL);
>> + }
>> + }
>> }
>>
>> void qmp_nbd_server_remove(const char *name,
>> diff --git a/hmp.c b/hmp.c
>> index 80aa5ab504b..8da5fd8760a 100644
>> --- a/hmp.c
>> +++ b/hmp.c
>> @@ -2326,7 +2326,7 @@ void hmp_nbd_server_start(Monitor *mon, const QDict
>> *qdict)
>> }
>>
>> qmp_nbd_server_add(info->value->device, false, NULL,
>> - true, writable, &local_err);
>> + true, writable, false, NULL, &local_err);
>>
>> if (local_err != NULL) {
>> qmp_nbd_server_stop(NULL);
>> @@ -2347,7 +2347,8 @@ void hmp_nbd_server_add(Monitor *mon, const QDict
>> *qdict)
>> bool writable = qdict_get_try_bool(qdict, "writable", false);
>> Error *local_err = NULL;
>>
>> - qmp_nbd_server_add(device, !!name, name, true, writable, &local_err);
>> + qmp_nbd_server_add(device, !!name, name, true, writable,
>> + false, NULL, &local_err);
>> hmp_handle_error(mon, &local_err);
>> }
>>
>> diff --git a/tests/qemu-iotests/223 b/tests/qemu-iotests/223
>> index f1fbb9bc1c6..1f6822f9489 100755
>> --- a/tests/qemu-iotests/223
>> +++ b/tests/qemu-iotests/223
>> @@ -120,21 +120,16 @@ _send_qemu_cmd $QEMU_HANDLE
>> '{"execute":"nbd-server-start",
>> "arguments":{"addr":{"type":"unix",
>> "data":{"path":"'"$TEST_DIR/nbd"'"}}}}' "return"
>> _send_qemu_cmd $QEMU_HANDLE '{"execute":"nbd-server-add",
>> - "arguments":{"device":"n"}}' "return"
>> + "arguments":{"device":"n", "bitmap":"b"}}' "return"
>> _send_qemu_cmd $QEMU_HANDLE '{"execute":"nbd-server-add",
>> "arguments":{"device":"n"}}' "error"
>> -_send_qemu_cmd $QEMU_HANDLE '{"execute":"x-nbd-server-add-bitmap",
>> - "arguments":{"name":"n", "bitmap":"b"}}' "return"
>> _send_qemu_cmd $QEMU_HANDLE '{"execute":"nbd-server-add",
>> - "arguments":{"device":"n", "name":"n2"}}' "return"
>> -_send_qemu_cmd $QEMU_HANDLE '{"execute":"x-nbd-server-add-bitmap",
>> - "arguments":{"name":"n2", "bitmap":"b2"}}' "error"
>> -_send_qemu_cmd $QEMU_HANDLE '{"execute":"nbd-server-remove",
>> - "arguments":{"name":"n2"}}' "return"
>> + "arguments":{"device":"n", "name":"n2", "bitmap":"b2"}}' "error"
>> _send_qemu_cmd $QEMU_HANDLE '{"execute":"nbd-server-add",
>> - "arguments":{"device":"n", "name":"n2", "writable":true}}' "return"
>> -_send_qemu_cmd $QEMU_HANDLE '{"execute":"x-nbd-server-add-bitmap",
>> - "arguments":{"name":"n2", "bitmap":"b2"}}' "return"
>> + "arguments":{"device":"n", "name":"n2", "bitmap":"b3"}}' "error"
>> +_send_qemu_cmd $QEMU_HANDLE '{"execute":"nbd-server-add",
>> + "arguments":{"device":"n", "name":"n2", "writable":true,
>> + "bitmap":"b2"}}' "return"
>>
>> echo
>> echo "=== Contrast normal status to large granularity dirty-bitmap ==="
>> diff --git a/tests/qemu-iotests/223.out b/tests/qemu-iotests/223.out
>> index 5ed2e322e19..7135bf59bb8 100644
>> --- a/tests/qemu-iotests/223.out
>> +++ b/tests/qemu-iotests/223.out
>> @@ -30,11 +30,8 @@ wrote 2097152/2097152 bytes at offset 2097152
>> {"return": {}}
>> {"return": {}}
>> {"error": {"class": "GenericError", "desc": "NBD server already has export
>> named 'n'"}}
>> -{"return": {}}
>> -{"return": {}}
>> {"error": {"class": "GenericError", "desc": "Enabled bitmap 'b2'
>> incompatible with readonly export"}}
>> -{"return": {}}
>> -{"return": {}}
>> +{"error": {"class": "GenericError", "desc": "Bitmap 'b3' is not found"}}
>> {"return": {}}
>>
>> === Contrast normal status to large granularity dirty-bitmap ===
>>
>
>
[Qemu-block] [PATCH v2 2/6] nbd: Merge nbd_export_set_name into nbd_export_new, Eric Blake, 2019/01/10