qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Wenchao Xia <xiawenc@linux.vnet.ibm.com>
To: Stefan Hajnoczi <stefanha@gmail.com>
Cc: kwolf@redhat.com, pbonzini@redhat.com, aliguori@us.ibm.com,
	qemu-devel@nongnu.org, blauwirbel@gmail.com
Subject: Re: [Qemu-devel] [PATCH 6/6] snapshot: human monitor interface
Date: Sat, 05 Jan 2013 16:36:03 +0800	[thread overview]
Message-ID: <50E7E5F3.8030209@linux.vnet.ibm.com> (raw)
In-Reply-To: <20130104154447.GC6310@stefanha-thinkpad.hitronhub.home>

 > On Mon, Dec 17, 2012 at 02:25:09PM +0800, Wenchao Xia wrote:
>> @@ -983,17 +983,22 @@ ETEXI
>>
>>       {
>>           .name       = "snapshot_blkdev",
>> -        .args_type  = "reuse:-n,device:B,snapshot-file:s?,format:s?",
>> -        .params     = "[-n] device [new-image-file] [format]",
>> -        .help       = "initiates a live snapshot\n\t\t\t"
>> -                      "of device. If a new image file is specified, the\n\t\t\t"
>> -                      "new image file will become the new root image.\n\t\t\t"
>> -                      "If format is specified, the snapshot file will\n\t\t\t"
>> -                      "be created in that format. Otherwise the\n\t\t\t"
>> -                      "snapshot will be internal! (currently unsupported).\n\t\t\t"
>> -                      "The default format is qcow2.  The -n flag requests QEMU\n\t\t\t"
>> -                      "to reuse the image found in new-image-file, instead of\n\t\t\t"
>> -                      "recreating it from scratch.",
>> +        .args_type  = "internal:-i,reuse:-n,device:B,snapshot-file:s?,format:s?",
>> +        .params     = "[-i] [-n] device [new-image-file] [format]",
>
> Please rename snapshot-file and new-image-file because it is now either
> the external snapshot filename or the internal snapshot name - it's not
> always a file!
>
   OK.

>> +        .help       = "initiates a live snapshot of device.\n\t\t\t"
>> +                      "  The -i flag requests QEMU to create internal snapshot\n\t\t\t"
>> +                      "instead of external one.\n\t\t\t"
>> +                      "  The -n flag requests QEMU to use existing snapshot\n\t\t\t"
>> +                      "instead of creating new snapshot, which would fails if\n\t\t\t"
>> +                      "snapshot does not exist ahead.\n\t\t\t"
>
> "which fails if the snapshot does not exist already"
>
   Will use this, thanks.

>> +                      "  new-image-file is the snapshot's name, in external case\n\t\t\t"
>> +                      "it is the new image's name which will become the new root\n\t\t\t"
>> +                      "image and must be specified, in internal case it is the\n\t\t\t"
>> +                      "record's name and if not specified QEMU will create\n\t\t\t"
>> +                      "internal snapshot with name generated according to time.\n\t\t\t"
>> +                      "  format is only valid in external case, which is the new\n\t\t\t"
>> +                      "snapshot image's format. If not sepcified default format\n\t\t\t"
>> +                      "qcow2 will be used.",
>
> "If not specified, the default format is qcow2."
>
>>           .mhandler.cmd = hmp_snapshot_blkdev,
>>       },
>>
>> @@ -1004,6 +1009,25 @@ Snapshot device, using snapshot file as target if provided
>>   ETEXI
>>
>>       {
>> +        .name       = "snapshot_delete_blkdev",
>
> Internal snapshots can already be deleted with delvm but there is no
> existing command for external snapshots.
>
>> +        .args_type  = "internal:-i,device:B,snapshot-file:s",
>> +        .params     = "[-i] device new-image-file",
>> +        .help       = "delete a snapshot  synchronous.\n\t\t\t"
>
> "synchronous" is implied for HMP commands, they are all like this so I
> don't think it's necessary to mention it.
>
>> +                      "  The -i flag requests QEMU to delete internal snapshot\n\t\t\t"
>> +                      "instead of external one.\n\t\t\t"
>> +                      "  new-image-file is the snapshot's name, in external case\n\t\t\t"
>> +                      "it is the image's name which is not supported now.\n\t\t\t"
>
> I'm not sure how useful this interface is.  If we have no implementation
> for deleting external snapshots and libvirt already uses delvm, then I'd
> prefer you drop this command from the patch series.
>
> Later on, when there is code to implement external snapshot deletion it
> can be added.  Then there is no risk that this command design doesn't
> work and we have to change it again.  (Remember libvirt already uses
> delvm so adding snapshot_delete_blkdev without external snapshot
> deletion just adds code churn.)
>
   OK, this interface will be dropped to make things simpler.

>> @@ -1486,8 +1510,8 @@ ETEXI
>>
>>       {
>>           .name       = "info",
>> -        .args_type  = "item:s?",
>> -        .params     = "[subcommand]",
>> +        .args_type  = "item:s?,params:s?",
>> +        .params     = "[subcommand] [params]",
>>           .help       = "show various information about the system state",
>>           .mhandler.cmd = do_info,
>>       },
>
> What does this change do?
>
   Pls ignore this, another serial was sent which extend hmp info
infra first.

>> diff --git a/hmp.c b/hmp.c
>> index 180ba2b..f247f51 100644
>> --- a/hmp.c
>> +++ b/hmp.c
>> @@ -806,20 +806,40 @@ void hmp_snapshot_blkdev(Monitor *mon, const QDict *qdict)
>>       const char *filename = qdict_get_try_str(qdict, "snapshot-file");
>>       const char *format = qdict_get_try_str(qdict, "format");
>>       int reuse = qdict_get_try_bool(qdict, "reuse", 0);
>> +    int internal = qdict_get_try_bool(qdict, "internal", 0);
>>       enum NewImageMode mode;
>> +    enum SnapshotType type;
>>       Error *errp = NULL;
>>
>> -    if (!filename) {
>> -        /* In the future, if 'snapshot-file' is not specified, the snapshot
>> -           will be taken internally. Today it's actually required. */
>> +    if ((!internal) && (!filename)) {
>> +        /* in external case filename must be set, should we generate
>> +         it automatically? */
>
> Picking a filename would mainly be useful to humans.  libvirt and other
> management tools will want full control anyway.  So the question is: is
> there a naming policy that will be useful to most human users?
>
> If yes, please implement it.  If no, please drop this comment.
>
   It will be dropped.

>> diff --git a/monitor.c b/monitor.c
>> index c0e32d6..81de470 100644
>> --- a/monitor.c
>> +++ b/monitor.c
>> @@ -124,11 +124,14 @@ typedef struct mon_cmd_t {
>>       void (*user_print)(Monitor *mon, const QObject *data);
>>       union {
>>           void (*info)(Monitor *mon);
>> +        void (*info_qdict)(Monitor *mon, const QDict *qdict);
>>           void (*cmd)(Monitor *mon, const QDict *qdict);
>> -        int  (*cmd_new)(Monitor *mon, const QDict *params, QObject **ret_data);
>> +        int  (*cmd_new)(Monitor *mon, const QDict *params,
>> +                        QObject **ret_data);
>>           int  (*cmd_async)(Monitor *mon, const QDict *params,
>>                             MonitorCompletion *cb, void *opaque);
>>       } mhandler;
>> +    int info_cmd_need_qdict;
>>       int flags;
>
> The union discriminator is the flags field (e.g.  MONITOR_CMD_ASYNC).
> Please follow that style.
>
> (If you use a boolean variable, please use the bool type instead of
> int.)
>
   There would be another way to extend hmp info command.

>>   } mon_cmd_t;
>>
>> @@ -824,7 +827,11 @@ static void do_info(Monitor *mon, const QDict *qdict)
>>           goto help;
>>       }
>>
>> -    cmd->mhandler.info(mon);
>> +    if (cmd->info_cmd_need_qdict) {
>> +        cmd->mhandler.info_qdict(mon, qdict);
>> +    } else {
>> +        cmd->mhandler.info(mon);
>> +    }
>>       return;
>>
>>   help:
>
> The generic monitor changes need to go in a separate commit.
>
>> @@ -2605,10 +2612,12 @@ static mon_cmd_t info_cmds[] = {
>>       },
>>       {
>>           .name       = "snapshots",
>> -        .args_type  = "",
>> -        .params     = "",
>> -        .help       = "show the currently saved VM snapshots",
>> -        .mhandler.info = do_info_snapshots,
>> +        .args_type  = "device:B?",
>> +        .params     = "[device]",
>> +        .help       = "show the currently saved VM snapshots or snapshots on "
>> +                      "a single device.",
>> +        .mhandler.info_qdict = do_info_snapshots,
>> +        .info_cmd_need_qdict = 1,
>>       },
>>       {
>>           .name       = "status",
>
> This change to the info snapshots command needs to go in a separate
> commit.
>
   It will go to hmp serial.

>> diff --git a/savevm.c b/savevm.c
>> index c027529..5982aa9 100644
>> --- a/savevm.c
>> +++ b/savevm.c
>> @@ -2336,7 +2336,7 @@ void do_delvm(Monitor *mon, const QDict *qdict)
>>       }
>>   }
>>
>> -void do_info_snapshots(Monitor *mon)
>> +static void do_info_snapshots_vm(Monitor *mon)
>>   {
>>       BlockDriverState *bs, *bs1;
>>       QEMUSnapshotInfo *sn_tab, *sn, s, *sn_info = &s;
>> @@ -2400,6 +2400,59 @@ void do_info_snapshots(Monitor *mon)
>>
>>   }
>>
>> +static void do_info_snapshots_blk(Monitor *mon, const char *device)
>> +{
>> +    BlockDriverState *bs;
>> +    QEMUSnapshotInfo *sn_tab, *sn;
>> +    int nb_sns, i;
>> +    char buf[256];
>> +
>> +    /* find the target bs */
>> +    bs = bdrv_find(device);
>> +    if (!bs) {
>> +        monitor_printf(mon, "Device '%s' not found.\n", device);
>> +        return ;
>> +    }
>> +
>> +    if (!bdrv_can_snapshot(bs)) {
>> +        monitor_printf(mon, "Device '%s' can't have snapshot.\n", device);
>> +        return ;
>> +    }
>> +
>> +    nb_sns = bdrv_snapshot_list(bs, &sn_tab);
>> +    if (nb_sns < 0) {
>> +        monitor_printf(mon, "Device %s bdrv_snapshot_list: error %d\n",
>> +                       device, nb_sns);
>> +        return;
>> +    }
>> +
>> +    if (nb_sns == 0) {
>> +        monitor_printf(mon, "There is no snapshot available.\n");
>> +        return;
>> +    }
>> +
>> +    monitor_printf(mon, "Device %s:\n", device);
>> +    monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), NULL));
>> +    for (i = 0; i < nb_sns; i++) {
>> +        sn = &sn_tab[i];
>> +        monitor_printf(mon, "%s\n", bdrv_snapshot_dump(buf, sizeof(buf), sn));
>> +    }
>> +    g_free(sn_tab);
>> +    return;
>> +}
>
> Return at the end of a void function is not necessary and QEMU code
> doesn't use it.  Please use QEMU style.
>
   OK.

