[CalendarServer-changes] [14220] twext/trunk/twext/who/opendirectory

source_changes at macosforge.org source_changes at macosforge.org
Thu Dec 11 10:56:21 PST 2014


Revision: 14220
          http://trac.calendarserver.org//changeset/14220
Author:   sagen at apple.com
Date:     2014-12-11 10:56:21 -0800 (Thu, 11 Dec 2014)
Log Message:
-----------
Fix the autorelease pool

Modified Paths:
--------------
    twext/trunk/twext/who/opendirectory/_service.py
    twext/trunk/twext/who/opendirectory/test/test_service.py

Modified: twext/trunk/twext/who/opendirectory/_service.py
===================================================================
--- twext/trunk/twext/who/opendirectory/_service.py	2014-12-11 18:31:23 UTC (rev 14219)
+++ twext/trunk/twext/who/opendirectory/_service.py	2014-12-11 18:56:21 UTC (rev 14220)
@@ -21,6 +21,7 @@
 OpenDirectory directory service implementation.
 """
 
+from time import time
 from uuid import UUID
 from zope.interface import implementer
 
@@ -159,6 +160,46 @@
         self._suppressSystemRecords = suppressSystemRecords
 
 
+        # Create an autorelease pool which will get deleted when someone
+        # calls _maybeDrainPool( ), but no more often than 60 seconds, hence
+        # the "maybe"
+        self._resetAutoreleasePool()
+
+        # Register a pool delete to happen at shutdown
+        from twisted.internet import reactor
+        reactor.addSystemEventTrigger("after", "shutdown", self._deletePool)
+
+
+    def _deletePool(self):
+        """
+        Delete the autorelease pool if we have one
+        """
+        if hasattr(self, "_autoReleasePool"):
+            del self._autoReleasePool
+
+
+    def _resetAutoreleasePool(self):
+        """
+        Create an autorelease pool, deleting the old one if we had one.
+        """
+        self._deletePool()
+
+        self._autoReleasePool = NSAutoreleasePool.alloc().init()
+        self._poolCreationTime = time()
+
+
+    def _maybeResetPool(self):
+        """
+        If it's been at least 60 seconds since the last time we created the
+        pool, delete the pool (which drains it) and create a new one.
+        """
+        poolCreationTime = getattr(self, "_poolCreationTime", 0)
+        now = time()
+        if (now - poolCreationTime) > 60:
+            self._resetAutoreleasePool()
+
+
+
     @property
     def nodeName(self):
         return self._nodeName
@@ -758,11 +799,12 @@
         returnValue(result)
 
 
-    @wrapWithAutoreleasePool
     def recordsFromNonCompoundExpression(
         self, expression, recordTypes=None, records=None,
         limitResults=None, timeoutSeconds=None
     ):
+        self._maybeResetPool()
+
         if isinstance(expression, MatchExpression):
             try:
                 query = self._queryFromMatchExpression(
@@ -786,7 +828,6 @@
         )
 
 
-    @wrapWithAutoreleasePool
     @inlineCallbacks
     def recordsFromCompoundExpression(
         self, expression, recordTypes=None, records=None,
@@ -800,6 +841,7 @@
         CompoundExpression up into MatchExpressions for sending to the local
         node.
         """
+        self._maybeResetPool()
 
         try:
             query = self._queryFromCompoundExpression(
@@ -834,7 +876,6 @@
         returnValue(results)
 
 
-    @wrapWithAutoreleasePool
     @inlineCallbacks
     def localRecordsFromCompoundExpression(
         self, expression, recordTypes=None,
@@ -940,9 +981,10 @@
         ))
 
 
-    @wrapWithAutoreleasePool
     @inlineCallbacks
     def recordWithShortName(self, recordType, shortName, timeoutSeconds=None):
