Add optional internal gearman server.

Change-Id: Id4e6b77f5abba23f46236def28f54509c61fd247
Reviewed-on: https://review.openstack.org/30170
Reviewed-by: Monty Taylor <mordred@inaugust.com>
Reviewed-by: Clark Boylan <clark.boylan@gmail.com>
Reviewed-by: Jeremy Stanley <fungi@yuggoth.org>
Approved: Clark Boylan <clark.boylan@gmail.com>
Tested-by: Jenkins
This commit is contained in:
James E. Blair 2013-05-22 14:44:58 -07:00 committed by Jenkins
parent 0f5cacd380
commit 922a9f6856
1 changed files with 38 additions and 5 deletions

View File

@ -28,6 +28,8 @@ import os
import sys
import signal
import gear
# No zuul imports here because they pull in paramiko which must not be
# imported until after the daemonization.
# https://github.com/paramiko/paramiko/issues/59
@ -37,6 +39,7 @@ class Server(object):
def __init__(self):
self.args = None
self.config = None
self.gear_server_pid = None
def parse_arguments(self):
parser = argparse.ArgumentParser(description='Project gating system.')
@ -65,9 +68,9 @@ class Server(object):
return
raise Exception("Unable to locate config file in %s" % locations)
def setup_logging(self):
if self.config.has_option('zuul', 'log_config'):
fp = os.path.expanduser(self.config.get('zuul', 'log_config'))
def setup_logging(self, section, parameter):
if self.config.has_option(section, parameter):
fp = os.path.expanduser(self.config.get(section, parameter))
if not os.path.exists(fp):
raise Exception("Unable to read logging config file at %s" %
fp)
@ -84,8 +87,13 @@ class Server(object):
def exit_handler(self, signum, frame):
signal.signal(signal.SIGUSR1, signal.SIG_IGN)
self.stop_gear_server()
self.sched.exit()
def term_handler(self, signum, frame):
self.stop_gear_server()
os._exit(0)
def test_config(self):
# See comment at top of file about zuul imports
import zuul.scheduler
@ -96,6 +104,26 @@ class Server(object):
self.sched = zuul.scheduler.Scheduler()
self.sched.testConfig(self.config.get('zuul', 'layout_config'))
def start_gear_server(self):
pipe_read, pipe_write = os.pipe()
child_pid = os.fork()
if child_pid == 0:
os.close(pipe_write)
self.setup_logging('gearman_server', 'log_config')
gear.Server(4730)
# Keep running until the parent dies:
pipe_read = os.fdopen(pipe_read)
pipe_read.read()
os._exit(0)
else:
os.close(pipe_read)
self.gear_server_pid = child_pid
self.gear_pipe_write = pipe_write
def stop_gear_server(self):
if self.gear_server_pid:
os.kill(self.gear_server_pid, signal.SIGKILL)
def main(self):
# See comment at top of file about zuul imports
import zuul.scheduler
@ -103,6 +131,12 @@ class Server(object):
import zuul.trigger.gerrit
import zuul.webapp
if (self.config.has_option('gearman_server', 'start') and
self.config.getboolean('gearman_server', 'start')):
self.start_gear_server()
self.setup_logging('zuul', 'log_config')
self.sched = zuul.scheduler.Scheduler()
gearman = zuul.launcher.gearman.Gearman(self.config, self.sched)
@ -119,6 +153,7 @@ class Server(object):
signal.signal(signal.SIGHUP, self.reconfigure_handler)
signal.signal(signal.SIGUSR1, self.exit_handler)
signal.signal(signal.SIGTERM, self.term_handler)
while True:
try:
signal.pause()
@ -167,11 +202,9 @@ def main():
pid = pid_file_module.TimeoutPIDLockFile(pid_fn, 10)
if server.args.nodaemon:
server.setup_logging()
server.main()
else:
with daemon.DaemonContext(pidfile=pid):
server.setup_logging()
server.main()