[CalendarServer-changes] [2420] CalendarServer/trunk/twistedcaldav

source_changes at macosforge.org source_changes at macosforge.org
Wed May 14 17:02:25 PDT 2008


Revision: 2420
          http://trac.macosforge.org/projects/calendarserver/changeset/2420
Author:   dreid at apple.com
Date:     2008-05-14 17:02:25 -0700 (Wed, 14 May 2008)

Log Message:
-----------
Only check the cache token once a minute.

Modified Paths:
--------------
    CalendarServer/trunk/twistedcaldav/cache.py
    CalendarServer/trunk/twistedcaldav/config.py
    CalendarServer/trunk/twistedcaldav/root.py
    CalendarServer/trunk/twistedcaldav/test/test_cache.py

Modified: CalendarServer/trunk/twistedcaldav/cache.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/cache.py	2008-05-14 19:44:16 UTC (rev 2419)
+++ CalendarServer/trunk/twistedcaldav/cache.py	2008-05-15 00:02:25 UTC (rev 2420)
@@ -74,16 +74,20 @@
     """
 
     CACHE_SIZE = 1000
+    TOKEN_CHECK_INTERVAL = 60
     propertyStoreFactory = xattrPropertyStore
 
-    def __init__(self, docroot, cacheSize=None):
+    def __init__(self, docroot, cacheSize=None, tokenCheck=None):
         self._docroot = docroot
         self._responses = {}
 
         if cacheSize is not None:
             self.CACHE_SIZE = cacheSize
 
+        if tokenCheck is not None:
+            self.TOKEN_CHECK_INTERVAL = tokenCheck
 
+
     def _tokenForURI(self, uri):
         """
         Get a property store for the given C{uri}.
@@ -154,26 +158,34 @@
                 self.log_debug("Not in cache: %r" % (key,))
                 return None
 
-            principalToken, uriToken, accessTime, response = self._responses[key]
+            (principalToken,
+             uriToken,
+             tokenCheckTime,
+             accessTime,
+             response) = self._responses[key]
 
-            newPrincipalToken = self._tokenForURI(principalURI)
-            newURIToken = self._tokenForURI(request.uri)
+            if self._time() - tokenCheckTime >= self.TOKEN_CHECK_INTERVAL:
+                newPrincipalToken = self._tokenForURI(principalURI)
+                newURIToken = self._tokenForURI(request.uri)
+                tokenCheckTime = self._time()
+                if newPrincipalToken != principalToken:
+                    self.log_debug(
+                        "Principal token changed on %r from %r to %r" % (
+                            key,
+                            principalToken,
+                            newPrincipalToken
+                            ))
+                    return None
 
-            if newPrincipalToken != principalToken:
-                self.log_debug("Principal token changed on %r from %r to %r" % (
-                        key,
-                        principalToken,
-                        newPrincipalToken
-                        ))
-                return None
+                elif newURIToken != uriToken:
+                    self.log_debug(
+                        "URI token changed on %r from %r to %r" % (
+                            key,
+                            uriToken,
+                            newURIToken
+                            ))
+                    return None
 
-            elif newURIToken != uriToken:
-                self.log_debug("URI token changed on %r from %r to %r" % (
-                        key,
-                        uriToken,
-                        newURIToken
-                        ))
-                return None
 
             response[1].removeHeader('date')
 
@@ -183,6 +195,7 @@
 
             self._responses[key] = (principalToken,
                                     uriToken,
+                                    tokenCheckTime,
                                     self._time(),
                                     response)
 
@@ -256,6 +269,7 @@
             self._responses[key] = (self._tokenForURI(principalURI),
                                     self._tokenForURI(request.uri),
                                     self._time(),
+                                    self._time(),
                                     (response.code,
                                      response.headers,
                                      responseBody))

Modified: CalendarServer/trunk/twistedcaldav/config.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/config.py	2008-05-14 19:44:16 UTC (rev 2419)
+++ CalendarServer/trunk/twistedcaldav/config.py	2008-05-15 00:02:25 UTC (rev 2420)
@@ -194,6 +194,9 @@
     # Configure the number of seconds that Propfinds should be cached for.
     "ResponseCacheSize": 1000,
 
