[libvirt] [PATCH 2/4] Try harder to send RPC error message back to client
Daniel Veillard
veillard at redhat.com
Tue Aug 17 15:38:31 UTC 2010
On Tue, Aug 17, 2010 at 11:16:33AM -0400, Daniel P. Berrange wrote:
> When failing to serialize the normal RPC reply, try harder to
> send a error message back to the client, instead of immediately
> closing the connection.
>
> * daemon/dispatch.c: Improve error messages when RPC reply
> can not be sent
> ---
> daemon/dispatch.c | 47 +++++++++++++++++++++++++++++------------------
> 1 files changed, 29 insertions(+), 18 deletions(-)
>
> diff --git a/daemon/dispatch.c b/daemon/dispatch.c
> index d6c2eb1..22eef36 100644
> --- a/daemon/dispatch.c
> +++ b/daemon/dispatch.c
> @@ -548,7 +548,8 @@ remoteDispatchClientCall (struct qemud_server *server,
>
> if (remoteEncodeClientMessageHeader(msg) < 0) {
> xdr_free (data->ret_filter, (char*)&ret);
> - goto fatal_error;
> + remoteDispatchFormatError(&rerr, "%s", _("failed to serialize reply header"));
> + goto xdr_hdr_error;
> }
>
>
> @@ -558,22 +559,30 @@ remoteDispatchClientCall (struct qemud_server *server,
> msg->bufferLength,
> XDR_ENCODE);
>
> - if (xdr_setpos(&xdr, msg->bufferOffset) == 0)
> - goto xdr_error;
> + if (xdr_setpos(&xdr, msg->bufferOffset) == 0) {
> + remoteDispatchFormatError(&rerr, "%s", _("failed to change XDR reply offset"));
> + goto xdr_error;
> + }
>
> /* If OK, serialise return structure, if error serialise error. */
> /* Serialise reply data */
> - if (!((data->ret_filter) (&xdr, &ret)))
> + if (!((data->ret_filter) (&xdr, &ret))) {
> + remoteDispatchFormatError(&rerr, "%s", _("failed to serialize reply payload (probable message size limit)"));
> goto xdr_error;
> + }
>
> /* Update the length word. */
> msg->bufferOffset += xdr_getpos (&xdr);
> len = msg->bufferOffset;
> - if (xdr_setpos (&xdr, 0) == 0)
> + if (xdr_setpos (&xdr, 0) == 0) {
> + remoteDispatchFormatError(&rerr, "%s", _("failed to change XDR reply offset"));
> goto xdr_error;
> + }
>
> - if (!xdr_u_int (&xdr, &len))
> + if (!xdr_u_int (&xdr, &len)) {
> + remoteDispatchFormatError(&rerr, "%s", _("failed to update reply length header"));
> goto xdr_error;
> + }
>
> xdr_destroy (&xdr);
> xdr_free (data->ret_filter, (char*)&ret);
> @@ -588,25 +597,27 @@ remoteDispatchClientCall (struct qemud_server *server,
>
> return 0;
>
> +xdr_error:
> + /* Bad stuff serializing reply. Try to send a little info
> + * back to client to assist in bug reporting/diagnosis */
> + xdr_free (data->ret_filter, (char*)&ret);
> + xdr_destroy (&xdr);
> + /* fallthrough */
> +
> +xdr_hdr_error:
> + VIR_WARN("Failed to serialize reply for program '%d' proc '%d' as XDR",
> + msg->hdr.prog, msg->hdr.proc);
> + /* fallthrough */
> +
> rpc_error:
> - /* Semi-bad stuff happened, we can still try to send back
> - * an RPC error message to client */
> + /* Bad stuff (de-)serializing message, but we have an
> + * RPC error message we can send back to the client */
> rv = remoteSerializeReplyError(client, &rerr, &msg->hdr);
>
> if (rv >= 0)
> VIR_FREE(msg);
>
> return rv;
> -
> -xdr_error:
> - /* Seriously bad stuff happened, so we'll kill off this client
> - and not send back any RPC error */
> - xdr_free (data->ret_filter, (char*)&ret);
> - xdr_destroy (&xdr);
> -fatal_error:
> - VIR_WARN("Failed to serialize reply for program '%d' proc '%d' as XDR",
> - msg->hdr.prog, msg->hdr.proc);
> - return -1;
> }
ACK,
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list