[CalendarServer-changes] [7074] CalendarServer/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Wed Feb 23 16:32:44 PST 2011
Revision: 7074
http://trac.macosforge.org/projects/calendarserver/changeset/7074
Author: sagen at apple.com
Date: 2011-02-23 16:32:43 -0800 (Wed, 23 Feb 2011)
Log Message:
-----------
Makes negative directory-record caching optional (off by default), and lowers cacheTimeout to 1 minute.
Modified Paths:
--------------
CalendarServer/trunk/conf/caldavd-apple.plist
CalendarServer/trunk/conf/caldavd-test.plist
CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py
CalendarServer/trunk/twistedcaldav/directory/cachingdirectory.py
CalendarServer/trunk/twistedcaldav/directory/ldapdirectory.py
CalendarServer/trunk/twistedcaldav/directory/test/test_cachedirectory.py
CalendarServer/trunk/twistedcaldav/stdconfig.py
Modified: CalendarServer/trunk/conf/caldavd-apple.plist
===================================================================
--- CalendarServer/trunk/conf/caldavd-apple.plist 2011-02-24 00:08:17 UTC (rev 7073)
+++ CalendarServer/trunk/conf/caldavd-apple.plist 2011-02-24 00:32:43 UTC (rev 7074)
@@ -197,7 +197,7 @@
<key>node</key>
<string>/Search</string>
<key>cacheTimeout</key>
- <integer>30</integer>
+ <integer>1</integer>
</dict>
</dict>
Modified: CalendarServer/trunk/conf/caldavd-test.plist
===================================================================
--- CalendarServer/trunk/conf/caldavd-test.plist 2011-02-24 00:08:17 UTC (rev 7073)
+++ CalendarServer/trunk/conf/caldavd-test.plist 2011-02-24 00:32:43 UTC (rev 7074)
@@ -194,7 +194,7 @@
<key>node</key>
<string>/Search</string>
<key>cacheTimeout</key>
- <integer>30</integer>
+ <integer>1</integer>
</dict>
</dict>
-->
Modified: CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py 2011-02-24 00:08:17 UTC (rev 7073)
+++ CalendarServer/trunk/twistedcaldav/directory/appleopendirectory.py 2011-02-24 00:32:43 UTC (rev 7074)
@@ -65,12 +65,14 @@
restrictToGroup: C{str} guid or name of group used to
restrict enabled users.
cacheTimeout: C{int} number of minutes before cache is invalidated.
+ negativeCache: C{False} cache the fact that a record wasn't found
"""
defaults = {
'node' : '/Search',
'restrictEnabledRecords' : False,
'restrictToGroup' : '',
- 'cacheTimeout' : 30,
+ 'cacheTimeout' : 1,
+ 'negativeCaching' : False,
'recordTypes' : (
self.recordType_users,
self.recordType_groups,
@@ -81,7 +83,8 @@
self._recordTypes = params['recordTypes']
- super(OpenDirectoryService, self).__init__(params['cacheTimeout'])
+ super(OpenDirectoryService, self).__init__(params['cacheTimeout'],
+ params['negativeCaching'])
self.odModule = namedModule(config.OpenDirectoryModule)
Modified: CalendarServer/trunk/twistedcaldav/directory/cachingdirectory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/cachingdirectory.py 2011-02-24 00:08:17 UTC (rev 7073)
+++ CalendarServer/trunk/twistedcaldav/directory/cachingdirectory.py 2011-02-24 00:32:43 UTC (rev 7074)
@@ -144,7 +144,8 @@
def __init__(
self,
- cacheTimeout=30,
+ cacheTimeout=1,
+ negativeCaching=False,
cacheClass=DictRecordTypeCache,
):
"""
@@ -152,6 +153,7 @@
"""
self.cacheTimeout = cacheTimeout * 60
+ self.negativeCaching = negativeCaching
self.cacheClass = cacheClass
self._initCaches()
@@ -254,7 +256,7 @@
recordWithUID = recordWithGUID
- def _lookupRecord(self, recordTypes, indexType, indexKey, cacheOnMiss=True):
+ def _lookupRecord(self, recordTypes, indexType, indexKey):
if recordTypes is None:
recordTypes = self.recordTypes()
@@ -285,8 +287,8 @@
if record:
return record
- if cacheOnMiss:
-
+ if self.negativeCaching:
+
# Check negative cache (take cache entry timeout into account)
try:
disabledTime = self._disabledKeys[indexType][indexKey]
@@ -294,26 +296,28 @@
return None
except KeyError:
pass
-
- # Check memcache
- if config.Memcached.Pools.Default.ClientEnabled:
- key = "dir|%s|%s|%s|%s" % (self.baseGUID, indexType, indexKey,
- "|".join(self.recordTypes()))
- self.log_debug("Memcache: checking %s" % (key,))
- try:
- record = self.memcacheGet(key)
- except DirectoryMemcacheError:
- self.log_error("Memcache: failed to get %s" % (key,))
- record = None
+ # Check memcache
+ if config.Memcached.Pools.Default.ClientEnabled:
+ key = "dir|%s|%s|%s|%s" % (self.baseGUID, indexType, indexKey,
+ "|".join(self.recordTypes()))
+ self.log_debug("Memcache: checking %s" % (key,))
- if record is None:
- self.log_debug("Memcache: miss %s" % (key,))
- else:
- self.log_debug("Memcache: hit %s" % (key,))
- self.recordCacheForType(record.recordType).addRecord(record, indexType, indexKey, useMemcache=False)
- return record
+ try:
+ record = self.memcacheGet(key)
+ except DirectoryMemcacheError:
+ self.log_error("Memcache: failed to get %s" % (key,))
+ record = None
+ if record is None:
+ self.log_debug("Memcache: miss %s" % (key,))
+ else:
+ self.log_debug("Memcache: hit %s" % (key,))
+ self.recordCacheForType(record.recordType).addRecord(record, indexType, indexKey, useMemcache=False)
+ return record
+
+ if self.negativeCaching:
+
# Check negative memcache
try:
val = self.memcacheGet("-%s" % (key,))
@@ -325,16 +329,18 @@
self._disabledKeys[indexType][indexKey] = time.time()
return None
- # Try query
- self.log_debug("Faulting record for attribute '%s' with value '%s'" % (indexType, indexKey,))
- self.queryDirectory(recordTypes, indexType, indexKey)
-
- # Now try again from cache
- record = lookup()
- if record:
- self.log_debug("Found record for attribute '%s' with value '%s'" % (indexType, indexKey,))
- return record
+ # Try query
+ self.log_debug("Faulting record for attribute '%s' with value '%s'" % (indexType, indexKey,))
+ self.queryDirectory(recordTypes, indexType, indexKey)
+
+ # Now try again from cache
+ record = lookup()
+ if record:
+ self.log_debug("Found record for attribute '%s' with value '%s'" % (indexType, indexKey,))
+ return record
+ if self.negativeCaching:
+
# Add to negative cache with timestamp
self.log_debug("Failed to fault record for attribute '%s' with value '%s'" % (indexType, indexKey,))
self._disabledKeys[indexType][indexKey] = time.time()
Modified: CalendarServer/trunk/twistedcaldav/directory/ldapdirectory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/ldapdirectory.py 2011-02-24 00:08:17 UTC (rev 7073)
+++ CalendarServer/trunk/twistedcaldav/directory/ldapdirectory.py 2011-02-24 00:32:43 UTC (rev 7074)
@@ -74,7 +74,8 @@
"""
defaults = {
- "cacheTimeout": 30,
+ "cacheTimeout": 1,
+ "negativeCaching": False,
"restrictEnabledRecords": False,
"restrictToGroup": "",
"recordTypes": ("users", "groups"),
@@ -137,7 +138,8 @@
self._recordTypes = params["recordTypes"]
- super(LdapDirectoryService, self).__init__(params["cacheTimeout"])
+ super(LdapDirectoryService, self).__init__(params["cacheTimeout"],
+ params["negativeCaching"])
self.realmName = params["uri"]
self.uri = params["uri"]
Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_cachedirectory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_cachedirectory.py 2011-02-24 00:08:17 UTC (rev 7073)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_cachedirectory.py 2011-02-24 00:32:43 UTC (rev 7074)
@@ -252,3 +252,39 @@
"Kerberos:user03 at example.com"
) is not None)
self.assertFalse(self.service.queried)
+
+ def test_negativeCaching(self):
+ self.dummyRecords()
+
+ # If negativeCaching is off, each miss will result in a call to
+ # queryDirectory( )
+ self.service.negativeCaching = False
+
+ self.service.queried = False
+ self.assertEquals(self.service.recordWithGUID(self.guidForShortName("missing")), None)
+ self.assertTrue(self.service.queried)
+
+ self.service.queried = False
+ self.assertEquals(self.service.recordWithGUID(self.guidForShortName("missing")), None)
+ self.assertTrue(self.service.queried)
+
+
+ # However, if negativeCaching is on, a miss is recorded as such,
+ # preventing a similar queryDirectory( ) until cacheTimeout passes
+ self.service.negativeCaching = True
+
+ self.service.queried = False
+ self.assertEquals(self.service.recordWithGUID(self.guidForShortName("missing")), None)
+ self.assertTrue(self.service.queried)
+
+ self.service.queried = False
+ self.assertEquals(self.service.recordWithGUID(self.guidForShortName("missing")), None)
+ self.assertFalse(self.service.queried)
+
+ # Simulate time passing by clearing the negative timestamp for this
+ # entry, then try again, this time queryDirectory( ) is called
+ self.service._disabledKeys[self.service.INDEX_TYPE_GUID][self.guidForShortName("missing")] = 0
+
+ self.service.queried = False
+ self.assertEquals(self.service.recordWithGUID(self.guidForShortName("missing")), None)
+ self.assertTrue(self.service.queried)
Modified: CalendarServer/trunk/twistedcaldav/stdconfig.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/stdconfig.py 2011-02-24 00:08:17 UTC (rev 7073)
+++ CalendarServer/trunk/twistedcaldav/stdconfig.py 2011-02-24 00:32:43 UTC (rev 7074)
@@ -47,13 +47,15 @@
},
"twistedcaldav.directory.appleopendirectory.OpenDirectoryService": {
"node": "/Search",
- "cacheTimeout": 30,
+ "cacheTimeout": 1,
+ "negativeCaching": False,
"restrictEnabledRecords": False,
"restrictToGroup": "",
"recordTypes": ("users", "groups"),
},
"twistedcaldav.directory.ldapdirectory.LdapDirectoryService": {
- "cacheTimeout": 30,
+ "cacheTimeout": 1,
+ "negativeCaching": False,
"restrictEnabledRecords": False,
"restrictToGroup": "",
"recordTypes": ("users", "groups"),
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110223/3224791f/attachment-0001.html>
More information about the calendarserver-changes
mailing list