+    # Define how frequently in seconds we should check the cache token.
+    "TokenCheckInterval": 60,
+
     # Profiling options
     "Profiling": {
         "Enabled": False,

Modified: CalendarServer/trunk/twistedcaldav/root.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/root.py	2008-05-14 19:44:16 UTC (rev 2419)
+++ CalendarServer/trunk/twistedcaldav/root.py	2008-05-15 00:02:25 UTC (rev 2420)
@@ -52,7 +52,9 @@
 
         self.contentFilters = []
 
-        self.responseCache = ResponseCache(self.fp, config.ResponseCacheSize)
+        self.responseCache = ResponseCache(self.fp,
+                                           config.ResponseCacheSize,
+                                           config.TokenCacheInterval)
 
         if config.ResponseCompression:
             from twisted.web2.filter import gzip

Modified: CalendarServer/trunk/twistedcaldav/test/test_cache.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_cache.py	2008-05-14 19:44:16 UTC (rev 2419)
+++ CalendarServer/trunk/twistedcaldav/test/test_cache.py	2008-05-15 00:02:25 UTC (rev 2420)
@@ -96,7 +96,7 @@
                 '/principals/users/cdaboo/': 'principalToken0',
                 '/principals/users/dreid/': 'principalTokenX'}
 
-        self.rc = ResponseCache(None)
+        self.rc = ResponseCache(None, tokenCheck=0)
         self.rc._tokenForURI = self.tokens.get
 
         self.rc._time = (lambda:0)
@@ -112,7 +112,7 @@
                 )
 
         self.rc._responses[expected_key] = (
-            'principalToken0', 'uriToken0', 0, self.expected_response)
+            'principalToken0', 'uriToken0', 0, 0, self.expected_response)
 
         self.rc._accessList = [expected_key]
 
@@ -258,37 +258,60 @@
         return d
 
 
-    def test_cacheExpirationBenchmark(self):
-        self.rc.CACHE_SIZE = 70000
-        import time
+#     def test_cacheExpirationBenchmark(self):
+#         self.rc.CACHE_SIZE = 70000
+#         import time
 
-        self.rc._responses = {}
-        self.rc._accessList = []
+#         self.rc._responses = {}
+#         self.rc._accessList = []
 
-        for x in xrange(0, self.rc.CACHE_SIZE):
-            req = StubRequest('PROPFIND',
-                              '/principals/users/user%d' % (x,),
-                              '/principals/users/user%d' % (x,))
-            self.rc._responses[req] = (
-                'pTokenUser%d' % (x,), 'rTokenUser%d' % (x,), 0,
-                (200, {}, 'foobar'))
+#         for x in xrange(0, self.rc.CACHE_SIZE):
+#             req = StubRequest('PROPFIND',
+#                               '/principals/users/user%d' % (x,),
+#                               '/principals/users/user%d' % (x,))
+#             self.rc._responses[req] = (
+#                 'pTokenUser%d' % (x,), 'rTokenUser%d' % (x,), 0,
+#                 (200, {}, 'foobar'))
 
-            self.rc._accessList.append(req)
+#             self.rc._accessList.append(req)
 
-        def assertTime(result, startTime):
-            duration = time.time() - startTime
+#         def assertTime(result, startTime):
+#             duration = time.time() - startTime
 
-            self.failUnless(
-                duration < 0.01,
-                "Took to long to add to the cache: %r" % (duration,))
+#             self.failUnless(
+#                 duration < 0.01,
+#                 "Took to long to add to the cache: %r" % (duration,))
 
-        startTime = time.time()
+#         startTime = time.time()
 
-        d = self.rc.cacheResponseForRequest(
-            StubRequest('PROPFIND',
-                        '/principals/users/dreid/',
-                        '/principals/users/dreid/'),
-            StubResponse(200, {}, 'Foobar'))
+#         d = self.rc.cacheResponseForRequest(
+#             StubRequest('PROPFIND',
+#                         '/principals/users/dreid/',
+#                         '/principals/users/dreid/'),
+#             StubResponse(200, {}, 'Foobar'))
 
-        d.addCallback(assertTime, startTime)
+#         d.addCallback(assertTime, startTime)
+#         return d
+
+
+    def test_tokenCheckInterval(self):
+        self.tokens['/principals/users/cdaboo/'] = 'principalToken1'
+
+        self.rc.TOKEN_CHECK_INTERVAL = 60
+
+        req = StubRequest(
+            'PROPFIND',
+            '/calendars/users/cdaboo/',
+            '/principals/users/cdaboo/')
+
+        def _surpassInterval(result):
+            self.rc._time = (lambda: 61)
+            d1 = self.rc.getResponseForRequest(req)
+            d1.addCallback(self.assertEquals, None)
+            return d1
+
+        d = self.rc.getResponseForRequest(req)
+
+        d.addCallback(self.assertResponse, self.expected_response)
+        d.addCallback(_surpassInterval)
         return d

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20080514/6422115b/attachment-0001.html


More information about the calendarserver-changes mailing list