trap SIGCHLD and wake up master. fix issue 3. HUP isn't correctly

handled yet on master.
This commit is contained in:
Benoit Chesneau 2010-01-10 15:13:42 +01:00
parent 7c30c1e9ae
commit ac8abbe448

View File

@ -49,7 +49,7 @@ class Arbiter(object):
SIG_QUEUE = [] SIG_QUEUE = []
SIGNALS = map( SIGNALS = map(
lambda x: getattr(signal, "SIG%s" % x), lambda x: getattr(signal, "SIG%s" % x),
"QUIT INT TERM TTIN TTOU".split() "CHLD QUIT INT TERM TTIN TTOU".split()
) )
SIG_NAMES = dict( SIG_NAMES = dict(
(getattr(signal, name), name[3:].lower()) for name in dir(signal) (getattr(signal, name), name[3:].lower()) for name in dir(signal)
@ -156,7 +156,10 @@ class Arbiter(object):
log.info("Master is shutting down.") log.info("Master is shutting down.")
self.stop() self.stop()
def handle_chld(self):
self.wakeup()
def handle_quit(self): def handle_quit(self):
self.stop(False) self.stop(False)
raise StopIteration raise StopIteration
@ -176,6 +179,15 @@ class Arbiter(object):
if self.num_workers > 0: if self.num_workers > 0:
self.num_workers -= 1 self.num_workers -= 1
def wakeup(self):
while True:
try:
os.write(self.PIPE[1], ".")
return
except OSError, e:
if e[0] not in [errno.EAGAIN, errno.EINTR]:
raise
def sleep(self): def sleep(self):
try: try:
ready = select.select([self.PIPE[0]], [], [], 1) ready = select.select([self.PIPE[0]], [], [], 1)
@ -205,8 +217,7 @@ class Arbiter(object):
self.kill_workers(signal.SIGKILL) self.kill_workers(signal.SIGKILL)
def murder_workers(self): def murder_workers(self):
running_workers = tuple(self.WORKERS.iteritems()) for (pid, worker) in list(self.WORKERS.items()):
for (pid, worker) in running_workers:
diff = time.time() - os.fstat(worker.tmp.fileno()).st_mtime diff = time.time() - os.fstat(worker.tmp.fileno()).st_mtime
if diff < self.timeout: if diff < self.timeout:
continue continue