在 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(a)redhat.com
>
https://www.redhat.com/mailman/listinfo/libvir-list