[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