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(a)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(a)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 :|