[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH v4 2/2] remote: Move the call to remoteClientFreePrivateCallbacks from FreeFunc to CloseFunc





在 2017/11/13 22:31, Martin Kletzander 写道:
On Mon, Nov 13, 2017 at 09:07:58PM +0800, xinhua.Cao wrote:
Still because of commit id 'fe8f1c8b' where we generate a REF for the
Register and that's transparent to the consumer (e.g. how would they
know they need to ensure that Deregister is called), thus the purpose of
this patch is to find a way to Deregister if it's determined that the
consumer hasn't by the time of the "last" REF we'd have.
This solution to this problem is to alter the processing to have the
remoteClientCloseFunc handle performing the Deregister calls instead of
the remoteClientFreeFunc because there's no way FreeFunc would be called
unless the Deregister was already called.

Oh, this would explain the missing bit that I was probably missing.  This patch looks like what I really wanted this to be handled as, but still, would you be able to sketch out a reproducer for the unlucky ones, like me? Thanks a lot.

I find this unlucky one by watch the growing of libvirt memory(top -b -d 30 -p $libvirtd_pid). the memory always grow up when I kill my client. so I watch the client refs then find this unlucky one.
---
daemon/remote.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/daemon/remote.c b/daemon/remote.c
index 2dcec1e..c2111ae 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -1738,11 +1738,9 @@ void remoteClientFreeFunc(void *data)
{
    struct daemonClientPrivate *priv = data;

-    /* Deregister event delivery callback */
-    if (priv->conn) {
-        remoteClientFreePrivateCallbacks(priv);
+    if (priv->conn)
        virConnectClose(priv->conn);
-    }
+
    VIR_FREE(priv);
}

@@ -1752,6 +1750,10 @@ static void remoteClientCloseFunc(virNetServerClientPtr client)     struct daemonClientPrivate *priv = virNetServerClientGetPrivateData(client);

    daemonRemoveAllClientStreams(priv->streams);
+
+    /* Deregister event delivery callback */
+    if (priv->conn)
+        remoteClientFreePrivateCallbacks(priv);
}


--
2.8.3


--
libvir-list mailing list
libvir-list redhat com
https://www.redhat.com/mailman/listinfo/libvir-list



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]