> Stefan
>


-- 
Best Regards

Wenchao Xia

      reply	other threads:[~2013-01-05  8:36 UTC|newest]

Thread overview: 47+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-12-17  6:25 [Qemu-devel] [PATCH 0/6] snapshot: take snapshots in unified way Wenchao Xia
2012-12-17  6:25 ` [Qemu-devel] [PATCH 1/6] snapshot: export function in block.c Wenchao Xia
2012-12-21 18:13   ` Juan Quintela
2012-12-25  4:31     ` Wenchao Xia
2013-01-04 14:49   ` Stefan Hajnoczi
2013-01-05  8:26     ` Wenchao Xia
2013-01-07 16:43   ` Kevin Wolf
2013-01-08  2:25     ` Wenchao Xia
2013-01-08 10:37       ` Kevin Wolf
2013-01-09  4:32         ` Wenchao Xia
2012-12-17  6:25 ` [Qemu-devel] [PATCH 2/6] snapshot: add error set function Wenchao Xia
2012-12-20 21:36   ` Eric Blake
2012-12-21  2:37     ` Wenchao Xia
2013-01-04 14:55   ` Stefan Hajnoczi
2013-01-05  8:27     ` Wenchao Xia
2012-12-17  6:25 ` [Qemu-devel] [PATCH 3/6] snapshot: design of common API to take snapshots Wenchao Xia
2012-12-21 18:48   ` Eric Blake
2012-12-25  5:25     ` Wenchao Xia
2012-12-21 18:49   ` Juan Quintela
2012-12-25  5:24     ` Wenchao Xia
2012-12-17  6:25 ` [Qemu-devel] [PATCH 4/6] snapshot: implemention " Wenchao Xia
2012-12-17  6:36   ` Dietmar Maurer
2012-12-17  7:38     ` Wenchao Xia
2012-12-17  7:52       ` Dietmar Maurer
2012-12-17  8:52         ` Wenchao Xia
2012-12-17  9:58           ` Dietmar Maurer
2012-12-20 22:19             ` Eric Blake
2012-12-21  3:01               ` Wenchao Xia
2012-12-21  6:20                 ` Dietmar Maurer
2013-01-04 16:13                   ` Stefan Hajnoczi
2012-12-17 10:32           ` Dietmar Maurer
2012-12-18 10:29             ` Wenchao Xia
2012-12-18 10:36               ` Dietmar Maurer
2012-12-19  3:34                 ` Wenchao Xia
2012-12-19  4:55                   ` Dietmar Maurer
2012-12-19  5:37                     ` Wenchao Xia
2012-12-21 18:48   ` Juan Quintela
2012-12-25  5:16     ` Wenchao Xia
2012-12-17  6:25 ` [Qemu-devel] [PATCH 5/6] snapshot: qmp interface Wenchao Xia
2013-01-02 14:52   ` Eric Blake
2013-01-04  6:02     ` Wenchao Xia
2013-01-04 13:57       ` Eric Blake
2013-01-04 16:22   ` Stefan Hajnoczi
2013-01-05  8:38     ` Wenchao Xia
2012-12-17  6:25 ` [Qemu-devel] [PATCH 6/6] snapshot: human monitor interface Wenchao Xia
2013-01-04 15:44   ` Stefan Hajnoczi
2013-01-05  8:36     ` Wenchao Xia [this message]

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=50E7E5F3.8030209@linux.vnet.ibm.com \
    --to=xiawenc@linux.vnet.ibm.com \
    --cc=aliguori@us.ibm.com \
    --cc=blauwirbel@gmail.com \
    --cc=kwolf@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --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 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).