[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