[CalendarServer-changes] [3144] CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav /directory
source_changes at macosforge.org
source_changes at macosforge.org
Mon Oct 13 07:17:44 PDT 2008
Revision: 3144
http://trac.macosforge.org/projects/calendarserver/changeset/3144
Author: cdaboo at apple.com
Date: 2008-10-13 07:17:42 -0700 (Mon, 13 Oct 2008)
Log Message:
-----------
Switch group indexing to be done during reloadCache so that it runs in a thread or faults a single
group in.
Modified Paths:
--------------
CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/appleopendirectory.py
CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/test/test_opendirectoryrecords.py
Modified: CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/appleopendirectory.py
===================================================================
--- CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/appleopendirectory.py 2008-10-13 13:42:20 UTC (rev 3143)
+++ CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/appleopendirectory.py 2008-10-13 14:17:42 UTC (rev 3144)
@@ -90,8 +90,6 @@
self.cacheTimeout = cacheTimeout
self._records = {}
self._delayedCalls = set()
- self._groupIndex = {}
- self._groupIndexValid = False
if dosetup:
for recordType in self.recordTypes():
@@ -304,23 +302,15 @@
def groupsForGUID(self, guid):
- # Check whether cache exists
- if not self._groupIndexValid:
- self._reindexGroups()
-
# Lookup in index
try:
- return self._groupIndex[guid]
+ return self._storage(DirectoryService.recordType_groups)["groupsForGUID"][guid]
except KeyError:
return ()
- def _reindexGroups(self):
- index = {}
- for groupRecord in self.recordsForType(DirectoryService.recordType_groups).itervalues():
- for guid in groupRecord._memberGUIDs:
- index.setdefault(guid, set()).add(groupRecord)
- self._groupIndex = index
- self._groupIndexValid = True
+ def _indexGroup(self, group, index):
+ for guid in group._memberGUIDs:
+ index.setdefault(guid, set()).add(group)
_ODFields = {
'fullName' : dsattributes.kDS1AttrDistinguishedName,
@@ -396,8 +386,6 @@
elif guid is None:
self.log_info("Reloading %s record cache" % (recordType,))
- self._groupIndexValid = False
-
results = self._queryDirectory(recordType, shortName=shortName, guid=guid)
if shortName is None and guid is None:
@@ -406,6 +394,9 @@
disabledNames = set()
disabledGUIDs = set()
+
+ if recordType == DirectoryService.recordType_groups:
+ groupsForGUID = {}
else:
storage = self._records[recordType]
@@ -414,6 +405,9 @@
disabledNames = storage["disabled names"]
disabledGUIDs = storage["disabled guids"]
+
+ if recordType == DirectoryService.recordType_groups:
+ groupsForGUID = storage["groupsForGUID"]
enabled_count = 0
for (recordShortName, value) in results:
@@ -555,6 +549,10 @@
records[record.shortName] = guids[record.guid] = record
self.log_debug("Added record %s to OD record cache" % (record,))
+ # Do group indexing if needed
+ if recordType == DirectoryService.recordType_groups:
+ self._indexGroup(record, groupsForGUID)
+
if shortName is None and guid is None:
#
# Replace the entire cache
@@ -567,6 +565,10 @@
"disabled guids": disabledGUIDs,
}
+ # Add group indexing if needed
+ if recordType == DirectoryService.recordType_groups:
+ storage["groupsForGUID"] = groupsForGUID
+
def rot():
storage["status"] = "stale"
removals = set()
Modified: CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/test/test_opendirectoryrecords.py
===================================================================
--- CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/test/test_opendirectoryrecords.py 2008-10-13 13:42:20 UTC (rev 3143)
+++ CalendarServer/branches/users/cdaboo/better-proxy-3132/twistedcaldav/directory/test/test_opendirectoryrecords.py 2008-10-13 14:17:42 UTC (rev 3144)
@@ -406,7 +406,32 @@
user2 = self._service.recordWithShortName(DirectoryService.recordType_users, "user02")
self.assertTrue(user2 is not None)
self.assertEqual(set((group2,)), user2.groups())
+
+ self._service.fakerecords[DirectoryService.recordType_groups] = [
+ fakeODRecord("Group 03", members=[
+ guidForShortName("user01"),
+ guidForShortName("user02"),
+ ]),
+ ]
+ self._service.reloadCache(DirectoryService.recordType_groups, guid=guidForShortName("group03"))
+ group1 = self._service.recordWithShortName(DirectoryService.recordType_groups, "group01")
+ self.assertTrue(group1 is not None)
+
+ group2 = self._service.recordWithShortName(DirectoryService.recordType_groups, "group02")
+ self.assertTrue(group2 is not None)
+
+ group3 = self._service.recordWithShortName(DirectoryService.recordType_groups, "group03")
+ self.assertTrue(group2 is not None)
+
+ user1 = self._service.recordWithShortName(DirectoryService.recordType_users, "user01")
+ self.assertTrue(user1 is not None)
+ self.assertEqual(set((group1, group3)), user1.groups())
+
+ user2 = self._service.recordWithShortName(DirectoryService.recordType_users, "user02")
+ self.assertTrue(user2 is not None)
+ self.assertEqual(set((group2, group3)), user2.groups())
+
def fakeODRecord(fullName, shortName=None, guid=None, email=None, members=None):
if shortName is None:
shortName = shortNameForFullName(fullName)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20081013/b327eaf7/attachment.html
More information about the calendarserver-changes
mailing list