[libvirt] [PATCH] qemu: support nospace reason in io error event

Michal Privoznik mprivozn at redhat.com
Fri Oct 3 16:26:25 UTC 2014


On 03.10.2014 17:03, Eric Blake wrote:
> 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: Eric Blake <eblake at redhat.com>
> ---
>   include/libvirt/libvirt.h.in |  6 ++++++
>   src/qemu/qemu_monitor_json.c | 16 ++++++----------
>   2 files changed, 12 insertions(+), 10 deletions(-)
>
> diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
> index c9018c0..c910b31 100644
> --- a/include/libvirt/libvirt.h.in
> +++ b/include/libvirt/libvirt.h.in
> @@ -4884,6 +4884,12 @@ typedef void (*virConnectDomainEventIOErrorCallback)(virConnectPtr conn,
>    * The callback signature to use when registering for an event of type
>    * 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,
>                                                              virDomainPtr dom,
> diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
> index 90a125f..6504d15 100644
> --- a/src/qemu/qemu_monitor_json.c
> +++ b/src/qemu/qemu_monitor_json.c
> @@ -739,11 +739,13 @@ VIR_ENUM_IMPL(qemuMonitorIOErrorAction, VIR_DOMAIN_EVENT_IO_ERROR_LAST,
>                 "ignore", "stop", "report");
>
>
> -static void qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr data)
> +static void
> +qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr data)
>   {
>       const char *device;
>       const char *action;
> -    const char *reason;
> +    const char *reason = "";
> +    bool nospc = false;
>       int actionID;
>
>       /* Throughout here we try our best to carry on upon errors,
> @@ -759,14 +761,8 @@ static void qemuMonitorJSONHandleIOError(qemuMonitorPtr mon, virJSONValuePtr dat
>           VIR_WARN("missing device in disk io error event");
>       }
>
> -#if 0
> -    if ((reason = virJSONValueObjectGetString(data, "reason")) == NULL) {
> -        VIR_WARN("missing reason in disk io error event");
> -        reason = "";
> -    }
> -#else
> -    reason = "";
> -#endif
> +    if (virJSONValueObjectGetBoolean(data, "nospace", &nospc) == 0 && nospc)
> +        reason = "enospc";
>
>       if ((actionID = qemuMonitorIOErrorActionTypeFromString(action)) < 0) {
>           VIR_WARN("unknown disk io error action '%s'", action);
>

ACK

Michal




More information about the libvir-list mailing list