From: John Snow <jsnow@redhat.com>
To: Markus Armbruster <armbru@redhat.com>
Cc: kwolf@redhat.com, Fam Zheng <famz@redhat.com>,
Stefan Hajnoczi <stefanha@gmail.com>,
qemu-devel@nongnu.org, mreitz@redhat.com,
vsementsov@parallels.com, stefanha@redhat.com,
pbonzini@redhat.com
Subject: Re: [Qemu-devel] [PATCH v9 02/10] qmp: Add block-dirty-bitmap-add and block-dirty-bitmap-remove
Date: Wed, 17 Dec 2014 07:07:25 -0500 [thread overview]
Message-ID: <549171FD.9040606@redhat.com> (raw)
In-Reply-To: <87sighfgao.fsf@blackfin.pond.sub.org>
On 12/15/2014 03:50 AM, Markus Armbruster wrote:
> Stefan Hajnoczi <stefanha@gmail.com> writes:
>
>> On Wed, Dec 10, 2014 at 01:43:47PM +0100, Markus Armbruster wrote:
>>> Stefan Hajnoczi <stefanha@gmail.com> writes:
>>>
>>>> On Mon, Dec 01, 2014 at 03:30:08PM -0500, John Snow wrote:
>>>>> diff --git a/block.c b/block.c
>>>>> index e5c6ccf..3f27519 100644
>>>>> --- a/block.c
>>>>> +++ b/block.c
>>>>> @@ -5420,6 +5420,25 @@ int bdrv_get_dirty(BlockDriverState *bs, BdrvDirtyBitmap *bitmap, int64_t sector
>>>>> }
>>>>> }
>>>>>
>>>>> +#define BDB_MIN_DEF_GRANULARITY 4096
>>>>> +#define BDB_MAX_DEF_GRANULARITY 65536
>>>>> +#define BDB_DEFAULT_GRANULARITY BDB_MAX_DEF_GRANULARITY
>>>>> +
>>>>> +uint64_t bdrv_dbm_calc_def_granularity(BlockDriverState *bs)
>>>>
>>>> Long names are unwieldy but introducing multiple abbreviations is not a
>>>> good solution, it makes the code more confusing (BDB vs dbm).
>>>>
>>>> I would call the function bdrv_get_default_bitmap_granularity().
>>>>
>>>> The constants weren't necessary since the point of this function is to
>>>> capture the default value. No one else should use the constants -
>>>> otherwise there is a high probability that they are reimplementing this
>>>> logic. I would just leave them as literals in the code.
>>>>
>>>>> diff --git a/blockdev.c b/blockdev.c
>>>>> index 5651a8e..4d30b09 100644
>>>>> --- a/blockdev.c
>>>>> +++ b/blockdev.c
>>>>> @@ -1894,6 +1894,60 @@ void qmp_block_set_io_throttle(const char *device, int64_t bps, int64_t bps_rd,
>>>>> aio_context_release(aio_context);
>>>>> }
>>>>>
>>>>> +void qmp_block_dirty_bitmap_add(const char *device, const char *name,
>>>>> + bool has_granularity, int64_t granularity,
>>>>> + Error **errp)
>>>>> +{
>>>>> + BlockDriverState *bs;
>>>>> +
>>>>> + bs = bdrv_lookup_bs(device, NULL, errp);
>>>>
>>>> Markus: I think we need to support node-name here so dirty bitmaps can
>>>> be applied at any node in the graph?
>>>
>>> We need to consider node names for all new QMP commands. Whenever we
>>> add a backend name parameter, like we do for the two new commands in
>>> this patch, we need to decide whether nodes make sense, too. Do they?
>>>
>>> I'm afraid we haven't quite made up our mind what to do when nodes make
>>> sense.
>>>
>>> Existing patterns of backend / node name parameters:
>>>
>>> 1. Backend name only
>>>
>>> Parameter is commonly called @device. Examples: eject,
>>> block_set_io_throttle.
>>>
>>> Code uses blk_by_name() or bdrv_find(). The latter needs to be
>>> converted to the former.
>>>
>>> 2. Backend or node name
>>>
>>> 2a. Two optional parameters, commonly called @device and @node-name,
>>> of which exactly one must be given. Example: block_passwd.
>>>
>>> Code uses
>>>
>>> bs = bdrv_lookup_bs(has_device ? device : NULL,
>>> has_node_name ? node_name : NULL,
>>> &local_err);
>>>
>>> which is a roundabout way to say
>>>
>>> bs = bdrv_lookup_bs(device, node_name, &local_err);
>>>
>>> 2b. Single parameter. The single example is anonymous union
>>> BlockdevRef.
>>>
>>> Code uses
>>>
>>> bs = bdrv_lookup_bs(reference, reference, errp);
>>>
>>> If we want to adopt "single parameter" going forward, we need to
>>> decide on a naming convention. Existing commands are probably stuck
>>> with @device for compatibility. Do we care for names enough to
>>> improve on that?
>>>
>>> A convenience wrapper around bdrv_lookup_bs() to avoid stuttering
>>> name argument could make sense.
>>
>> Initially only the backend needs dirty bitmap support (this satisfies
>> the incremental backup use case).
>>
>> It is possible that future use cases will require node-name.
>>
>> I'm happy with just allowing the device parameter today and adding the
>> node-name parameter if needed later.
>>
>> This conservative approach seems good because IMO we shouldn't add
>> unused features to the API since they need to be tested and maintained
>> forever.
>>
>> So maybe use a device argument with blk_by_name() for now.
>>
>> In the future switch to bdrv_lookup_bs() with has_device/has_node_name.
>>
>> If anyone strongly feels we should support node-name from day 1, I'm
>> okay with that too but there needs to be a test case which actually
>> exercises that code!
>
> Agree with not adding unused features.
>
> However, we should make up our minds how we want QMP to do backend and
> node names in the future. I see two basic options:
>
> 1. Inertia
>
> Keep adding separate arguments for backend name (commonly called
> @device) and node name (commonly called @node-name). If the command
> can take only one, make it mandatory. If it can take either, make it
> either/or.
>
> Cements the inconsistency between single parameter in BlockdevRef and
> the two either/or parameters elsewhere.
>
> 2. Clean up the mess
>
> New commands take a single parameter. The command accepts backends
> or nodes as they make sense for the command. Acceptable parameter
> name needed.
>
> Either existing commands get changed to single parameter (with the
> necessary compatibility and discoverability gunk), or they get
> replaced by new commands.
>
> I'll analyze how the gunk could be done in a separate message,
> hopefully soon.
>
OK, given the most recent email, it seems as if you would prefer to use
"@device" for backends and "@node-name" for arbitrary node selection.
This command only needs to support the backend for now, I think.
Assuming we want to allow arbitrary nodes in the future, should I leave
the parameters as @device but rename the monitor commands to allow for
an arbitrary node version sometime later? I don't want to introduce a
new command that creates a new mess for us to clean up as we unify these
parameter semantics.
I said I'd use your mail as a guide but I hadn't skimmed it yet to see
how specific the prescriptions were ;)
next prev parent reply other threads:[~2014-12-17 12:07 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-12-01 20:30 [Qemu-devel] [PATCH v9 00/10] block: Incremental backup series John Snow
2014-12-01 20:30 ` [Qemu-devel] [PATCH v9 01/10] qapi: Add optional field "name" to block dirty bitmap John Snow
2014-12-01 20:38 ` Eric Blake
2014-12-01 20:30 ` [Qemu-devel] [PATCH v9 02/10] qmp: Add block-dirty-bitmap-add and block-dirty-bitmap-remove John Snow
2014-12-01 21:42 ` Eric Blake
2014-12-09 16:00 ` Stefan Hajnoczi
2014-12-10 12:43 ` Markus Armbruster
2014-12-12 10:53 ` Stefan Hajnoczi
2014-12-15 8:50 ` Markus Armbruster
2014-12-17 12:07 ` John Snow [this message]
2014-12-17 16:12 ` Markus Armbruster
2014-12-01 20:30 ` [Qemu-devel] [PATCH v9 03/10] block: Introduce bdrv_dirty_bitmap_granularity() John Snow
2014-12-09 16:10 ` Stefan Hajnoczi
2014-12-01 20:30 ` [Qemu-devel] [PATCH v9 04/10] hbitmap: Add hbitmap_copy John Snow
2014-12-09 17:19 ` Stefan Hajnoczi
2014-12-01 20:30 ` [Qemu-devel] [PATCH v9 05/10] block: Add bdrv_copy_dirty_bitmap and bdrv_reset_dirty_bitmap John Snow
2014-12-10 8:11 ` Vladimir Sementsov-Ogievskiy
2014-12-01 20:30 ` [Qemu-devel] [PATCH v9 06/10] qmp: Add block-dirty-bitmap-enable and block-dirty-bitmap-disable John Snow
2014-12-09 17:28 ` Stefan Hajnoczi
2014-12-01 20:30 ` [Qemu-devel] [PATCH v9 07/10] qmp: Add support of "dirty-bitmap" sync mode for drive-backup John Snow
2014-12-09 17:44 ` Stefan Hajnoczi
2014-12-10 1:34 ` Fam Zheng
2014-12-12 10:58 ` Stefan Hajnoczi
2014-12-01 20:30 ` [Qemu-devel] [PATCH v9 08/10] qapi: Add transaction support to block-dirty-bitmap-{add, enable, disable} John Snow
2014-12-09 17:45 ` Stefan Hajnoczi
2014-12-01 20:30 ` [Qemu-devel] [PATCH v9 09/10] qmp: Add dirty bitmap 'enabled' field in query-block John Snow
2014-12-01 20:30 ` [Qemu-devel] [PATCH v9 10/10] qemu-iotests: Add tests for drive-backup sync=dirty-bitmap John Snow
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=549171FD.9040606@redhat.com \
--to=jsnow@redhat.com \
--cc=armbru@redhat.com \
--cc=famz@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@gmail.com \
--cc=stefanha@redhat.com \
--cc=vsementsov@parallels.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).