[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