+        self._maybeResetPool()
+
         try:
             query = self._queryFromMatchExpression(
                 MatchExpression(self.fieldName.shortNames, shortName),

Modified: twext/trunk/twext/who/opendirectory/test/test_service.py
===================================================================
--- twext/trunk/twext/who/opendirectory/test/test_service.py	2014-12-11 18:31:23 UTC (rev 14219)
+++ twext/trunk/twext/who/opendirectory/test/test_service.py	2014-12-11 18:56:21 UTC (rev 14220)
@@ -35,16 +35,22 @@
     Tests for L{DirectoryService}.
     """
 
+    def setUp(self):
+        self.service = DirectoryService()
+
+    def tearDown(self):
+        self.service._deletePool()
+
+
     def test_queryFromMatchExpression_recordType(self):
         """
         Make sure queryFromMatchExpression handles recordType correctly
         """
-        service = DirectoryService()
-        query = service._queryFromMatchExpression(
+        query = self.service._queryFromMatchExpression(
             MatchExpression(
-                service.fieldName.shortNames, u"xyzzy"
+                self.service.fieldName.shortNames, u"xyzzy"
             ),
-            recordType=service.recordType.group
+            recordType=self.service.recordType.group
         )
         # FIXME:
         # Actually, how do we inspect the query object to peek at the
@@ -59,8 +65,6 @@
         Match expressions with each match type produces the correct
         operator=value string.
         """
-        service = DirectoryService()
-
         for matchType, expected in (
             (MatchType.equals, u"=xyzzy"),
             (MatchType.startsWith, u"=xyzzy*"),
@@ -72,10 +76,10 @@
             (MatchType.greaterThanOrEqualTo, u">=xyzzy"),
         ):
             expression = MatchExpression(
-                service.fieldName.shortNames, u"xyzzy",
+                self.service.fieldName.shortNames, u"xyzzy",
                 matchType=matchType
             )
-            queryString, recordTypes = service._queryStringAndRecordTypesFromExpression(expression)
+            queryString, recordTypes = self.service._queryStringAndRecordTypesFromExpression(expression)
             self.assertEquals(
                 recordTypes,
                 set(
@@ -99,13 +103,11 @@
         """
         Match expression with the C{NOT} flag adds the C{!} operator.
         """
-        service = DirectoryService()
-
         expression = MatchExpression(
-            service.fieldName.shortNames, u"xyzzy",
+            self.service.fieldName.shortNames, u"xyzzy",
             flags=MatchFlags.NOT
         )
-        queryString, recordTypes = service._queryStringAndRecordTypesFromExpression(expression)
+        queryString, recordTypes = self.service._queryStringAndRecordTypesFromExpression(expression)
         self.assertEquals(
             recordTypes,
             set(
@@ -130,13 +132,11 @@
         Match expression with the C{caseInsensitive} flag adds the C{??????}
         operator.
         """
-        service = DirectoryService()
-
         expression = MatchExpression(
-            service.fieldName.shortNames, u"xyzzy",
+            self.service.fieldName.shortNames, u"xyzzy",
             flags=MatchFlags.caseInsensitive
         )
-        queryString, recordTypes = service._queryStringAndRecordTypesFromExpression(expression)
+        queryString, recordTypes = self.service._queryStringAndRecordTypesFromExpression(expression)
         self.assertEquals(
             recordTypes,
             set(
@@ -164,13 +164,11 @@
         """
         Special characters are quoted properly.
         """
-        service = DirectoryService()
-
         expression = MatchExpression(
-            service.fieldName.fullNames,
+            self.service.fieldName.fullNames,
             u"\\xyzzy: a/b/(c)* ~~ >=< ~~ &| \0!!"
         )
-        queryString, recordTypes = service._queryStringAndRecordTypesFromExpression(expression)
+        queryString, recordTypes = self.service._queryStringAndRecordTypesFromExpression(expression)
         self.assertEquals(
             recordTypes,
             set(
@@ -193,36 +191,34 @@
 
 
     def test_queryStringFromExpression(self):
-        service = DirectoryService()
-
         # CompoundExpressions
 
         expression = CompoundExpression(
             [
                 MatchExpression(
-                    service.fieldName.uid, u"a",
+                    self.service.fieldName.uid, u"a",
                     matchType=MatchType.contains
                 ),
                 MatchExpression(
-                    service.fieldName.guid, UUID(int=0),
+                    self.service.fieldName.guid, UUID(int=0),
                     matchType=MatchType.contains
                 ),
                 MatchExpression(
-                    service.fieldName.shortNames, u"c",
+                    self.service.fieldName.shortNames, u"c",
                     matchType=MatchType.contains
                 ),
                 MatchExpression(
-                    service.fieldName.emailAddresses, u"d",
+                    self.service.fieldName.emailAddresses, u"d",
                     matchType=MatchType.startsWith
                 ),
                 MatchExpression(
-                    service.fieldName.fullNames, u"e",
+                    self.service.fieldName.fullNames, u"e",
                     matchType=MatchType.equals
                 ),
             ],
             Operand.AND
         )
-        queryString, recordTypes = service._queryStringAndRecordTypesFromExpression(expression)
+        queryString, recordTypes = self.service._queryStringAndRecordTypesFromExpression(expression)
         self.assertEquals(
             recordTypes,
             set(
@@ -249,21 +245,21 @@
         expression = CompoundExpression(
             [
                 MatchExpression(
-                    service.fieldName.shortNames, u"a",
+                    self.service.fieldName.shortNames, u"a",
                     matchType=MatchType.contains
                 ),
                 MatchExpression(
-                    service.fieldName.emailAddresses, u"b",
+                    self.service.fieldName.emailAddresses, u"b",
                     matchType=MatchType.startsWith
                 ),
                 MatchExpression(
-                    service.fieldName.fullNames, u"c",
+                    self.service.fieldName.fullNames, u"c",
                     matchType=MatchType.equals
                 ),
             ],
             Operand.OR
         )
-        queryString, recordTypes = service._queryStringAndRecordTypesFromExpression(expression)
+        queryString, recordTypes = self.service._queryStringAndRecordTypesFromExpression(expression)
         self.assertEquals(
             recordTypes,
             set(
@@ -289,30 +285,28 @@
         """
         Record type in expression
         """
-        service = DirectoryService()
-
         # AND expression
         expression = CompoundExpression(
             [
                 MatchExpression(
-                    service.fieldName.shortNames,
+                    self.service.fieldName.shortNames,
                     u"xyzzy",
                     matchType=MatchType.equals
                 ),
                 MatchExpression(
-                    service.fieldName.recordType,
-                    service.recordType.group,
+                    self.service.fieldName.recordType,
+                    self.service.recordType.group,
                     matchType=MatchType.equals
                 ),
                 MatchExpression(
-                    service.fieldName.recordType,
-                    service.recordType.user,
+                    self.service.fieldName.recordType,
+                    self.service.recordType.user,
                     matchType=MatchType.equals
                 ),
             ],
             Operand.AND
         )
-        queryString, recordTypes = service._queryStringAndRecordTypesFromExpression(expression)
+        queryString, recordTypes = self.service._queryStringAndRecordTypesFromExpression(expression)
         self.assertEquals(recordTypes, set())
         self.assertEquals(
             queryString,
@@ -323,7 +317,7 @@
         expression = CompoundExpression(
             [
                 MatchExpression(
-                    service.fieldName.shortNames,
+                    self.service.fieldName.shortNames,
                     u"xxxxx",
                     matchType=MatchType.equals
                 ),
@@ -331,12 +325,12 @@
                     [
 
                         MatchExpression(
-                            service.fieldName.recordType,
-                            service.recordType.group,
+                            self.service.fieldName.recordType,
+                            self.service.recordType.group,
                             matchType=MatchType.equals
                         ),
                         MatchExpression(
-                            service.fieldName.shortNames,
+                            self.service.fieldName.shortNames,
                             u"yyyyy",
                             matchType=MatchType.equals
                         ),
@@ -346,7 +340,7 @@
             ],
             Operand.OR
         )
-        queryString, recordTypes = service._queryStringAndRecordTypesFromExpression(expression)
+        queryString, recordTypes = self.service._queryStringAndRecordTypesFromExpression(expression)
         self.assertEquals(set(recordTypes), set([u"dsRecTypeStandard:Groups", ]))
         self.assertEquals(
             queryString,
@@ -359,25 +353,25 @@
         expression = CompoundExpression(
             [
                 MatchExpression(
-                    service.fieldName.shortNames,
+                    self.service.fieldName.shortNames,
                     u"xxxxx",
                     matchType=MatchType.equals
                 ),
                 MatchExpression(
-                    service.fieldName.shortNames,
+                    self.service.fieldName.shortNames,
                     u"yyyyy",
                     matchType=MatchType.equals
                 ),
                 MatchExpression(
-                    service.fieldName.recordType,
-                    service.recordType.user,
+                    self.service.fieldName.recordType,
+                    self.service.recordType.user,
                     matchType=MatchType.equals,
                     flags=MatchFlags.NOT
                 ),
             ],
             Operand.OR
         )
-        queryString, recordTypes = service._queryStringAndRecordTypesFromExpression(expression)
+        queryString, recordTypes = self.service._queryStringAndRecordTypesFromExpression(expression)
         self.assertEquals(
             set(recordTypes),
             set(
@@ -400,14 +394,14 @@
         expression = CompoundExpression(
             [
                 MatchExpression(
-                    service.fieldName.recordType,
-                    service.recordType.user,
+                    self.service.fieldName.recordType,
+                    self.service.recordType.user,
                     matchType=MatchType.equals
                 ),
             ],
             Operand.AND
         )
-        queryString, recordTypes = service._queryStringAndRecordTypesFromExpression(expression)
+        queryString, recordTypes = self.service._queryStringAndRecordTypesFromExpression(expression)
         self.assertEquals(set(recordTypes), set([u"dsRecTypeStandard:Users"]))
         self.assertEquals(
             queryString,
@@ -418,8 +412,8 @@
         expression = CompoundExpression(
             [
                 MatchExpression(
-                    service.fieldName.recordType,
-                    service.recordType.user,
+                    self.service.fieldName.recordType,
+                    self.service.recordType.user,
                     matchType=MatchType.equals
                 ),
             ],
@@ -427,6 +421,6 @@
         )
         self.assertRaises(
             QueryNotSupportedError,
-            service._queryStringAndRecordTypesFromExpression,
+            self.service._queryStringAndRecordTypesFromExpression,
             expression,
         )
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20141211/badc3c2b/attachment-0001.html>


More information about the calendarserver-changes mailing list