[CalendarServer-changes] [15570] CalendarServer/trunk/contrib/performance/loadtest

source_changes at macosforge.org source_changes at macosforge.org
Mon May 2 14:17:48 PDT 2016


Revision: 15570
          http://trac.calendarserver.org//changeset/15570
Author:   sagen at apple.com
Date:     2016-05-02 14:17:48 -0700 (Mon, 02 May 2016)
Log Message:
-----------
After the sim creates/updates an event, fetch the etag iff the etag header was not present in the response.  The AlarmAcknowledger sim profile comes up with unique resource names now, to avoid colliding with existing data.

Modified Paths:
--------------
    CalendarServer/trunk/contrib/performance/loadtest/ical.py
    CalendarServer/trunk/contrib/performance/loadtest/profiles.py

Modified: CalendarServer/trunk/contrib/performance/loadtest/ical.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/ical.py	2016-05-02 19:12:26 UTC (rev 15569)
+++ CalendarServer/trunk/contrib/performance/loadtest/ical.py	2016-05-02 21:17:48 UTC (rev 15570)
@@ -350,6 +350,13 @@
         del self._calendars[calendar + '/'].events[basePath]
 
 
+    def eventByHref(self, href):
+        """
+        Return the locally cached event by its href
+        """
+        return self._events[href]
+
+
     def addEvent(self, href, calendar):
         """
         Called when a profile needs to add an event (no scheduling).
@@ -1698,22 +1705,28 @@
         if len(attendees) > 75:
             label_suffix = "huge"
 
+        headers = Headers({
+            'content-type': ['text/calendar'],
+            'if-match': [event.etag]})
+        if event.etag is None:
+            headers.removeHeader('if-match')
+
         # At last, upload the new event definition
         response = yield self._request(
             (NO_CONTENT, PRECONDITION_FAILED,),
             'PUT',
             self.server["uri"] + href.encode('utf-8'),
-            Headers({
-                    'content-type': ['text/calendar'],
-                    'if-match': [event.etag]}),
+            headers,
             StringProducer(component.getTextWithTimezones(includeTimezones=True)),
             method_label="PUT{organizer-%s}" % (label_suffix,)
         )
 
         # Finally, re-retrieve the event to update the etag
-        yield self._updateEvent(response, href)
+        if not response.headers.hasHeader("etag"):
+            response = yield self.updateEvent(href)
 
 
+
     @inlineCallbacks
     def _attendeeAutoComplete(self, component, attendee):
 
@@ -1803,7 +1816,8 @@
         )
 
         # Finally, re-retrieve the event to update the etag
-        yield self._updateEvent(response, href)
+        if not response.headers.hasHeader("etag"):
+            response = yield self.updateEvent(href)
 
 
     @inlineCallbacks
@@ -1849,7 +1863,10 @@
         )
         self._localUpdateEvent(response, href, component)
 
+        if not response.headers.hasHeader("etag"):
+            response = yield self.updateEvent(href)
 
+
     @inlineCallbacks
     def addInvite(self, href, component):
         """
@@ -1874,21 +1891,25 @@
         event = self._events[href]
         component = event.component
 
+        headers = Headers({
+            'content-type': ['text/calendar'],
+            'if-match': [event.etag]})
+        if event.etag is None:
+            headers.removeHeader('if-match')
+
         # At last, upload the new event definition
         response = yield self._request(
             (NO_CONTENT, PRECONDITION_FAILED,),
             'PUT',
             self.server["uri"] + href.encode('utf-8'),
-            Headers({
-                'content-type': ['text/calendar'],
-                'if-match': [event.etag]
-            }),
+            headers,
             StringProducer(component.getTextWithTimezones(includeTimezones=True)),
             method_label="PUT{update}"
         )
 
         # Finally, re-retrieve the event to update the etag
-        yield self._updateEvent(response, href)
+        if not response.headers.hasHeader("etag"):
+            response = yield self.updateEvent(href)
 
 
     def _localUpdateEvent(self, response, href, component):
@@ -1901,12 +1922,8 @@
         self._setEvent(href, event)
 
 
+    @inlineCallbacks
     def updateEvent(self, href):
-        return self._updateEvent(None, href)
-
-
-    @inlineCallbacks
-    def _updateEvent(self, ignored, href):
         response = yield self._request(
             OK,
             'GET',
@@ -1918,6 +1935,7 @@
         scheduleTag = headers.getRawHeaders('schedule-tag', [None])[0]
         body = yield readBody(response)
         self.eventChanged(href, etag, scheduleTag, body)
+        returnValue(response)
 
 
     @inlineCallbacks

Modified: CalendarServer/trunk/contrib/performance/loadtest/profiles.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/profiles.py	2016-05-02 19:12:26 UTC (rev 15569)
+++ CalendarServer/trunk/contrib/performance/loadtest/profiles.py	2016-05-02 21:17:48 UTC (rev 15570)
@@ -886,7 +886,7 @@
 
         @return: a L{Deferred} that fires when initialization is done
         """
-
+        self.myEventHref = None
         return self._initEvent()
 
 
@@ -900,13 +900,13 @@
         # Don't perform any operations until the client is up and running
         if not self._client.started:
             return succeed(None)
+        try:
+            calendar = self._calendarsOfType(caldavxml.calendar, "VEVENT")[0]
+        except IndexError:
+            # There is no calendar
+            return succeed(None)
 
-        # If it already exists, don't re-create
-        calendar = self._calendarsOfType(caldavxml.calendar, "VEVENT")[0]
-        if calendar.events:
-            events = [event for event in calendar.events.values() if event.url.endswith("event_to_update.ics")]
-            if events:
-                return succeed(None)
+        self.myEventHref = '{}{}.ics'.format(calendar.url, str(uuid4()))
 
         # Copy the template event and fill in some of its fields
         # to make a new event to create on the calendar.
@@ -920,13 +920,13 @@
         vevent.replaceProperty(Property("DTSTART", dtstart))
         vevent.replaceProperty(Property("DTEND", dtend))
         vevent.replaceProperty(Property("UID", uid))
+        vevent.replaceProperty(Property("DESCRIPTION", "AlarmAcknowledger"))
 
         rrule = self._recurrenceDistribution.sample()
         if rrule is not None:
             vevent.addProperty(Property(None, None, None, pycalendar=rrule))
 
-        href = '%s%s' % (calendar.url, "event_to_update.ics")
-        d = self._client.addEvent(href, vcalendar)
+        d = self._client.addEvent(self.myEventHref, vcalendar)
         return self._newOperation("create", d)
 
 
@@ -962,19 +962,11 @@
         if not self._client.started:
             return succeed(None)
 
-        # If it does not exist, try to create it
-        try:
-            calendar = self._calendarsOfType(caldavxml.calendar, "VEVENT")[0]
-        except IndexError:
-            # There is no calendar
-            return succeed(None)
-        if not calendar.events:
+        if self.myEventHref is None:
             return self._initEvent()
-        events = [event for event in calendar.events.values() if event.url.endswith("event_to_update.ics")]
-        if not events:
-            return self._initEvent()
-        event = events[0]
 
+        event = self._client.eventByHref(self.myEventHref)
+
         # Add/update the ACKNOWLEDGED property
         component = event.component.mainComponent()
         component.replaceProperty(Property("ACKNOWLEDGED", DateTime.getNowUTC()))
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20160502/409616ed/attachment-0001.html>


More information about the calendarserver-changes mailing list