[CalendarServer-changes] [9400] CalendarServer/trunk/twistedcaldav
source_changes at macosforge.org
source_changes at macosforge.org
Fri Jun 29 11:21:08 PDT 2012
Revision: 9400
http://trac.macosforge.org/projects/calendarserver/changeset/9400
Author: cdaboo at apple.com
Date: 2012-06-29 11:21:08 -0700 (Fri, 29 Jun 2012)
Log Message:
-----------
Fix propfind response caching to work with all directory service implementations.
Modified Paths:
--------------
CalendarServer/trunk/twistedcaldav/cache.py
CalendarServer/trunk/twistedcaldav/directory/directory.py
CalendarServer/trunk/twistedcaldav/directory/test/test_directory.py
CalendarServer/trunk/twistedcaldav/test/test_cache.py
Modified: CalendarServer/trunk/twistedcaldav/cache.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/cache.py 2012-06-29 15:11:18 UTC (rev 9399)
+++ CalendarServer/trunk/twistedcaldav/cache.py 2012-06-29 18:21:08 UTC (rev 9400)
@@ -1,5 +1,5 @@
##
-# Copyright (c) 2008-2011 Apple Inc. All rights reserved.
+# Copyright (c) 2008-2012 Apple Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -239,6 +239,15 @@
return self.getCachePool().get('cacheToken:%s' % (uri,))
@inlineCallbacks
+ def _tokenForRecord(self, uri, request):
+ """
+ Get the current token for a particular principal URI's directory record.
+ """
+
+ record = (yield self._getRecordForURI(uri, request))
+ returnValue(record.cacheToken())
+
+ @inlineCallbacks
def _tokensForChildren(self, rURI, request):
"""
Create a dict of child resource tokens for any "recorded" during this request in the childCacheURIs attribute.
@@ -259,7 +268,7 @@
tokens = []
pURI, rURI = (yield self._getURIs(request))
tokens.append((yield self._tokenForURI(pURI, "PrincipalToken")))
- tokens.append(hash((yield self._getRecordForURI(pURI, request))))
+ tokens.append((yield self._tokenForRecord(pURI, request)))
tokens.append((yield self._tokenForURI(rURI)))
tokens.append((yield self._tokensForChildren(rURI, request)))
returnValue(tokens)
Modified: CalendarServer/trunk/twistedcaldav/directory/directory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/directory.py 2012-06-29 15:11:18 UTC (rev 9399)
+++ CalendarServer/trunk/twistedcaldav/directory/directory.py 2012-06-29 18:21:08 UTC (rev 9400)
@@ -1034,6 +1034,21 @@
return h
+ def cacheToken(self):
+ """
+ Generate a token that can be uniquely used to identify the state of this record for use
+ in a cache.
+ """
+ return hash((
+ self.__class__.__name__,
+ self.service.realmName,
+ self.recordType,
+ self.shortNames,
+ self.guid,
+ self.enabled,
+ self.enabledForCalendaring,
+ ))
+
def addAugmentInformation(self, augment):
if augment:
Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_directory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_directory.py 2012-06-29 15:11:18 UTC (rev 9399)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_directory.py 2012-06-29 18:21:08 UTC (rev 9400)
@@ -29,6 +29,7 @@
from twistedcaldav.directory.principal import DirectoryPrincipalProvisioningResource
import cPickle as pickle
+import uuid
def StubCheckSACL(cls, username, service):
services = {
@@ -619,3 +620,31 @@
record = DirectoryRecord(self.service, "users", original,
shortNames=("testing",))
self.assertEquals(expected, record.guid)
+
+class DirectoryRecordTests(TestCase):
+ """
+ Test L{DirectoryRecord} apis.
+ """
+
+ def setUp(self):
+ self.service = DirectoryService()
+ self.service.setRealm("test")
+ self.service.baseGUID = "0E8E6EC2-8E52-4FF3-8F62-6F398B08A498"
+
+ def test_cacheToken(self):
+ """
+ Test that DirectoryRecord.cacheToken is different for different records, and its value changes
+ as attributes on the record change.
+ """
+
+ record1 = DirectoryRecord(self.service, "users", str(uuid.uuid4()), shortNames=("testing1",))
+ record2 = DirectoryRecord(self.service, "users", str(uuid.uuid4()), shortNames=("testing2",))
+ self.assertNotEquals(record1.cacheToken(), record2.cacheToken())
+
+ cache1 = record1.cacheToken()
+ record1.enabled = True
+ self.assertNotEquals(cache1, record1.cacheToken())
+
+ cache1 = record1.cacheToken()
+ record1.enabledForCalendaring = True
+ self.assertNotEquals(cache1, record1.cacheToken())
Modified: CalendarServer/trunk/twistedcaldav/test/test_cache.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_cache.py 2012-06-29 15:11:18 UTC (rev 9399)
+++ CalendarServer/trunk/twistedcaldav/test/test_cache.py 2012-06-29 18:21:08 UTC (rev 9400)
@@ -1,5 +1,5 @@
##
-# Copyright (c) 2008-2010 Apple Inc. All rights reserved.
+# Copyright (c) 2008-2012 Apple Inc. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -45,6 +45,16 @@
def __init__(self, uid):
self.uid = uid
+ def cacheToken(self):
+ """
+ Generate a token that can be uniquely used to identify the state of this record for use
+ in a cache.
+ """
+ return hash((
+ self.__class__.__name__,
+ self.uid,
+ ))
+
class StubDirectory(object):
def recordWithShortName(self, recordType, recordName):
@@ -153,11 +163,11 @@
'/calendars/users/cdaboo/': StubURLResource(
'/calendars/__uids__/cdaboo/'),
'/principals/__uids__/cdaboo/': StubURLResource(
- '/principals/__uids__/cdaboo/', record='directoryToken0'),
+ '/principals/__uids__/cdaboo/', record=StubDirectoryRecord('cdaboo')),
'/calendars/__uids__/dreid/': StubURLResource(
'/calendars/__uids__/dreid/'),
'/principals/__uids__/dreid/': StubURLResource(
- '/principals/__uids__/dreid/', record='directoryToken0')}
+ '/principals/__uids__/dreid/', record=StubDirectoryRecord('dreid'))}
def tearDown(self):
@@ -345,7 +355,7 @@
def test_recordHashChangeInvalidatesCache(self):
StubRequest.resources[
- '/principals/__uids__/cdaboo/'].record = 'directoryToken1'
+ '/principals/__uids__/cdaboo/'].record = StubDirectoryRecord('cdaboo-changed')
d = self.rc.getResponseForRequest(
StubRequest(
@@ -391,7 +401,7 @@
0, #flags
cPickle.dumps((
'principalToken0',
- hash('directoryToken0'),
+ StubDirectoryRecord('cdaboo').cacheToken(),
'uriToken0',
{'/calendars/__uids__/cdaboo/calendars/':'childToken0'},
(self.expected_response[0],
@@ -421,7 +431,7 @@
0, #flags
cPickle.dumps((
'principalToken0',
- hash('directoryToken0'),
+ StubDirectoryRecord('cdaboo').cacheToken(),
'uriToken0',
{'/calendars/__uids__/cdaboo/calendars/':'childToken0'},
(expected_response[0],
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120629/d68428f6/attachment.html>
More information about the calendarserver-changes
mailing list