[libvirt] [PATCH 06/16] Process all pending I/O for a RPC client before checking EOF
Daniel Veillard
veillard at redhat.com
Thu Jul 19 08:23:39 UTC 2012
On Wed, Jul 18, 2012 at 05:32:27PM +0100, Daniel P. Berrange wrote:
> From: "Daniel P. Berrange" <berrange at redhat.com>
>
> In the socket event handler for the RPC client we must deal
> with read/write events, before checking for EOF, otherwise
> we might close the socket before we've read & acted upon the
> last RPC messages
>
> Signed-off-by: Daniel P. Berrange <berrange at redhat.com>
> ---
> src/rpc/virnetclient.c | 15 ++++++++-------
> 1 file changed, 8 insertions(+), 7 deletions(-)
>
> diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c
> index 326efb2..ec82da7 100644
> --- a/src/rpc/virnetclient.c
> +++ b/src/rpc/virnetclient.c
> @@ -1653,13 +1653,6 @@ void virNetClientIncomingEvent(virNetSocketPtr sock,
>
> VIR_DEBUG("Event fired %p %d", sock, events);
>
> - if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR)) {
> - VIR_DEBUG("%s : VIR_EVENT_HANDLE_HANGUP or "
> - "VIR_EVENT_HANDLE_ERROR encountered", __FUNCTION__);
> - virNetSocketRemoveIOCallback(sock);
> - goto eof;
> - }
> -
> if (events & VIR_EVENT_HANDLE_WRITABLE) {
> if (virNetClientIOHandleOutput(client) < 0) {
> virNetSocketRemoveIOCallback(sock);
> @@ -1674,6 +1667,13 @@ void virNetClientIncomingEvent(virNetSocketPtr sock,
> }
> }
>
> + if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR)) {
> + VIR_DEBUG("%s : VIR_EVENT_HANDLE_HANGUP or "
> + "VIR_EVENT_HANDLE_ERROR encountered", __FUNCTION__);
> + virNetSocketRemoveIOCallback(sock);
> + goto eof;
> + }
> +
> /* Remove completed calls or signal their threads. */
> virNetClientCallRemovePredicate(&client->waitDispatch,
> virNetClientIOEventLoopRemoveDone,
> @@ -1687,6 +1687,7 @@ done:
>
> eof:
> if (client->eofCb) {
> + VIR_DEBUG("EOF %p %d", sock, events);
> virNetClientEOFCallback eofCb = client->eofCb;
> void *eofOpaque = client->eofOpaque;
> virNetClientUnlock(client);
ACK, context depends on 3/16
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