提交 e9392e48 编写于 作者: E Eric Blake

qemu: support nospace reason in io error event

Aeons ago (commit 34dcbbb4, v0.8.2), we added a new libvirt event
(VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON) in order to tell the user WHY
the guest halted.  This is because at least VDSM wants to react
differently to ENOSPC events (resize the lvm partition to be larger,
and resume the guest as if nothing had happened) from all other events
(I/O is hosed, throw up our hands and flag things as broken).  At the
time this was done, downstream RHEL qemu added a vendor extension
'__com.redhat_reason', which would be exactly one of these strings:
"enospc", "eperm", "eio", and "eother".  In our stupidity, we exposed
those exact strings to clients, rather than an enum, and we also
return "" if we did not have access to a reason (which was the case
for upstream qemu).

Fast forward to now: upstream qemu commit c7c2ff0c (will be qemu 2.2)
FINALLY adds a 'nospace' boolean, after discussion with multiple
projects determined that VDSM really doesn't care about distinction
between any other error types.  So this patch converts 'nospace' into
the string "enospc" for compatibility with RHEL clients that were
already used to the downstream extension, while leaving the reason
blank for all other cases (no change from the status quo).

See also https://bugzilla.redhat.com/show_bug.cgi?id=1119784

* src/qemu/qemu_monitor_json.c (qewmuMonitorJSONHandleIOError):
Parse reason field from modern qemu.
* include/libvirt/libvirt.h.in
(virConnectDomainEventIOErrorReasonCallback): Document it.
Signed-off-by: NEric Blake <eblake@redhat.com>
上级 445a09bd
...@@ -4884,6 +4884,12 @@ typedef void (*virConnectDomainEventIOErrorCallback)(virConnectPtr conn, ...@@ -4884,6 +4884,12 @@ typedef void (*virConnectDomainEventIOErrorCallback)(virConnectPtr conn,
* The callback signature to use when registering for an event of type * The callback signature to use when registering for an event of type
* VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON with virConnectDomainEventRegisterAny() * VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON with virConnectDomainEventRegisterAny()
* *
* If the I/O error is known to be caused by an ENOSPC condition in
* the host (where resizing the disk to be larger will allow the guest
* to be resumed as if nothing happened), @reason will be "enospc".
* Otherwise, @reason will be "", although future strings may be added
* if determination of other error types becomes possible.
*
*/ */
typedef void (*virConnectDomainEventIOErrorReasonCallback)(virConnectPtr conn, typedef void (*virConnectDomainEventIOErrorReasonCallback)(virConnectPtr conn,
virDomainPtr dom, virDomainPtr dom,
......
...@@ -739,11 +739,13 @@ VIR_ENUM_IMPL(qemuMonitorIOErrorAction, VIR_DOMAIN_EVENT_IO_ERROR_LAST, ...@@ -739,11 +739,13 @@ VIR_ENUM_IMPL(qemuMonitorIOErrorAction, VIR_DOMAIN_EVENT_IO_ERROR_LAST,
"ignore", "stop", "report"); "ignore", "stop", "report");
static void qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr data) static void
qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr data)
{ {
const char *device; const char *device;
const char *action; const char *action;
const char *reason; const char *reason = "";
bool nospc = false;
int actionID; int actionID;
/* Throughout here we try our best to carry on upon errors, /* Throughout here we try our best to carry on upon errors,
...@@ -759,14 +761,8 @@ static void qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr dat ...@@ -759,14 +761,8 @@ static void qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr dat
VIR_WARN("missing device in disk io error event"); VIR_WARN("missing device in disk io error event");
} }
#if 0 if (virJSONValueObjectGetBoolean(data, "nospace", &nospc) == 0 && nospc)
if ((reason = virJSONValueObjectGetString(data, "reason")) == NULL) { reason = "enospc";
VIR_WARN("missing reason in disk io error event");
reason = "";
}
#else
reason = "";
#endif
if ((actionID = qemuMonitorIOErrorActionTypeFromString(action)) < 0) { if ((actionID = qemuMonitorIOErrorActionTypeFromString(action)) < 0) {
VIR_WARN("unknown disk io error action '%s'", action); VIR_WARN("unknown disk io error action '%s'", action);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册