[Freeipa-devel] [patch 0010] Python list comprehension leak breaking the test execution

Milan Kubík mkubik at redhat.com
Tue Aug 11 13:23:12 UTC 2015


On 08/11/2015 09:53 AM, Jan Cholasta wrote:
> On 11.8.2015 09:46, Milan Kubík wrote:
>> On 08/11/2015 09:08 AM, Jan Cholasta wrote:
>>> On 11.8.2015 09:00, Milan Kubík wrote:
>>>
>>>> On 08/10/2015 06:22 PM, Milan Kubík wrote:
>>>>
>>>>> On 08/10/2015 06:02 PM, Milan Kubík wrote:
>>>>>
>>>>>> On 08/10/2015 05:54 PM, Jan Cholasta wrote:
>>>>>>
>>>>>>> On 10.8.2015 17:43, Milan Kubík wrote:
>>>>>>>
>>>>>>>> Hi all,
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> this patch fixes problem described in the ticket [1]
>>>>>>>>
>>>>>>>> that caused the test run to fail completely at every other or so
>>>>>>>> run.
>>>>>>>>
>>>>>>>> I took the liberty to fix most of the pep8 issues while I was 
>>>>>>>> at it.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> Thanks to Jan Cholasta for help with identifying this one.
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> IMO this would be more robust:
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>     t = None
>>>>>>>
>>>>>>>     try:
>>>>>>>
>>>>>>>         ...
>>>>>>>
>>>>>>>     finally:
>>>>>>>
>>>>>>>         del t
>>>>>>>
>>>>>>>         nss.nss_shutdown()
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> By assigning a value to the variable at the beginning you make sure
>>>>>>>
>>>>>>> that the del statement will not fail.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Honza
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>> Thanks for the idea. It also removed the version check.
>>>>>>
>>>>>> Updated patch attached.
>>>>>>
>>>>>>
>>>>>>
>>>>>> Milan
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>> Self NACK.
>>>>>
>>>>>
>>>>>
>>>>> I have updated the fix for all of the leaks in that class. It 
>>>>> seems to
>>>>>
>>>>> corrupt the database even when no init/shutdown was called. Just not
>>>>>
>>>>> so often.
>>>>>
>>>>>
>>>>>
>>>>> Milan
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>> NACK again. The problem is the reference counting. Even with this 
>>>> patch,
>>>>
>>>> there seems to be at least one reference left after 't' is deleted and
>>>>
>>>> nss.nss_shutdown races with the garbage collector.
>>>>
>>>
>>>
>>> Doesn't the PKCDDocument object also reference some NSS objects? It
>>> might be worth trying to delete it manually before nss_shutdown as 
>>> well.
>>>
>>>
>>>
>>>
>>>
>> Yes, this patch doesn't work. There are still some references left.
>>
>> The problem may be on multiple places in here [1].
>>
>> There may be a reference still bound to the doc label.
>> Another problem is that python 2 code:
>>
>> [x for x in [123, 456]]
>>
>> creates 2 references to 456 as the list used in the assert lives for
>> some time
>> before it is garbage collected even though it is not reachable,
>> holding a reference to the object labeled as t.
>>
>> I don't know how nss counts the references to its objects but I think we
>> should ow I think
>> delete all the objects that use/are used by nss explicitly. This means
>> assigning the list
>> produced by the list comprehension a name as well and the delete it when
>> it is not needed.
>>
>> I'll send the patch shortly.
>>
>> [1]: https://paste.fedoraproject.org/253748/92783071/
>
> Given an assumption that all objects referenced only by local 
> variables are deleted when a function returns, maybe this can be 
> solved with:
>
>     def nss_initialized(func):
>         def decorated(*args, **kwargs):
>             nss.nss_init_nodb()
>             try:
>                 func(*args, **kwargs)
>             finally:
>                 nss.nss_shutdown()
>         return decorated
>
>     ...
>
>     class test_class(...):
>         @nss_initialized
>         def test_method(self):
>             ...
>
> (OTOH and untested)
>
It seems that NSS decided the assumption doesn't hold. [1]
Plus, the decorator seems to change the execution order of the test cases.

[1]: https://paste.fedoraproject.org/253846/39299083/

Milan




More information about the Freeipa-devel mailing list