From: Kevin Wolf <kwolf@redhat.com>
To: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Cc: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>,
"qemu-devel@nongnu.org" <qemu-devel@nongnu.org>,
"qemu-block@nongnu.org" <qemu-block@nongnu.org>,
"armbru@redhat.com" <armbru@redhat.com>,
"mreitz@redhat.com" <mreitz@redhat.com>,
"eblake@redhat.com" <eblake@redhat.com>,
Denis Lunev <den@virtuozzo.com>
Subject: Re: [Qemu-devel] [PATCH v9 1/2] qemu-img info lists bitmap directory entries
Date: Tue, 29 Jan 2019 14:17:40 +0100 [thread overview]
Message-ID: <20190129131740.GF4467@dhcp-200-176.str.redhat.com> (raw)
In-Reply-To: <829cb522-05bf-57cc-b81e-4c028eea6821@virtuozzo.com>
Am 29.01.2019 um 13:50 hat Vladimir Sementsov-Ogievskiy geschrieben:
> 29.01.2019 15:38, Kevin Wolf wrote:
> > Am 29.01.2019 um 13:04 hat Andrey Shinkevich geschrieben:
> >>>>
> >>>> diff --git a/block/qapi.c b/block/qapi.c
> >>>> index c66f949..0fde98c 100644
> >>>> --- a/block/qapi.c
> >>>> +++ b/block/qapi.c
> >>>> @@ -38,6 +38,7 @@
> >>>> #include "qapi/qmp/qstring.h"
> >>>> #include "sysemu/block-backend.h"
> >>>> #include "qemu/cutils.h"
> >>>> +#include "qemu/error-report.h"
> >>>>
> >>>> BlockDeviceInfo *bdrv_block_device_info(BlockBackend *blk,
> >>>> BlockDriverState *bs, Error **errp)
> >>>> @@ -868,6 +869,11 @@ void bdrv_image_info_dump(fprintf_function func_fprintf, void *f,
> >>>>
> >>>> if (info->has_format_specific) {
> >>>> func_fprintf(f, "Format specific information:\n");
> >>>> + if (info->format_specific &&
> >>>> + info->format_specific->type == IMAGE_INFO_SPECIFIC_KIND_QCOW2 &&
> >>>> + info->format_specific->u.qcow2.data->has_bitmaps == false) {
> >>>> + warn_report("Failed to load bitmap list");
> >>>> + }
> >>>> bdrv_image_info_specific_dump(func_fprintf, f, info->format_specific);
> >>>> }
> >>>> }
> >>>
> >>> Is it really necessary to introduce qcow2 specific knowledge in
> >>> block/qapi.c (where it definitely doesn't belong), just to emit a
> >>> warning?
> >>>
> >>> Why can't you print the warning in qcow2_get_specific_info()?
> >>
> >> Dear Kevin,
> >> The reason behind the idea to move the warning to qapi is that we
> >> wouldn't like to print that in case of JSON format.
> >>
> >>>
> >>>> diff --git a/block/qcow2.c b/block/qcow2.c
> >>>> index 4897aba..07b99ee 100644
> >>>> --- a/block/qcow2.c
> >>>> +++ b/block/qcow2.c
> >>>> @@ -4386,8 +4386,14 @@ static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs)
> >>>> *spec_info->u.qcow2.data = (ImageInfoSpecificQCow2){
> >>>> .compat = g_strdup("0.10"),
> >>>> .refcount_bits = s->refcount_bits,
> >>>> + .has_bitmaps = true, /* To handle error check properly */
> >>>> + .bitmaps = NULL, /* Unsupported for version 2 */
> >>>
> >>> .has_bitmaps = false would be nicer if the format doesn't even support
> >>> bitmaps. You only need this here because you put the warning in the
> >>> wrong place.
> >>>
> >>>> };
> >>>> } else if (s->qcow_version == 3) {
> >>>> + Qcow2BitmapInfoList *bitmaps;
> >>>> + Error *local_err = NULL;
> >>>> +
> >>>> + bitmaps = qcow2_get_bitmap_info_list(bs, &local_err);
> >>>
> >>> Here you even had a good error message to print...
> >>>
> >>>> *spec_info->u.qcow2.data = (ImageInfoSpecificQCow2){
> >>>> .compat = g_strdup("1.1"),
> >>>> .lazy_refcounts = s->compatible_features &
> >>>> @@ -4397,7 +4403,14 @@ static ImageInfoSpecific *qcow2_get_specific_info(BlockDriverState *bs)
> >>>> QCOW2_INCOMPAT_CORRUPT,
> >>>> .has_corrupt = true,
> >>>> .refcount_bits = s->refcount_bits,
> >>>> + .has_bitmaps = !local_err,
> >>>> + .bitmaps = bitmaps,
> >>>> };
> >>>> + /*
> >>>> + * If an error occurs in obtaining bitmaps, ignore
> >>>> + * it to show other QCOW2 specific information.
> >>>> + */
> >>>> + error_free(local_err);
> >>>
> >>> ...but you decided to discard it.
> >>>
> >>> How about you do this here:
> >>>
> >>> warn_reportf_err(local_err, "Failed to load bitmap list: ");
> >>
> >> In case of JSON format, we can fail here.
> >> It will happen in the current implementation of the new test #239.
> >
> > Why do you want to silently leave out the bitmap list for JSON output?
> >
> > Essentially, this is the same question I asked here:
> >
> >>> And then get rid of the code in block/qapi.c and the version 2 path?
> >>>
> >>> Actually, should this really only be a warning, or in fact an error?
> >>> What's the case where we expect that loading the bitmap list can fail,
> >>> but the management tool doesn't need to know that and we just want to
> >>> log a message?
> >
> > I don't understand why it's okay not to print bitmaps without making it
> > an error. Do you have a specific use case in mind for this behaviour?
> >
>
>
> We just can't print anything here, as this code is executed from qmp command.
>
> It was discussed, that we don't want to fail the whole query, if failed to
> obtain bitmaps.
It's obvious that you don't want to fail the query command, but I
haven't found any explanation for _why_ you want this.
The thing that is closest to an explanation is "it may be sad to fail
get any information because of repeating some disk/qcow2 error", written
by you in the v4 thread.
I don't think "may be sad" is a good justification for non-standard
behaviour. If we can't load the bitmaps, the image is broken. And if the
image is broken, the rest of the information may be invalid, too.
> So, to show, that there were error during bitmaps querying
> we decided to use the following semantics:
>
> empty list (has_bitmaps=true) means that there no bitmaps, and there were
> no errors during bitmaps quering (if it was)
>
> absence of the field (has_bitmaps=false) means that there _were_ errors during
> bitmaps querying.
...or that you're running an old QEMU version. I'm not sure if making
old QEMU versions and image errors look the same is a good move.
Almost worse than making the QAPI interface confusing, however, is that
we throw away the real error message without giving it to the user.
> So qapi user, as well as json-output user should follow this semantics in
> understanding the output. And as well as for qapi, it's incorrect to add text
> messages to json output.
>
> On the other hand, it seems reasonable to put additional notice for human-format
> user.
Even for QMP, a log message on stderr is better than nothing.
Kevin
next prev parent reply other threads:[~2019-01-29 13:17 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-01-28 20:01 [Qemu-devel] [PATCH v9 0/2] qemu-img info lists bitmap directory entries Andrey Shinkevich
2019-01-28 20:01 ` [Qemu-devel] [PATCH v9 1/2] " Andrey Shinkevich
2019-01-28 20:43 ` Eric Blake
2019-01-30 17:55 ` Andrey Shinkevich
2019-01-29 9:52 ` Kevin Wolf
2019-01-29 12:04 ` Andrey Shinkevich
2019-01-29 12:38 ` Kevin Wolf
2019-01-29 12:50 ` Vladimir Sementsov-Ogievskiy
2019-01-29 12:57 ` Vladimir Sementsov-Ogievskiy
2019-01-29 13:17 ` Kevin Wolf [this message]
2019-01-29 14:06 ` Vladimir Sementsov-Ogievskiy
2019-01-29 14:23 ` Kevin Wolf
2019-01-29 14:35 ` Vladimir Sementsov-Ogievskiy
2019-01-29 15:29 ` Vladimir Sementsov-Ogievskiy
2019-01-29 15:49 ` Kevin Wolf
2019-01-30 17:55 ` Andrey Shinkevich
2019-01-28 20:01 ` [Qemu-devel] [PATCH v9 2/2] qemu-img info: bitmaps extension new test 239 Andrey Shinkevich
2019-01-29 9:53 ` Kevin Wolf
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=20190129131740.GF4467@dhcp-200-176.str.redhat.com \
--to=kwolf@redhat.com \
--cc=andrey.shinkevich@virtuozzo.com \
--cc=armbru@redhat.com \
--cc=den@virtuozzo.com \
--cc=eblake@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@virtuozzo.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).