[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