From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
To: Stefan Hajnoczi <stefanha@gmail.com>
Cc: kwolf@redhat.com, aliguori@us.ibm.com, quintela@redhat.com,
qemu-devel@nongnu.org, lcapitulino@redhat.com,
pbonzini@redhat.com, dietmar@proxmox.com
Subject: Re: [Qemu-devel] [PATCH V2 07/10] snapshot: qmp use new internal API for external snapshot transaction
Date: Mon, 14 Jan 2013 10:56:30 +0800 [thread overview]
Message-ID: <50F373DE.4060709@linux.vnet.ibm.com> (raw)
In-Reply-To: <20130111091253.GA31400@stefanha-thinkpad.muc.redhat.com>
于 2013-1-11 17:12, Stefan Hajnoczi 写道:
> On Fri, Jan 11, 2013 at 02:22:28PM +0800, Wenchao Xia wrote:
>> 于 2013-1-10 20:41, Stefan Hajnoczi 写道:
>>> On Thu, Jan 10, 2013 at 11:21:22AM +0800, Wenchao Xia wrote:
>>>> 于 2013-1-9 20:44, Stefan Hajnoczi 写道:
>>>>> On Mon, Jan 07, 2013 at 03:28:06PM +0800, Wenchao Xia wrote:
>>>>>> This patch switch to internal common API to take group external
>>>>>> snapshots from qmp_transaction interface. qmp layer simply does
>>>>>> a translation from user input.
>>>>>>
>>>>>> Signed-off-by: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
>>>>>> ---
>>>>>> blockdev.c | 215 ++++++++++++++++++++++++------------------------------------
>>>>>> 1 files changed, 87 insertions(+), 128 deletions(-)
>>>>>
>>>>> An internal API for snapshots is not necessary. qmp_transaction() is
>>>>> already usable both from the monitor and C code.
>>>>>
>>>>> The QAPI code generator creates structs that can be accessed directly
>>>> >from C. qmp_transaction(), BlockdevAction, and BlockdevActionList *is*
>>>>> the snapshot API. It just doesn't support internal snapshots yet, which
>>>>> is what you are trying to add.
>>>>>
>>>>> To add internal snapshot support, define a BlockdevInternalSnapshot type
>>>>> in qapi-schema.json and add internal snapshot support in
>>>>> qmp_transaction().
>>>>>
>>>>> qmp_transaction() was designed with this in mind from the beginning and
>>>>> dispatches based on BlockdevAction->kind.
>>>>>
>>>>> The patch series will become much smaller while still adding internal
>>>>> snapshot support.
>>>>>
>>>>> Stefan
>>>>>
>>>>
>>>> As API, qmp_transaction have following disadvantages:
>>>> 1) interface is based on string not data type inside qemu, that means
>>>> other function calling it result in: bdrv->string->bdrv
>>>
>>> Use bdrv_get_device_name(). You already need to fill in filename or
>>> snapshot name strings. This is not a big disadvantage.
>>>
>> Yes, not a big disadvantage, but why not save string operation but
>> use (bdrv*) as much as possible?
>>
>> what happens will be:
>>
>> hmp-snapshot
>> |
>> qmp-snapshot
>> |---------
>> |
>> qmp-transaction savevm(may be other..)
>> |----------------------|
>> |
>> internal transaction layer
>
> Saving the string operation is not worth duplicating the API.
>
I agree with you for this line:), but, it is a weight on the balance
of choice, pls consider it together with issues below.
>>>> 2) all capability are forced to be exposed.
>>>
>>> Is there something you cannot expose?
>>>
>> As other component in qemu can use it, some option may
>> be used only in qemu not to user. For eg, vm-state-size.
>
> When we hit a limitation of QAPI then it needs to be extended. I'm sure
> there's a solution for splitting or hiding parts of the QAPI generated
> API.
>
I can't think it out now, it seems to be a bit tricky.
>>>> 3) need structure to record each transaction state, such as
>>>> BlkTransactionStates. Extending it is equal to add an internal layer.
>>>
>>> I agree that extending it is equal coding effort to adding an internal
>>> layer because you'll need to refactor qmp_transaction() a bit to really
>>> support additional action types.
>>>
>>> But it's the right thing to do. Don't add unnecessary layers just
>>> because writing new code is more fun than extending existing code.
>>>
>> If this layer is not added but depending only qmp_transaction, there
>> will be many "if else" fragment. I have tried that and the code
>> is awkful, this layer did not bring extra burden only make what
>> happens inside qmp_transaction clearer, I did not add this layer just
>> for fun.
>>
>>
>>>> Actually I started up by use qmp_transaction as API, but soon
>>>> found that work is almost done around BlkTransactionStates, so
>>>> added a layer around it clearly.
>
> The qmp_transaction() implementation can be changed, I'm not saying you
> have to hack in more if statements. It's cleanest to introduce a
> BdrvActionOps abstraction:
>
> typedef struct BdrvActionOps BdrvActionOps;
> typedef struct BdrvTransactionState {
> const BdrvActionOps *ops;
> QLIST_ENTRY(BdrvTransactionState);
> } BdrvTransactionState;
>
> struct BdrvActionOps {
> int (*prepare)(BdrvTransactionState *s, ...);
> int (*commit)(BdrvTransactionState *s, ...);
> int (*rollback)(BdrvTransactionState *s, ...);
> };
>
> BdrvTransactionState *bdrv_transaction_create(BlockdevAction *action);
>
> Then qmp_transaction() can be generic code that steps through the
> transactions.
With internal API, qmp_transaction can still be generic code with
a translate from bdrv* to char* at caller level.
This is similar to what your series does and I think it's
> the right direction.
>
> But please don't duplicate the qmp_transaction() and
> BlockdevAction/BlockdevActionList APIs. In other words, change the
> engine, not the whole car.
>
> Stefan
>
If my understanding is correct, the BdrvActionOps need to be extended
as following:
struct BdrvActionOps {
/* need following for callback functions */
const char *sn_name;
BlockDriverState *bs;
...
int (*prepare)(BdrvTransactionState *s, ...);
int (*commit)(BdrvTransactionState *s, ...);
int (*rollback)(BdrvTransactionState *s, ...);
};
Or an opaque* should used for every BdrvActionOps.
Comparation:
The way above:
1) translate from BlockdevAction to BdrvTransactionState by
bdrv_transaction_create().
2) enqueue BdrvTransactionState by
some code.
3) execute them by
a new function, name it as BdrvActionOpsRun().
Internal API way:
1) translate BlockdevAction to BlkTransStates by
fill_blk_trs().
2) enqueue BlkTransStates to BlkTransStates by
add_transaction().
3) execute them by
submit_transaction().
It seems the way above will end as something like an internal
layer, but without clear APIs tips what it is doing. Please reconsider
the advantages about a clear internal API layer.
--
Best Regards
Wenchao Xia
next prev parent reply other threads:[~2013-01-14 2:57 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-01-07 7:27 [Qemu-devel] [PATCH V2 00/10] snapshot: take block snapshots in unified way Wenchao Xia
2013-01-07 7:27 ` [Qemu-devel] [PATCH V2 01/10] block: export function bdrv_find_snapshot() Wenchao Xia
2013-01-07 7:28 ` [Qemu-devel] [PATCH V2 02/10] block: add function deappend() Wenchao Xia
2013-01-07 7:28 ` [Qemu-devel] [PATCH V2 03/10] error: add function error_set_check() Wenchao Xia
2013-01-07 7:28 ` [Qemu-devel] [PATCH V2 04/10] oslib-win32: add lock for time functions Wenchao Xia
2013-01-07 17:12 ` Stefan Weil
2013-01-08 2:27 ` Wenchao Xia
2013-01-07 7:28 ` Wenchao Xia
2013-01-07 7:28 ` [Qemu-devel] [PATCH V2 05/10] snapshot: design of internal common API to take snapshots Wenchao Xia
2013-01-07 7:28 ` [Qemu-devel] [PATCH V2 06/10] snapshot: implemention " Wenchao Xia
2013-01-07 7:28 ` [Qemu-devel] [PATCH V2 07/10] snapshot: qmp use new internal API for external snapshot transaction Wenchao Xia
2013-01-09 12:44 ` Stefan Hajnoczi
2013-01-10 3:21 ` Wenchao Xia
2013-01-10 12:41 ` Stefan Hajnoczi
2013-01-11 6:22 ` Wenchao Xia
2013-01-11 9:12 ` Stefan Hajnoczi
2013-01-14 2:56 ` Wenchao Xia [this message]
2013-01-14 10:06 ` Stefan Hajnoczi
2013-01-15 7:03 ` Wenchao Xia
2013-03-12 8:30 ` Wenchao Xia
2013-03-12 15:43 ` Stefan Hajnoczi
2013-03-13 1:36 ` Wenchao Xia
2013-03-13 8:42 ` Stefan Hajnoczi
2013-03-13 10:18 ` Kevin Wolf
2013-03-14 5:08 ` Wenchao Xia
2013-03-14 8:22 ` Kevin Wolf
2013-03-18 10:00 ` Wenchao Xia
2013-01-07 7:28 ` [Qemu-devel] [PATCH V2 08/10] snapshot: qmp add internal snapshot transaction interface Wenchao Xia
2013-01-07 7:28 ` [Qemu-devel] [PATCH V2 09/10] snapshot: qmp add blockdev-snapshot-internal-sync interface Wenchao Xia
2013-01-07 7:28 ` [Qemu-devel] [PATCH V2 10/10] snapshot: hmp add internal snapshot support for block device Wenchao Xia
2013-01-09 22:34 ` [Qemu-devel] [PATCH V2 00/10] snapshot: take block snapshots in unified way Eric Blake
2013-01-10 6:01 ` Wenchao Xia
2013-01-11 13:56 ` Luiz Capitulino
2013-01-14 2:09 ` Wenchao Xia
2013-01-14 10:08 ` Stefan Hajnoczi
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=50F373DE.4060709@linux.vnet.ibm.com \
--to=xiawenc@linux.vnet.ibm.com \
--cc=aliguori@us.ibm.com \
--cc=dietmar@proxmox.com \
--cc=kwolf@redhat.com \
--cc=lcapitulino@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=stefanha@gmail.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 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.