diff options
author | Markus Armbruster <armbru@redhat.com> | 2018-07-03 10:53:30 +0200 |
---|---|---|
committer | Markus Armbruster <armbru@redhat.com> | 2018-07-03 23:09:49 +0200 |
commit | d621cfe0a177978b17711a712293221294430f53 (patch) | |
tree | 214068b47bd8d4abf2f16a073aa2a085cdcada7b | |
parent | 71696cc66ce74a645e68844340e9fb5cfd598cc2 (diff) | |
download | qemu-d621cfe0a177978b17711a712293221294430f53.zip qemu-d621cfe0a177978b17711a712293221294430f53.tar.gz qemu-d621cfe0a177978b17711a712293221294430f53.tar.bz2 |
qmp: Document COMMAND_DROPPED design flaw
Events are broadcast to all monitors. If another monitor's client has
a command with the same ID in flight, the event will incorrectly claim
that command was dropped. This must be fixed before out-of-band
execution can graduate from "experimental".
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20180703085358.13941-5-armbru@redhat.com>
-rw-r--r-- | monitor.c | 6 | ||||
-rw-r--r-- | qapi/misc.json | 3 |
2 files changed, 9 insertions, 0 deletions
@@ -4331,6 +4331,12 @@ static void handle_qmp_command(JSONMessageParser *parser, GQueue *tokens) /* Drop the request if queue is full. */ if (mon->qmp.qmp_requests->length >= QMP_REQ_QUEUE_LEN_MAX) { qemu_mutex_unlock(&mon->qmp.qmp_queue_lock); + /* + * FIXME @id's scope is just @mon, and broadcasting it is + * wrong. If another monitor's client has a command with + * the same ID in flight, the event will incorrectly claim + * that command was dropped. + */ qapi_event_send_command_dropped(id, COMMAND_DROP_REASON_QUEUE_FULL, &error_abort); diff --git a/qapi/misc.json b/qapi/misc.json index 0446c3e..74cd97f 100644 --- a/qapi/misc.json +++ b/qapi/misc.json @@ -3454,6 +3454,9 @@ # only be dropped when the oob capability is enabled. # # @id: The dropped command's "id" field. +# FIXME Broken by design. Events are broadcast to all monitors. If +# another monitor's client has a command with the same ID in flight, +# the event will incorrectly claim that command was dropped. # # @reason: The reason why the command is dropped. # |