[CalendarServer-changes] [6733] CalendarServer/trunk/contrib/performance/loadtest
source_changes at macosforge.org
source_changes at macosforge.org
Thu Jan 13 12:02:24 PST 2011
Revision: 6733
http://trac.macosforge.org/projects/calendarserver/changeset/6733
Author: exarkun at twistedmatrix.com
Date: 2011-01-13 12:02:16 -0800 (Thu, 13 Jan 2011)
Log Message:
-----------
Add a request logger; refactor some things out of run() to try to keep it as high level as possible; fix some bugs preventing each calendar and event from being visited.
Modified Paths:
--------------
CalendarServer/trunk/contrib/performance/loadtest/ical.py
CalendarServer/trunk/contrib/performance/loadtest/population.py
Modified: CalendarServer/trunk/contrib/performance/loadtest/ical.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/ical.py 2011-01-13 05:48:12 UTC (rev 6732)
+++ CalendarServer/trunk/contrib/performance/loadtest/ical.py 2011-01-13 20:02:16 UTC (rev 6733)
@@ -21,7 +21,7 @@
from xml.etree import ElementTree
ElementTree.QName.__repr__ = lambda self: '<QName %r>' % (self.text,)
-from twisted.python.log import err, msg
+from twisted.python.log import addObserver, err, msg
from twisted.python.filepath import FilePath
from twisted.internet.defer import Deferred, inlineCallbacks, returnValue
from twisted.internet.task import LoopingCall
@@ -62,6 +62,13 @@
class SnowLeopard(object):
"""
Implementation of the SnowLeopard iCal network behavior.
+
+ Anything SnowLeopard iCal does on its own, or any particular
+ network behaviors it takes in response to a user action, belong on
+ this class.
+
+ Usage-profile based behaviors ("the user modifies an event every
+ 3.2 minutes") belong elsewhere.
"""
USER_AGENT = "DAVKit/4.0.3 (732); CalendarStore/4.0.3 (991); iCal/4.0.3 (1388); Mac OS X/10.6.4 (10F569)"
@@ -97,6 +104,7 @@
def _request(self, expectedResponseCode, method, url, headers, body):
headers.setRawHeaders('User-Agent', [self.USER_AGENT])
+ msg(type="request", method=method, url=url)
d = self.agent.request(method, url, headers, body)
before = self.reactor.seconds()
def report(response):
@@ -106,7 +114,7 @@
# to receive full response. Should measure the latter, if
# not both.
msg(
- type="request", success=success, method=method,
+ type="response", success=success, method=method,
duration=(after - before), url=url)
return response
d.addCallback(report)
@@ -235,15 +243,20 @@
if responseHref == calendar.url:
continue
- etag = result[responseHref].getTextProperties()[davxml.getetag]
+ try:
+ etag = result[responseHref].getTextProperties()[davxml.getetag]
+ except KeyError:
+ # XXX Ignore things with no etag? Seems to be dropbox.
+ continue
+
if responseHref not in self._events:
self._events[responseHref] = Event(responseHref, None)
if self._events[responseHref].etag != etag:
response = yield self._updateEvent(url, responseHref)
body = yield readBody(response)
- result = self._parseMultiStatus(body)[responseHref]
- etag = result.getTextProperties()[davxml.getetag]
+ res = self._parseMultiStatus(body)[responseHref]
+ etag = res.getTextProperties()[davxml.getetag]
self._events[responseHref].etag = etag
@@ -264,7 +277,6 @@
for cal in calendars:
if self._calendars.setdefault(cal.url, cal).ctag != cal.ctag or True:
self._updateCalendar(cal)
- break
d.addCallback(cbCalendars)
return d
@@ -323,6 +335,20 @@
returnValue(principal)
+ def _calendarCheckLoop(self, calendarHome):
+ """
+ Poll Calendar Home (and notifications?) every 15 (or whatever)
+ minutes
+ """
+ pollCalendarHome = LoopingCall(
+ self._checkCalendarsForEvents, calendarHome)
+ pollCalendarHome.start(self.CALENDAR_HOME_POLL_INTERVAL)
+
+
+ def _eventChangeLoop(self):
+ pass
+
+
@inlineCallbacks
def run(self):
"""
@@ -331,16 +357,18 @@
principal = yield self.startup()
hrefs = principal.getHrefProperties()
- # Poll Calendar Home (and notifications?) every 15 (or
- # whatever) minutes
- pollCalendarHome = LoopingCall(
- self._checkCalendarsForEvents,
- hrefs[caldavxml.calendar_home_set].toString())
- pollCalendarHome.start(self.CALENDAR_HOME_POLL_INTERVAL)
+ self._calendarCheckLoop(hrefs[caldavxml.calendar_home_set].toString())
+ self._eventChangeLoop()
yield Deferred()
+class RequestLogger(object):
+ def observe(self, event):
+ if event.get("type") == "request":
+ print event["method"], event["url"]
+
+
def main():
from urllib2 import HTTPDigestAuthHandler
from twisted.internet import reactor
@@ -350,6 +378,9 @@
uri="http://127.0.0.1:8008/",
user="user01",
passwd="user01")
+
+ addObserver(RequestLogger().observe)
+
client = SnowLeopard(reactor, '127.0.0.1', 8008, 'user01', auth)
d = client.run()
d.addErrback(err, "Snow Leopard client run() problem")
Modified: CalendarServer/trunk/contrib/performance/loadtest/population.py
===================================================================
--- CalendarServer/trunk/contrib/performance/loadtest/population.py 2011-01-13 05:48:12 UTC (rev 6732)
+++ CalendarServer/trunk/contrib/performance/loadtest/population.py 2011-01-13 20:02:16 UTC (rev 6733)
@@ -23,7 +23,7 @@
from itertools import izip
from stats import mean, median, stddev, mad
-from loadtest.ical import SnowLeopard
+from loadtest.ical import SnowLeopard, RequestLogger
class PopulationParameters(object):
@@ -107,7 +107,7 @@
class StatisticsBase(object):
def observe(self, event):
- if event.get('type') == 'request':
+ if event.get('type') == 'response':
self.eventReceived(event)
@@ -181,7 +181,7 @@
for method, data in self._perMethodTimes.iteritems():
self._printData(*self._summarizeData(method, data))
-
+
def main():
import random
@@ -192,6 +192,7 @@
report = ReportStatistics()
addObserver(SimpleStatistics().observe)
addObserver(report.observe)
+ addObserver(RequestLogger().observe)
r = random.Random()
r.seed(100)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20110113/f117b4ba/attachment.html>
More information about the calendarserver-changes
mailing list