[libvirt] [PATCH v4 2/2] remote: Move the call to remoteClientFreePrivateCallbacks from FreeFunc to CloseFunc
xinhua.Cao
caoxinhua at huawei.com
Tue Nov 14 02:06:47 UTC 2017
在 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 at redhat.com
>> https://www.redhat.com/mailman/listinfo/libvir-list
More information about the libvir-list
mailing list