changeset 95:1984b2e01998

Make the repository poll interval configurable. It now defaults to 2 minutes instead of 10 seconds.
author cmlenz
date Fri, 15 Jul 2005 16:07:11 +0000
parents e5d1a792aa45
children c8c36f34ff5a
files bitten/master.py bitten/util/beep.py
diffstat 2 files changed, 27 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/bitten/master.py
+++ b/bitten/master.py
@@ -18,6 +18,7 @@
 #
 # Author: Christopher Lenz <cmlenz@gmx.de>
 
+from datetime import datetime, timedelta
 from itertools import ifilter
 import logging
 import os.path
@@ -34,15 +35,18 @@
 
 log = logging.getLogger('bitten.master')
 
+DEFAULT_CHECK_INTERVAL = 120 # 2 minutes
+
+
 
 class Master(beep.Listener):
 
-    TRIGGER_INTERVAL = 10
-
-    def __init__(self, env_path, ip, port):
+    def __init__(self, env_path, ip, port,
+                 check_interval=DEFAULT_CHECK_INTERVAL):
         beep.Listener.__init__(self, ip, port)
         self.profiles[OrchestrationProfileHandler.URI] = OrchestrationProfileHandler
         self.env = Environment(env_path)
+        self.check_interval = check_interval
 
         self.slaves = {}
 
@@ -53,7 +57,7 @@
             for rev, format, path in snapshots:
                 self.snapshots[(config.name, rev, format)] = path
 
-        self.schedule(self.TRIGGER_INTERVAL, self._check_build_triggers)
+        self.schedule(self.check_interval, self._check_build_triggers)
 
     def close(self):
         # Remove all pending builds
@@ -62,7 +66,7 @@
         beep.Listener.close(self)
 
     def _check_build_triggers(self, when):
-        self.schedule(self.TRIGGER_INTERVAL, self._check_build_triggers)
+        self.schedule(self.check_interval, self._check_build_triggers)
 
         repos = self.env.get_repository()
         try:
@@ -80,7 +84,7 @@
                         builds = Build.select(self.env, config.name, rev,
                                               platform.id)
                         if not list(builds):
-                            log.info('Enqueuing build of configuration "%s"at '
+                            log.info('Enqueuing build of configuration "%s" at '
                                      'revision [%s] on %s', config.name, rev,
                                      platform.name)
                             build = Build(self.env)
@@ -95,8 +99,8 @@
         finally:
             repos.close()
 
-        self.schedule(5, self._check_build_queue)
-        self.schedule(60, self._cleanup_snapshots)
+        self.schedule(self.check_interval * 0.2, self._check_build_queue)
+        self.schedule(self.check_interval * 1.8, self._cleanup_snapshots)
 
     def _check_build_queue(self, when):
         if not self.slaves:
@@ -161,6 +165,8 @@
                         'platforms', handler.name)
             return False
 
+        self.schedule(self.check_interval * 0.2, self._check_build_queue)
+
         log.info('Registered slave "%s"', handler.name)
         return True
 
@@ -366,6 +372,9 @@
                       help='the host name or IP address to bind to')
     parser.add_option('-l', '--log', dest='logfile', metavar='FILENAME',
                       help='write log messages to FILENAME')
+    parser.add_option('-i', '--interval', dest='interval', metavar='SECONDS',
+                      default=DEFAULT_CHECK_INTERVAL, type='int',
+                      help='poll interval for changeset detection')
     parser.add_option('--debug', action='store_const', dest='loglevel',
                       const=logging.DEBUG, help='enable debugging output')
     parser.add_option('-v', '--verbose', action='store_const', dest='loglevel',
@@ -412,7 +421,7 @@
             log.warning('Reverse host name lookup failed (%s)', e)
             host = ip
 
-    master = Master(env_path, host, port)
+    master = Master(env_path, host, port, check_interval=options.interval)
     try:
         master.run(timeout=5.0)
     except KeyboardInterrupt:
--- a/bitten/util/beep.py
+++ b/bitten/util/beep.py
@@ -30,6 +30,7 @@
 import asynchat
 import asyncore
 import bisect
+from datetime import datetime, timedelta
 import email
 import logging
 import socket
@@ -101,11 +102,12 @@
 
     def run(self, timeout=15.0, granularity=5):
         """Start listening to incoming connections."""
+        granularity = timedelta(seconds=granularity)
         socket_map = asyncore.socket_map
-        last_event_check = 0
+        last_event_check = datetime.min
         while socket_map:
-            now = int(time.time())
-            if (now - last_event_check) >= granularity:
+            now = datetime.now()
+            if now - last_event_check >= granularity:
                 last_event_check = now
                 fired = []
                 i = j = 0
@@ -130,7 +132,10 @@
                       invoked
         @param callback: The function to call
         """
-        bisect.insort(self.eventqueue, (int(time.time()) + delta, callback))
+        when = datetime.now() + timedelta(seconds=delta)
+        log.debug('Scheduling event %s to run at %s', callback.__name__, when)
+
+        bisect.insort(self.eventqueue, (when, callback))
 
     def quit(self):
         if not self.sessions:
Copyright (C) 2012-2017 Edgewall Software