[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