提交 b536e193 编写于 作者: D Daniel P. Berrange

Process all pending I/O for a RPC client before checking EOF

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: NDaniel P. Berrange <berrange@redhat.com>
上级 0998cdae
......@@ -1694,16 +1694,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__);
virNetClientMarkClose(client,
(events & VIR_EVENT_HANDLE_HANGUP) ?
VIR_CONNECT_CLOSE_REASON_EOF :
VIR_CONNECT_CLOSE_REASON_ERROR);
goto done;
}
if (events & VIR_EVENT_HANDLE_WRITABLE) {
if (virNetClientIOHandleOutput(client) < 0)
virNetClientMarkClose(client, VIR_CONNECT_CLOSE_REASON_ERROR);
......@@ -1714,6 +1704,16 @@ void virNetClientIncomingEvent(virNetSocketPtr sock,
virNetClientMarkClose(client, VIR_CONNECT_CLOSE_REASON_ERROR);
}
if (events & (VIR_EVENT_HANDLE_HANGUP | VIR_EVENT_HANDLE_ERROR)) {
VIR_DEBUG("VIR_EVENT_HANDLE_HANGUP or "
"VIR_EVENT_HANDLE_ERROR encountered");
virNetClientMarkClose(client,
(events & VIR_EVENT_HANDLE_HANGUP) ?
VIR_CONNECT_CLOSE_REASON_EOF :
VIR_CONNECT_CLOSE_REASON_ERROR);
goto done;
}
/* Remove completed calls or signal their threads. */
virNetClientCallRemovePredicate(&client->waitDispatch,
virNetClientIOEventLoopRemoveDone,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册