[libvirt] [PATCH 04/20] Remove upfront check for hmp - just try it cope with failure
Daniel P. Berrange
berrange at redhat.com
Thu Sep 13 12:45:23 UTC 2012
On Tue, Sep 11, 2012 at 05:59:06PM -0600, Eric Blake wrote:
> On 09/11/2012 08:11 AM, Daniel P. Berrange wrote:
> > From: "Daniel P. Berrange" <berrange at redhat.com>
> >
> > Don't bother checking for the existance of the HMP passthrough
> > command. Just try to execute it, and propagate the failure.
>
> And these days, there's very few remaining HMP passthrough commands to
> worry about (meanwhile, there's some libvirt patches to write to pick up
> commands that no longer require HMP passthrough, such as send-key).
>
> >
> > Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> > ---
> > src/qemu/qemu_monitor.c | 20 +---------------
> > src/qemu/qemu_monitor_json.c | 56 +++++++++++++++-----------------------------
> > src/qemu/qemu_monitor_json.h | 3 +--
> > 3 files changed, 21 insertions(+), 58 deletions(-)
>
> Much simpler. However,
>
> > int
> > -qemuMonitorCheckHMP(qemuMonitorPtr mon, const char *cmd)
> > -{
> > - if (!mon->json || mon->json_hmp)
> > - return 1;
> > -
> > - if (cmd) {
> > - VIR_DEBUG("HMP passthrough not supported by qemu process;"
> > - " not trying HMP for command %s", cmd);
>
> The old code used VIR_DEBUG,
>
> > +++ b/src/qemu/qemu_monitor_json.c
> > @@ -909,6 +909,13 @@ qemuMonitorJSONHumanCommandWithFd(qemuMonitorPtr mon,
> > if (!cmd || qemuMonitorJSONCommandWithFd(mon, cmd, scm_fd, &reply) < 0)
> > goto cleanup;
> >
> > + if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
> > + virReportError(VIR_ERR_INTERNAL_ERROR,
> > + _("Human monitor command is not available to run %s"),
> > + cmd_str);
>
> and the new code turns it into a hard error. I think that's a correct
> conversion, but the wrong choice of error code (see below [1]).
There's no actual change in semantics in general since although
qemuMonitorCheckHMP() would VIR_DEBUG, the callers would then
raise an actual error.
>
> > @@ -3112,14 +3114,8 @@ int qemuMonitorJSONDriveDel(qemuMonitorPtr mon,
> > goto cleanup;
> >
> > if (qemuMonitorJSONHasError(reply, "CommandNotFound")) {
> > - if (qemuMonitorCheckHMP(mon, "drive_del")) {
> > - VIR_DEBUG("drive_del command not found, trying HMP");
> > - ret = qemuMonitorTextDriveDel(mon, drivestr);
> > - } else {
> > - VIR_ERROR(_("deleting disk is not supported. "
> > - "This may leak data if disk is reassigned"));
> > - ret = 1;
> > - }
> > + VIR_DEBUG("drive_del command not found, trying HMP");
> > + ret = qemuMonitorTextDriveDel(mon, drivestr);
>
> Another subtle case of semantic changes. The old code did a fallback
> (by setting ret = 1), the new code now flat-out fails, and skips
> attempting the fallback. This time, I'm not so sure the change in
> semantics is correct.
This is a genuine bug - I'll fix this. We can make qemuMonitorJSONHumanCommandWithFd
return -2 on CommandNotFound, and propagate this all the way back to the callers.
>
> > @@ -3341,12 +3333,6 @@ int qemuMonitorJSONArbitraryCommand(qemuMonitorPtr mon,
> > int ret = -1;
> >
> > if (hmp) {
> > - if (!qemuMonitorCheckHMP(mon, NULL)) {
> > - virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> > - _("HMP passthrough is not supported by qemu"
> > - " process; only QMP commands can be used"));
> > - return -1;
> > - }
>
> [1] here, we are going from a nice VIR_ERR_CONFIG_UNSUPPORTED to a
> not-so-nice VIR_ERR_INTERNAL_ERROR.
Arguably that error code is wrong already - CONFIG_UNSUPPORTED is for
things you specify in the XML which are not supported. It isn't for
API calls really.
I should change it to OPERATION_UNSUPPORTED instad of INTERNAL_ERROR
though.
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list