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

source_changes at macosforge.org source_changes at macosforge.org
Thu Sep 5 13:44:26 PDT 2013


Revision: 11655
          http://trac.calendarserver.org//changeset/11655
Author:   sagen at apple.com
Date:     2013-09-05 13:44:26 -0700 (Thu, 05 Sep 2013)
Log Message:
-----------
Deal with unparsable membership cache files

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

Modified: CalendarServer/trunk/twistedcaldav/directory/directory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/directory.py	2013-09-05 01:13:51 UTC (rev 11654)
+++ CalendarServer/trunk/twistedcaldav/directory/directory.py	2013-09-05 20:44:26 UTC (rev 11655)
@@ -813,7 +813,7 @@
             # populated the membership cache, and if so, return immediately
             if isPopulated:
                 self.log.info("Group membership cache is already populated")
-                returnValue((fast, 0))
+                returnValue((fast, 0, 0))
 
             # We don't care what others are doing right now, we need to update
             useLock = False
@@ -832,15 +832,21 @@
         else:
             self.log.info("Group membership snapshot file exists: %s" %
                 (membershipsCacheFile.path,))
-            previousMembers = pickle.loads(membershipsCacheFile.getContent())
             callGroupsChanged = True
+            try:
+                previousMembers = pickle.loads(membershipsCacheFile.getContent())
+            except:
+                self.log.warn("Could not parse snapshot; will regenerate cache")
+                fast = False
+                previousMembers = {}
+                callGroupsChanged = False
 
         if useLock:
             self.log.info("Attempting to acquire group membership cache lock")
             acquiredLock = (yield self.cache.acquireLock())
             if not acquiredLock:
                 self.log.info("Group membership cache lock held by another process")
-                returnValue((fast, 0))
+                returnValue((fast, 0, 0))
             self.log.info("Acquired lock")
 
         if not fast and self.useExternalProxies:
@@ -850,7 +856,11 @@
             if extProxyCacheFile.exists():
                 self.log.info("External proxies snapshot file exists: %s" %
                     (extProxyCacheFile.path,))
-                previousAssignments = pickle.loads(extProxyCacheFile.getContent())
+                try:
+                    previousAssignments = pickle.loads(extProxyCacheFile.getContent())
+                except:
+                    self.log.warn("Could not parse external proxies snapshot")
+                    previousAssignments = []
 
             if useLock:
                 yield self.cache.extendLock()

Modified: CalendarServer/trunk/twistedcaldav/directory/test/test_directory.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/directory/test/test_directory.py	2013-09-05 01:13:51 UTC (rev 11654)
+++ CalendarServer/trunk/twistedcaldav/directory/test/test_directory.py	2013-09-05 20:44:26 UTC (rev 11655)
@@ -243,7 +243,7 @@
         # Prevent an update by locking the cache
         acquiredLock = (yield cache.acquireLock())
         self.assertTrue(acquiredLock)
-        self.assertEquals((False, 0), (yield updater.updateCache()))
+        self.assertEquals((False, 0, 0), (yield updater.updateCache()))
 
         # You can't lock when already locked:
         acquiredLockAgain = (yield cache.acquireLock())
@@ -667,7 +667,7 @@
         # as indicated by the return value for "fast".  Note that the cache
         # is already populated so updateCache( ) in fast mode will not do
         # anything, and numMembers will be 0.
-        fast, numMembers = (yield updater.updateCache(fast=True))
+        fast, numMembers, numChanged = (yield updater.updateCache(fast=True))
         self.assertEquals(fast, True)
         self.assertEquals(numMembers, 0)
 
@@ -678,61 +678,70 @@
         self.assertEquals(numChanged, 0)
 
         # Verify the snapshot contains the pickled dictionary we expect
+        expected = {
+            "46D9D716-CBEE-490F-907A-66FA6C3767FF":
+                set([
+                    u"00599DAF-3E75-42DD-9DB7-52617E79943F",
+                ]),
+            "5A985493-EE2C-4665-94CF-4DFEA3A89500":
+                set([
+                    u"non_calendar_group",
+                    u"recursive1_coasts",
+                    u"recursive2_coasts",
+                    u"both_coasts"
+                ]),
+            "6423F94A-6B76-4A3A-815B-D52CFD77935D":
+                set([
+                    u"left_coast",
+                    u"recursive1_coasts",
+                    u"recursive2_coasts",
+                    u"both_coasts"
+                ]),
+            "5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1":
+                set([
+                    u"left_coast",
+                    u"both_coasts"
+                ]),
+            "8B4288F6-CC82-491D-8EF9-642EF4F3E7D0":
+                set([
+                    u"non_calendar_group",
+                    u"left_coast",
+                    u"both_coasts"
+                ]),
+            "left_coast":
+                 set([
+                     u"both_coasts"
+                 ]),
+            "recursive1_coasts":
+                 set([
+                     u"recursive1_coasts",
+                     u"recursive2_coasts"
+                 ]),
+            "recursive2_coasts":
+                set([
+                    u"recursive1_coasts",
+                    u"recursive2_coasts"
+                ]),
+            "right_coast":
+                set([
+                    u"both_coasts"
+                ])
+        }
         members = pickle.loads(snapshotFile.getContent())
-        self.assertEquals(
-            members,
-            {
-                "46D9D716-CBEE-490F-907A-66FA6C3767FF":
-                    set([
-                        u"00599DAF-3E75-42DD-9DB7-52617E79943F",
-                    ]),
-                "5A985493-EE2C-4665-94CF-4DFEA3A89500":
-                    set([
-                        u"non_calendar_group",
-                        u"recursive1_coasts",
-                        u"recursive2_coasts",
-                        u"both_coasts"
-                    ]),
-                "6423F94A-6B76-4A3A-815B-D52CFD77935D":
-                    set([
-                        u"left_coast",
-                        u"recursive1_coasts",
-                        u"recursive2_coasts",
-                        u"both_coasts"
-                    ]),
-                "5FF60DAD-0BDE-4508-8C77-15F0CA5C8DD1":
-                    set([
-                        u"left_coast",
-                        u"both_coasts"
-                    ]),
-                "8B4288F6-CC82-491D-8EF9-642EF4F3E7D0":
-                    set([
-                        u"non_calendar_group",
-                        u"left_coast",
-                        u"both_coasts"
-                    ]),
-                "left_coast":
-                     set([
-                         u"both_coasts"
-                     ]),
-                "recursive1_coasts":
-                     set([
-                         u"recursive1_coasts",
-                         u"recursive2_coasts"
-                     ]),
-                "recursive2_coasts":
-                    set([
-                        u"recursive1_coasts",
-                        u"recursive2_coasts"
-                    ]),
-                "right_coast":
-                    set([
-                        u"both_coasts"
-                    ])
-            }
-        )
+        self.assertEquals(members, expected)
+        
+        # "Corrupt" the snapshot and verify it is regenerated properly
+        snapshotFile.setContent("xyzzy")
+        cache.delete("group-cacher-populated")
+        fast, numMembers, numChanged = (yield updater.updateCache(fast=True))
+        self.assertEquals(fast, False)
+        self.assertEquals(numMembers, 9)
+        self.assertEquals(numChanged, 9)
+        self.assertTrue(snapshotFile.exists())
+        members = pickle.loads(snapshotFile.getContent())
+        self.assertEquals(members, expected)
+        
 
-
     def test_autoAcceptMembers(self):
         """
         autoAcceptMembers( ) returns an empty list if no autoAcceptGroup is
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20130905/721ba2f0/attachment.html>


More information about the calendarserver-changes mailing list