-
Notifications
You must be signed in to change notification settings - Fork 332
Memory leak in greendns #810
Copy link
Copy link
Closed
Description
Hi, we've found a memory leak in module greendns, when the dns server response query with exception dns.exception.Timeout or dns.exception.DNSException, we got a memory leak with EAI_EAGAIN_ERROR or EAI_NODATA_ERROR.
The root cause of this memory leak is from TracebackType:
- In greendns.py, we initialize
EAI_*_ERRORas instances of classsocket.gaierror, which has__traceback__attribute as PEP-3134 defined. - The
__traceback__is aTracebackType, when the same instanceEAI_NODATA_ERRORbeing called multiple times, it insertstb_nextto the top ofEAI_NODATA_ERROR.__traceback__.tb_next.
To simplify and reproduce the problem, we made a script, the main logic is same with function greendns.resolve.
import socket
EAI_NONAME_ERROR = socket.gaierror(socket.EAI_NONAME, 'Name or service not known')
def query():
raise EAI_NONAME_ERROR
def step():
try:
query()
except Exception:
pass
print("Init")
print(EAI_NONAME_ERROR.__traceback__) # None
step()
print("After first raise")
print(EAI_NONAME_ERROR.__traceback__) # <traceback object at 0x7f04dd6a3d90>
print(EAI_NONAME_ERROR.__traceback__.tb_next) # <traceback object at 0x7f04dd6a1770>
print(EAI_NONAME_ERROR.__traceback__.tb_next.tb_next) # None
step()
print("After second raise")
print(EAI_NONAME_ERROR.__traceback__) # <traceback object at 0x7f04dd6a17c0>
print(EAI_NONAME_ERROR.__traceback__.tb_next) # <traceback object at 0x7f04ddf48aa0>
print(EAI_NONAME_ERROR.__traceback__.tb_next.tb_next) # <traceback object at 0x7f04dd6a3d90>
print(EAI_NONAME_ERROR.__traceback__.tb_next.tb_next.tb_next) # <traceback object at 0x7f04dd6a1770>
print(EAI_NONAME_ERROR.__traceback__.tb_next.tb_next.tb_next.tb_next) # NoneI tested and reproduced the script with python version 3.7.10, 3.8.8, 3.11.0, and will try to commit a pull request to fix this issue.
IMHO this issue is not related to OS version, my environment info is blow:
uname -a
Linux 3.10.0-862.14.4.el7.x86_64
Reactions are currently unavailable