[CalendarServer-changes] [10102] CalendarServer/trunk/twistedcaldav/directory

source_changes at macosforge.org source_changes at macosforge.org
Wed Nov 28 13:51:56 PST 2012


Revision: 10102
          http://trac.calendarserver.org//changeset/10102
Author:   sagen at apple.com
Date:     2012-11-28 13:51:56 -0800 (Wed, 28 Nov 2012)
Log Message:
-----------
Only encode recordType into the memcache key if it's being indexed on short-name

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/directory/cachingdirectory.py
    CalendarServer/trunk/twistedcaldav/directory/test/test_cachedirectory.py

Modified: CalendarServer/trunk/twistedcaldav/directory/cachingdirectory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/cachingdirectory.py	2012-11-28 20:33:58 UTC (rev 10101)
+++ CalendarServer/trunk/twistedcaldav/directory/cachingdirectory.py	2012-11-28 21:51:56 UTC (rev 10102)
@@ -228,6 +228,7 @@
     def generateMemcacheKey(self, indexType, indexKey, recordType):
         """
         Return a key that can be used to store/retrieve a record in memcache.
+        if short-name is the indexType the recordType be encoded into the key.
 
         @param indexType: one of the indexTypes( ) values
         @type indexType: C{str}
@@ -239,7 +240,13 @@
             service's baseGUID
         @rtype: C{str}
         """
-        return  "dir|%s|%s|%s|%s" % (self.baseGUID, recordType, indexType, indexKey)
+        keyVersion = 2
+        if indexType == CachingDirectoryService.INDEX_TYPE_SHORTNAME:
+            return "dir|v%d|%s|%s|%s|%s" % (keyVersion,self.baseGUID, recordType,
+                indexType, indexKey)
+        else:
+            return "dir|v%d|%s|%s|%s" % (keyVersion, self.baseGUID, indexType,
+                indexKey)
 
     def _initCaches(self):
         self._recordCaches = dict([
@@ -330,36 +337,40 @@
 
         # Check memcache
         if config.Memcached.Pools.Default.ClientEnabled:
-            for recordType in recordTypes:
-                key = self.generateMemcacheKey(indexType, indexKey, recordType)
-                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
+            # The only time the recordType arg matters is when indexType is
+            # short-name, and in that case recordTypes will contain exactly
+            # one recordType, so using recordTypes[0] here is always safe:
+            key = self.generateMemcacheKey(indexType, indexKey, recordTypes[0])
 
-                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
+            self.log_debug("Memcache: checking %s" % (key,))
 
-                if self.negativeCaching:
+            try:
+                record = self.memcacheGet(key)
+            except DirectoryMemcacheError:
+                self.log_error("Memcache: failed to get %s" % (key,))
+                record = None
 
-                    # Check negative memcache
-                    try:
-                        val = self.memcacheGet("-%s" % (key,))
-                    except DirectoryMemcacheError:
-                        self.log_error("Memcache: failed to get -%s" % (key,))
-                        val = None
-                    if val == 1:
-                        self.log_debug("Memcache: negative %s" % (key,))
-                        self._disabledKeys[indexType][indexKey] = time.time()
-                        return 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,))
+                except DirectoryMemcacheError:
+                    self.log_error("Memcache: failed to get -%s" % (key,))
+                    val = None
+                if val == 1:
+                    self.log_debug("Memcache: negative %s" % (key,))
+                    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)

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_cachedirectory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_cachedirectory.py	2012-11-28 20:33:58 UTC (rev 10101)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_cachedirectory.py	2012-11-28 21:51:56 UTC (rev 10102)
@@ -326,3 +326,17 @@
         record = self.service.recordWithShortName(DirectoryService.recordType_locations,
             "Duplicate")
         self.assertEquals(record.recordType, DirectoryService.recordType_locations)
+
+    def test_generateMemcacheKey(self):
+        """
+        Verify keys are correctly generated based on the index type -- if index type is
+        short-name, then the recordtype is encoded into the key.
+        """
+        self.assertEquals(
+            self.service.generateMemcacheKey(self.service.INDEX_TYPE_GUID, "foo", "users"),
+            "dir|v2|20CB1593-DE3F-4422-A7D7-BA9C2099B317|guid|foo",
+        )
+        self.assertEquals(
+            self.service.generateMemcacheKey(self.service.INDEX_TYPE_SHORTNAME, "foo", "users"),
+            "dir|v2|20CB1593-DE3F-4422-A7D7-BA9C2099B317|users|shortname|foo",
+        )
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20121128/c36dda57/attachment-0001.html>


More information about the calendarserver-changes mailing list