From a4fdb93757b6a0c60a1158661db7244edad9bea2 Mon Sep 17 00:00:00 2001 From: benoitc Date: Thu, 17 Jun 2010 15:55:45 +0200 Subject: [PATCH] just reload config and stay in the loop. --- gunicorn/arbiter.py | 28 ++++++++++++++++++++++++---- gunicorn/sock.py | 12 +++++++++++- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/gunicorn/arbiter.py b/gunicorn/arbiter.py index f932840b..0d81632e 100644 --- a/gunicorn/arbiter.py +++ b/gunicorn/arbiter.py @@ -10,6 +10,7 @@ import logging import os import select import signal +import socket import sys import time import traceback @@ -161,7 +162,7 @@ class Arbiter(object): handler() self.wakeup() except HUPSignal: - return self.reload() + self.reload() except StopIteration: self.halt() except KeyboardInterrupt: @@ -319,10 +320,19 @@ class Arbiter(object): os.execvpe(self.START_CTX[0], self.START_CTX['args'], os.environ) def reload(self): + old_address = self.cfg.address + old_listener = None + # reload conf self.app.reload() self.setup(self.app) - + + # do we need to change listener ? + if old_address != self.cfg.address: + self.LISTENER.close() + self.LISTENER = create_socket(self.cfg) + self.log.info("Listening at: %s" % self.LISTENER) + # spawn new workers with new app & conf for i in range(self.app.cfg.workers): self.spawn_worker() @@ -330,8 +340,18 @@ class Arbiter(object): # unlink pidfile if self.pidfile is not None: self.pidfile.unlink() - - return self.run() + + + # create new pidfile + if self.cfg.pidfile is not None: + self.pidfile = Pidfile(self.cfg.pidfile) + self.pidfile.create(self.pid) + + # set new proc_name + util._setproctitle("master [%s]" % self.proc_name) + + # manage workers + self.manage_workers() def murder_workers(self): """\ diff --git a/gunicorn/sock.py b/gunicorn/sock.py index 27dde042..55d6de12 100644 --- a/gunicorn/sock.py +++ b/gunicorn/sock.py @@ -37,11 +37,17 @@ class BaseSocket(object): self.bind(sock) sock.setblocking(0) sock.listen(self.conf.backlog) - return sock def bind(self, sock): sock.bind(self.address) + + def close(self): + try: + self.sock.close() + except socket.error, e: + log.info("Error while closing socket %s" % str(e)) + del self.sock class TCPSocket(BaseSocket): @@ -78,6 +84,10 @@ class UnixSocket(BaseSocket): sock.bind(self.address) util.chown(self.address, self.conf.uid, self.conf.gid) os.umask(old_umask) + + def close(self): + super(UnixSocket, self).close() + os.unlink(self.address) def create_socket(conf): """