提交 720bee30 编写于 作者: J Jiri Denemark

rpc: Fix client crash on connection close

A multi-threaded client with event loop may crash if one of its threads
closes a connection while event loop is in the middle of sending
keep-alive message (either request or response). The right place for it
is inside virNetClientIOEventLoop() between poll() and
virNetClientLock(). We should only close a connection directly if no-one
is using it and defer the closing to the last user otherwise. So far we
only did so if the close was initiated by keep-alive timeout.
上级 57e677a7
...@@ -108,8 +108,6 @@ struct _virNetClient { ...@@ -108,8 +108,6 @@ struct _virNetClient {
}; };
static void virNetClientRequestClose(virNetClientPtr client);
static void virNetClientLock(virNetClientPtr client) static void virNetClientLock(virNetClientPtr client)
{ {
virMutexLock(&client->lock); virMutexLock(&client->lock);
...@@ -253,7 +251,7 @@ virNetClientKeepAliveStart(virNetClientPtr client, ...@@ -253,7 +251,7 @@ virNetClientKeepAliveStart(virNetClientPtr client,
static void static void
virNetClientKeepAliveDeadCB(void *opaque) virNetClientKeepAliveDeadCB(void *opaque)
{ {
virNetClientRequestClose(opaque); virNetClientClose(opaque);
} }
static int static int
...@@ -512,19 +510,11 @@ virNetClientCloseLocked(virNetClientPtr client) ...@@ -512,19 +510,11 @@ virNetClientCloseLocked(virNetClientPtr client)
void virNetClientClose(virNetClientPtr client) void virNetClientClose(virNetClientPtr client)
{ {
VIR_DEBUG("client=%p", client);
if (!client) if (!client)
return; return;
virNetClientLock(client);
virNetClientCloseLocked(client);
virNetClientUnlock(client);
}
static void
virNetClientRequestClose(virNetClientPtr client)
{
VIR_DEBUG("client=%p", client);
virNetClientLock(client); virNetClientLock(client);
/* If there is a thread polling for data on the socket, set wantClose flag /* If there is a thread polling for data on the socket, set wantClose flag
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册