extras-buildsys/builder builder.py,1.44.2.7,1.44.2.8

Daniel Williams (dcbw) fedora-extras-commits at redhat.com
Sun Mar 12 05:53:01 UTC 2006


Author: dcbw

Update of /cvs/fedora/extras-buildsys/builder
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv17091/builder

Modified Files:
      Tag: STABLE_0_4
	builder.py 
Log Message:
2006-03-12  Dan Williams  <dcbw at redhat.com>

    * builder/builder.py
        - Add a SIGTERM handler for clean shutdown
        - Clean up lifecycle management

    * common/HTTPServer.py
        - Clean up lifecycle management of PlgHTTPServerManager objects

    * common/SSLCommon.py
        - Clean up lifecycle management of PlgBaseServer objects
        - Initialize correct parent object in PlgBaseSSLServer.__init__

    * etc/plague-builder.init
      etc/plague-server.init
        - Cleanups

    * server/main.py
        - Add a SIGTERM handler for clean shutdown
        - Clean up lifecycle management




Index: builder.py
===================================================================
RCS file: /cvs/fedora/extras-buildsys/builder/builder.py,v
retrieving revision 1.44.2.7
retrieving revision 1.44.2.8
diff -u -r1.44.2.7 -r1.44.2.8
--- builder.py	19 Feb 2006 06:57:21 -0000	1.44.2.7
+++ builder.py	12 Mar 2006 05:52:54 -0000	1.44.2.8
@@ -29,6 +29,7 @@
 import errno
 import exceptions
 import threading
+import signal
 from plague import ArchUtils
 from plague import FileDownloader
 from plague import AuthedXMLRPCServer
@@ -44,6 +45,10 @@
 certs = {}
 build_arches = []
 
+def log(string):
+    sys.stdout.write(string)
+    sys.stdout.flush()
+
 
 def get_hostname(cfg, bind_all):
     cfg_hostname = cfg.get_str("Network", "hostname")
@@ -805,7 +810,16 @@
     return max_jobs
 
 
+bserver = None
+
+def exit_handler(signum, frame):
+    global bserver
+    log("Received SIGTERM, quitting...\n")
+    bserver.stop()
+
 def main():
+    global bserver
+
     usage = "Usage: %s  [-p <pidfile>] [-l <logfile>] [-d] -c <configfile>" % sys.argv[0]
     parser = OptionParser(usage=usage)
     parser.add_option("-p", "--pidfile", default=None,
@@ -819,7 +833,7 @@
     (opts, args) = parser.parse_args()
 
     if not opts.configfile:
-        print "Must specify a config file."
+        log("Must specify a config file.\n")
         sys.exit(1)
 
     # Load in the config
@@ -834,18 +848,18 @@
 
     build_arches = determine_build_arches(cfg)
     if not len(build_arches):
-        print "Cannot determine buildable arches for this builder.  Exiting..."
+        log("Cannot determine buildable arches for this builder.  Exiting...\n")
         sys.exit(1)
 
     cfg.load_target_configs(build_arches)
     if len(cfg.targets()) == 0:
-        print "No useable mock buildroots configured.  Exiting..."
+        log("No useable mock buildroots configured.  Exiting...\n")
         sys.exit(1)
 
     if opts.daemon:
         ret=daemonize.createDaemon()
         if ret:
-            print "Daemonizing failed!"
+            log("Daemonizing failed!\n")
             sys.exit(2)
 
     if opts.pidfile:
@@ -861,7 +875,7 @@
 
     work_dir = cfg.get_str("Directories", "builder_work_dir")
     if not os.path.exists(work_dir) or not os.access(work_dir, os.R_OK):
-        print "%s does not exist or is not readable." % work_dir
+        log("%s does not exist or is not readable.\n" % work_dir)
         os._exit(1)
 
     # Start up the HTTP server thread which the build server
@@ -880,44 +894,52 @@
             pass
         os._exit(1)
 
-    print "Binding to address '%s' with arches: [%s]" % (hostname, string.join(build_arches, ","))
+    log("Binding to address '%s' with arches: [%s]\n" % (hostname, string.join(build_arches, ",")))
     xmlrpc_port = cfg.get_int("Network", "xmlrpc_port")
     try:
         if cfg.get_bool("SSL", "use_ssl") == True:
-            xmlserver = AuthedXMLRPCServer.AuthedSSLXMLRPCServer((hostname, xmlrpc_port), None, certs)
+            bserver = AuthedXMLRPCServer.AuthedSSLXMLRPCServer((hostname, xmlrpc_port), None, certs)
         else:
-            xmlserver = AuthedXMLRPCServer.AuthedXMLRPCServer((hostname, xmlrpc_port), None)
+            bserver = AuthedXMLRPCServer.AuthedXMLRPCServer((hostname, xmlrpc_port), None)
     except socket.error, e:
         if e[0] == 98:
-            print "Error: couldn't bind to address '%s:%s'.  "  \
-                       "Is the builder already running?" % (hostname, xmlrpc_port)
+            log("Error: couldn't bind to address '%s:%s'.  "  \
+                       "Is the builder already running?\n" % (hostname, xmlrpc_port))
             os._exit(1)
 
     max_jobs = determine_max_jobs(cfg)
     bcs = XMLRPCBuilderServer(cfg, max_jobs)
-    xmlserver.register_instance(bcs)
+    bserver.register_instance(bcs)
+
+    # Set up our termination handler
+    signal.signal(signal.SIGTERM, exit_handler)
 
-    last_time = time.time()
     try:
-        while True:
-            xmlserver.handle_request()
+        bserver.handle_request()
     except KeyboardInterrupt, e:
-        print "Shutting down..."
-        (building_jobs, free) = bcs.building_jobs()
-        for jobid in building_jobs.keys():
-            bcs.die(jobid)
-        # wait for the jobs to clean up before quitting
-        while True:
-            (building_jobs, free) = bcs.building_jobs()
-            if len(building_jobs.keys()) == 0:
-                break
-            try:
-                print "Waiting for building jobs to stop"
-                time.sleep(1)
-            except KeyboardInterrupt:
-                break
+        bserver.server_close()
 
+    log("Shutting down...\n")
     http_server.stop()
+
+    (building_jobs, free) = bcs.building_jobs()
+    for jobid in building_jobs.keys():
+        bcs.die(jobid)
+
+    # wait for the jobs to clean up before quitting
+    log("Waiting for running jobs to stop...")
+    while True:
+        (building_jobs, free) = bcs.building_jobs()
+        if len(building_jobs.keys()) == 0:
+            break
+        try:
+            log(".")
+            time.sleep(0.5)
+        except KeyboardInterrupt:
+            break
+    log(" done.\n");
+    sys.stdout.flush()
+    time.sleep(2)
     os._exit(0)
 
 




More information about the fedora-extras-commits mailing list