[CalendarServer-changes] [9318] CalendarServer/trunk/twistedcaldav
source_changes at macosforge.org
source_changes at macosforge.org
Thu May 31 10:46:36 PDT 2012
Revision: 9318
http://trac.macosforge.org/projects/calendarserver/changeset/9318
Author: cdaboo at apple.com
Date: 2012-05-31 10:46:35 -0700 (Thu, 31 May 2012)
Log Message:
-----------
Make sure we don't keeping expanding instances when we have a valid cache.
Modified Paths:
--------------
CalendarServer/trunk/twistedcaldav/ical.py
CalendarServer/trunk/twistedcaldav/test/test_icalendar.py
Modified: CalendarServer/trunk/twistedcaldav/ical.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/ical.py 2012-05-31 00:06:04 UTC (rev 9317)
+++ CalendarServer/trunk/twistedcaldav/ical.py 2012-05-31 17:46:35 UTC (rev 9318)
@@ -1025,7 +1025,9 @@
def cacheExpandedTimeRanges(self, limit, ignoreInvalidInstances=False):
"""
Expand instances up to the specified limit and cache the results in this object
- so we can return cached results in the future.
+ so we can return cached results in the future. The limit value is the actual value
+ that the requester needs, but we will cache an addition 365-days worth to give us some
+ breathing room to return results for future instances.
@param limit: the max datetime to cache up to.
@type limit: L{PyCalendarDateTime}
@@ -1039,8 +1041,11 @@
# so return cached instances
return self.cachedInstances
- self.cachedInstances = self.expandTimeRanges(limit,
- ignoreInvalidInstances=ignoreInvalidInstances)
+ lookAheadLimit = limit + PyCalendarDuration(days=365)
+ self.cachedInstances = self.expandTimeRanges(
+ lookAheadLimit,
+ ignoreInvalidInstances=ignoreInvalidInstances
+ )
return self.cachedInstances
def expandTimeRanges(self, limit, ignoreInvalidInstances=False, normalizeFunction=normalizeForIndex):
@@ -1182,9 +1187,7 @@
# Check whether we have a truncated RRULE
rrules = master.properties("RRULE")
if len(tuple(rrules)):
- limit = rid.duplicate()
- limit += PyCalendarDuration(days=365)
- instances = self.cacheExpandedTimeRanges(limit)
+ instances = self.cacheExpandedTimeRanges(rid)
rids = set([instances[key].rid for key in instances])
instance_rid = normalizeForIndex(rid)
if instance_rid not in rids:
@@ -1243,6 +1246,7 @@
valid = set()
non_master_rids = [rid for rid in rids if rid is not None]
if non_master_rids:
+ # Pre-cache instance expansion up to the highest rid
highest_rid = max(non_master_rids)
self.cacheExpandedTimeRanges(
highest_rid + PyCalendarDuration(days=1),
@@ -1271,7 +1275,7 @@
# Get expansion
instances = self.cacheExpandedTimeRanges(
- rid + PyCalendarDuration(days=1),
+ rid,
ignoreInvalidInstances=ignoreInvalidInstances
)
new_rids = set([instances[key].rid for key in instances])
Modified: CalendarServer/trunk/twistedcaldav/test/test_icalendar.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_icalendar.py 2012-05-31 00:06:04 UTC (rev 9317)
+++ CalendarServer/trunk/twistedcaldav/test/test_icalendar.py 2012-05-31 17:46:35 UTC (rev 9318)
@@ -4161,6 +4161,45 @@
derived = str(derived).replace("\r", "") if derived else None
self.assertEqual(derived, result, "Failed derive instance test: %s" % (title,))
+ def test_derive_instance_cache(self):
+ """
+ Test that derivation of instances only triggers an instance cache re-expansion when it
+ goes past the end of the last cache.
+ """
+
+ event = """BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//CALENDARSERVER.ORG//NONSGML Version 1//EN
+BEGIN:VEVENT
+UID:12345-67890-1
+DTSTART:20090101T080000Z
+DTEND:20090101T090000Z
+DTSTAMP:20080601T120000Z
+RRULE:FREQ=DAILY
+END:VEVENT
+END:VCALENDAR
+"""
+
+ ical = Component.fromString(event)
+ self.assertFalse(hasattr(ical, "cachedInstances"))
+
+ # Derive one day apart - no re-cache
+ ical.deriveInstance(PyCalendarDateTime(2009, 1, 2, 8, 0, 0, tzid=PyCalendarTimezone(utc=True)))
+ self.assertTrue(hasattr(ical, "cachedInstances"))
+ oldLimit = ical.cachedInstances.limit
+ ical.deriveInstance(PyCalendarDateTime(2009, 1, 3, 8, 0, 0, tzid=PyCalendarTimezone(utc=True)))
+ self.assertEqual(ical.cachedInstances.limit, oldLimit)
+
+ # Derive several years ahead - re-cached
+ ical.deriveInstance(PyCalendarDateTime(2011, 1, 1, 8, 0, 0, tzid=PyCalendarTimezone(utc=True)))
+ self.assertNotEqual(ical.cachedInstances.limit, oldLimit)
+ oldLimit = ical.cachedInstances.limit
+
+ # Check one day ahead again - no re-cache
+ ical.deriveInstance(PyCalendarDateTime(2011, 1, 2, 8, 0, 0, tzid=PyCalendarTimezone(utc=True)))
+ self.assertEqual(ical.cachedInstances.limit, oldLimit)
+
+
def test_truncate_recurrence(self):
data = (
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20120531/f3cff8c7/attachment.html>
More information about the calendarserver-changes
mailing list