[CalendarServer-changes] [11739] CalendarServer/trunk/twext/enterprise

source_changes at macosforge.org source_changes at macosforge.org
Thu Sep 19 13:54:14 PDT 2013


Revision: 11739
          http://trac.calendarserver.org//changeset/11739
Author:   sagen at apple.com
Date:     2013-09-19 13:54:14 -0700 (Thu, 19 Sep 2013)
Log Message:
-----------
Prevent memory leak by disallowing hooks to be added after clear() or runHooks()

Modified Paths:
--------------
    CalendarServer/trunk/twext/enterprise/adbapi2.py
    CalendarServer/trunk/twext/enterprise/test/test_adbapi2.py

Modified: CalendarServer/trunk/twext/enterprise/adbapi2.py
===================================================================
--- CalendarServer/trunk/twext/enterprise/adbapi2.py	2013-09-19 18:34:17 UTC (rev 11738)
+++ CalendarServer/trunk/twext/enterprise/adbapi2.py	2013-09-19 20:54:14 UTC (rev 11739)
@@ -499,6 +499,7 @@
         """
         for operation in _destructively(self._hooks):
             yield operation()
+        self.clear()
         returnValue(ignored)
 
 
@@ -506,14 +507,16 @@
         """
         Implement L{IAsyncTransaction.postCommit}.
         """
-        self._hooks.append(operation)
+        if self._hooks is not None:
+            self._hooks.append(operation)
 
 
     def clear(self):
         """
-        Remove all hooks from this operation.
+        Remove all hooks from this operation.  Once this is called, no
+        more hooks can be added ever again.
         """
-        del self._hooks[:]
+        self._hooks = None
 
 
 

Modified: CalendarServer/trunk/twext/enterprise/test/test_adbapi2.py
===================================================================
--- CalendarServer/trunk/twext/enterprise/test/test_adbapi2.py	2013-09-19 18:34:17 UTC (rev 11738)
+++ CalendarServer/trunk/twext/enterprise/test/test_adbapi2.py	2013-09-19 20:54:14 UTC (rev 11739)
@@ -26,7 +26,7 @@
 
 from twisted.trial.unittest import TestCase
 
-from twisted.internet.defer import Deferred, fail
+from twisted.internet.defer import Deferred, fail, succeed, inlineCallbacks
 
 from twisted.test.proto_helpers import StringTransport
 
@@ -45,6 +45,7 @@
 from twext.enterprise.fixtures import RollbackFail
 from twext.enterprise.fixtures import CommitFail
 from twext.enterprise.adbapi2 import Commit
+from twext.enterprise.adbapi2 import _HookableOperation
 
 
 class TrashCollector(object):
@@ -1271,3 +1272,33 @@
         verifyObject(IAsyncTransaction, txn)
         self.pump.flush()
         self.assertEquals(len(self.factory.connections), 1)
+
+
+class HookableOperationTests(TestCase):
+    """
+    Tests for L{_HookableOperation}.
+    """
+
+    @inlineCallbacks
+    def test_clearPreventsSubsequentAddHook(self):
+        """
+        After clear() or runHooks() are called, subsequent calls to addHook()
+        are NO-OPs.
+        """
+        def hook():
+            return succeed(None)
+
+        hookOp = _HookableOperation()
+        hookOp.addHook(hook)
+        self.assertEquals(len(hookOp._hooks), 1)
+        hookOp.clear()
+        self.assertEquals(hookOp._hooks, None)
+
+        hookOp = _HookableOperation()
+        hookOp.addHook(hook)
+        yield hookOp.runHooks()
+        self.assertEquals(hookOp._hooks, None)
+        hookOp.addHook(hook)
+        self.assertEquals(hookOp._hooks, None)
+
+
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130919/6b188350/attachment.html>


More information about the calendarserver-changes mailing list