Reported by Łukasz Paszke <lukasz.paszke@implix.com> May 6, 2010
Hi,
Thank you for p2p-sip.
I am debugging memory leaks in siprtmp.py from rtmplite, and sipd.py from
p2p-sip. siprtmp.py and sipd.py are based on p2p-sip. I know that in sip.py
memory usage increases after every register request generated by asterisk
1.4.22 on reregistration. This is because ServerTransaction and Proxy objects
are not closed (removed from memory) after each successful register
transaction. Therefore there is a buildup in the number of this object over
time (40 MB over 4 days).
Can you advise what can be wrong and where to look for the solution in the code?
Best Regards / Pozdrawiam
Łukasz
---
I can try looking at the memory problem in rfc3261.py file.
There is a circular reference among transaction and Dialog/Proxy
object I feel. I think I had implemented a close() method in both the
classes. But may be the close() method is not getting invoked for
cleanup on the Proxy object.
Which tool are you using to detect the memory leak?
We can probably chat further on gtalk (kundan10@gmail.com) and nail
this down....
---
I use pdb and objgraph from
http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks
I am new to python (I have experience in ruby, a little bit like python).
I think the problem occurs because of typo in rfc3261.py. Please see
rfc3261.py.patch for more details. After this correction objects are correctly
destroyed during registers/reregisters with asterisk.
I found some other leak occurring every time siprtmp.py registers/reregisters
to sipd.py (increase in application memory consumption), but unfortunately I
cant find any application objects in memory space after application termination.
siprtmp.py also have a number of more complicated memory leaks.
---
Index: rfc3261.py
===================================================================
--- rfc3261.py (revision 917)
+++ rfc3261.py (revision 918)
@@ -560,7 +560,7 @@
def state():
def fset(self, value):
self._state = value
- if self._state == 'terminating': self.close() # automatically
close when state goes terminating
+ if self._state == 'terminated': self.close() # automatically close
when state goes terminating
def fget(self): return self._state
return locals()
state = property(**state())
---
Hi Lukasz,
Thanks for the patch. That was a tricky typo and thanks for detecting.
We will add the memory leak detection as our things to do. I agree
that siprtmp.py is pretty primitive -- it was a student project and
haven't been regressed for robustness.
Regards
Original issue reported on code.google.com by voiprese...@gmail.com on 3 Feb 2011 at 11:21
Original issue reported on code.google.com by
voiprese...@gmail.com
on 3 Feb 2011 at 11:21