[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