[CalendarServer-changes] [8243] CalendarServer/branches/users/glyph/parallel-sim/contrib/performance /loadtest
source_changes at macosforge.org
source_changes at macosforge.org
Tue Nov 1 17:50:59 PDT 2011
Revision: 8243
http://trac.macosforge.org/projects/calendarserver/changeset/8243
Author: glyph at apple.com
Date: 2011-11-01 17:50:59 -0700 (Tue, 01 Nov 2011)
Log Message:
-----------
split out simulator 'run' into several reusable, independent services.
Modified Paths:
--------------
CalendarServer/branches/users/glyph/parallel-sim/contrib/performance/loadtest/sim.py
CalendarServer/branches/users/glyph/parallel-sim/contrib/performance/loadtest/test_sim.py
Modified: CalendarServer/branches/users/glyph/parallel-sim/contrib/performance/loadtest/sim.py
===================================================================
--- CalendarServer/branches/users/glyph/parallel-sim/contrib/performance/loadtest/sim.py 2011-11-02 00:50:44 UTC (rev 8242)
+++ CalendarServer/branches/users/glyph/parallel-sim/contrib/performance/loadtest/sim.py 2011-11-02 00:50:59 UTC (rev 8243)
@@ -28,6 +28,9 @@
from twisted.python.usage import UsageError, Options
from twisted.python.reflect import namedAny
+from twisted.application.service import Service
+from twisted.application.service import MultiService
+
from contrib.performance.loadtest.ical import SnowLeopard
from contrib.performance.loadtest.profiles import Eventer, Inviter, Accepter
from contrib.performance.loadtest.population import (
@@ -293,33 +296,109 @@
def run(self, output=stdout):
- for obs in self.observers:
- addObserver(obs.observe)
- sim = self.createSimulator()
+ ms = MultiService()
+ for svcclass in [
+ ObserverService,
+ SimulatorService,
+ ReporterService,
+ ]:
+ svcclass(self, output).setServiceParent(ms)
- def stop():
- for obs in self.observers:
- removeObserver(obs.observe)
- sim.stop()
- self.reactor.addSystemEventTrigger('before', 'shutdown', stop)
+ attachService(self.reactor, ms)
- arrivalPolicy = self.createArrivalPolicy()
- arrivalPolicy.run(sim)
if self.runtime is not None:
self.reactor.callLater(self.runtime, self.reactor.stop)
+
self.reactor.run()
+
+
+
+def attachService(reactor, service):
+ """
+ Attach a given L{IService} provider to the given L{IReactorCore}; cause it
+ to be started when the reactor starts, and stopped when the reactor stops.
+ """
+ reactor.callWhenRunning(service.startService)
+ reactor.addSystemEventTrigger('before', 'shutdown', service.stopService)
+
+
+
+class SimService(Service, object):
+ """
+ Base class for services associated with the L{LoadSimulator}.
+ """
+
+ def __init__(self, loadsim, output):
+ super(SimService, self).__init__()
+ self.loadsim = loadsim
+ self.output = output
+
+
+
+class ObserverService(SimService):
+ """
+ A service that adds and removes a L{LoadSimulator}'s set of observers at
+ start and stop time.
+ """
+
+ def startService(self):
+ """
+ Start observing.
+ """
+ super(ObserverService, self).startService()
+ for obs in self.loadsim.observers:
+ addObserver(obs.observe)
+
+
+ def stopService(self):
+ super(ObserverService, self).startService()
+ for obs in self.loadsim.observers:
+ removeObserver(obs.observe)
+
+
+
+class SimulatorService(SimService):
+ """
+ A service that starts the L{CalendarClientSimulator} associated with the
+ L{LoadSimulator} and stops it at shutdown.
+ """
+
+ def startService(self):
+ super(SimulatorService, self).startService()
+ self.clientsim = self.loadsim.createSimulator()
+ arrivalPolicy = self.loadsim.createArrivalPolicy()
+ arrivalPolicy.run(self.clientsim)
+
+
+ def stopService(self):
+ super(SimulatorService, self).stopService()
+ return self.clientsim.stop()
+
+
+
+class ReporterService(SimService):
+ """
+ A service which reports all the results from all the observers on a load
+ simulator when it is stopped.
+ """
+
+ def stopService(self):
+ super(ReporterService, self).stopService()
failures = []
- for obs in self.observers:
+ for obs in self.loadsim.observers:
obs.report()
failures.extend(obs.failures())
if failures:
- output.write('FAIL\n')
- output.write('\n'.join(failures))
- output.write('\n')
+ self.output.write('FAIL\n')
+ self.output.write('\n'.join(failures))
+ self.output.write('\n')
else:
- output.write('PASS\n')
+ self.output.write('PASS\n')
+
main = LoadSimulator.main
+
+
if __name__ == '__main__':
main()
Modified: CalendarServer/branches/users/glyph/parallel-sim/contrib/performance/loadtest/test_sim.py
===================================================================
--- CalendarServer/branches/users/glyph/parallel-sim/contrib/performance/loadtest/test_sim.py 2011-11-02 00:50:44 UTC (rev 8242)
+++ CalendarServer/branches/users/glyph/parallel-sim/contrib/performance/loadtest/test_sim.py 2011-11-02 00:50:59 UTC (rev 8243)
@@ -177,14 +177,28 @@
class Reactor(object):
message = "some event to be observed"
+ def __init__(self):
+ self._triggers = []
+ self._whenRunning = []
+
+
def run(self):
+ for thunk in self._whenRunning:
+ thunk()
msg(self.message)
+ for phase, event, thunk in self._triggers:
+ if event == 'shutdown':
+ thunk()
- def addSystemEventTrigger(self, *args):
- pass
+ def callWhenRunning(self, thunk):
+ self._whenRunning.append(thunk)
+ def addSystemEventTrigger(self, phase, event, thunk):
+ self._triggers.append((phase, event, thunk))
+
+
class Observer(object):
def __init__(self):
self.reported = False
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20111101/0c71da11/attachment-0001.html>
More information about the calendarserver-changes
mailing list