From 07b39a9418a884bf8313959289906293430ed27f Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Fri, 15 Jul 2011 11:19:40 +0100 Subject: [PATCH] Unregister event callback if a fatal error occurs during dispatch If we get an I/O error in the async event callback for an RPC client, we might not have consumed all pending data off the wire. This could result in the callback being immediately invoked again. At which point the same I/O might occur. And we're invoked again. And again...And again... Unregistering the async event callback if an error occurs is a good safety net. The real error will be seen when the next RPC method is invoked * src/rpc/virnetclient.c: Unregister event callback on error --- src/rpc/virnetclient.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/rpc/virnetclient.c b/src/rpc/virnetclient.c index d3965c6d66..9eaecfcbee 100644 --- a/src/rpc/virnetclient.c +++ b/src/rpc/virnetclient.c @@ -1117,8 +1117,10 @@ void virNetClientIncomingEvent(virNetSocketPtr sock, goto done; } - if (virNetClientIOHandleInput(client) < 0) - VIR_DEBUG("Something went wrong during async message processing"); + if (virNetClientIOHandleInput(client) < 0) { + VIR_WARN("Something went wrong during async message processing"); + virNetSocketRemoveIOCallback(sock); + } done: virNetClientUnlock(client);