mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
include loggin facility in objects. Fix an error on openbsd. While i'm
here bump gunicorn version.
This commit is contained in:
parent
db01c210a2
commit
b68700c010
@ -4,4 +4,4 @@
|
|||||||
# See the NOTICE for more information.
|
# See the NOTICE for more information.
|
||||||
|
|
||||||
|
|
||||||
__version__ = "0.1"
|
__version__ = "0.2"
|
||||||
|
|||||||
@ -15,7 +15,7 @@ import time
|
|||||||
|
|
||||||
from gunicorn.worker import Worker
|
from gunicorn.worker import Worker
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
class Arbiter(object):
|
class Arbiter(object):
|
||||||
|
|
||||||
@ -43,7 +43,10 @@ class Arbiter(object):
|
|||||||
self.pid = os.getpid()
|
self.pid = os.getpid()
|
||||||
self.init_signals()
|
self.init_signals()
|
||||||
self.listen(self.address)
|
self.listen(self.address)
|
||||||
log.info("Booted Arbiter: %s" % os.getpid())
|
self.log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
self.log.info("Booted Arbiter: %s" % os.getpid())
|
||||||
|
|
||||||
|
|
||||||
def init_signals(self):
|
def init_signals(self):
|
||||||
if self.PIPE:
|
if self.PIPE:
|
||||||
@ -63,7 +66,7 @@ class Arbiter(object):
|
|||||||
self.SIG_QUEUE.append(sig)
|
self.SIG_QUEUE.append(sig)
|
||||||
self.wakeup()
|
self.wakeup()
|
||||||
else:
|
else:
|
||||||
log.warn("Ignoring rapid signaling: %s" % sig)
|
self.log.warn("Ignoring rapid signaling: %s" % sig)
|
||||||
|
|
||||||
|
|
||||||
def listen(self, addr):
|
def listen(self, addr):
|
||||||
@ -76,7 +79,7 @@ class Arbiter(object):
|
|||||||
return
|
return
|
||||||
except socket.error, e:
|
except socket.error, e:
|
||||||
if e[0] == errno.ENOTCONN:
|
if e[0] == errno.ENOTCONN:
|
||||||
log.error("should be a non GUNICORN environnement")
|
self.log.error("should be a non GUNICORN environnement")
|
||||||
else:
|
else:
|
||||||
raise
|
raise
|
||||||
|
|
||||||
@ -87,9 +90,9 @@ class Arbiter(object):
|
|||||||
break
|
break
|
||||||
except socket.error, e:
|
except socket.error, e:
|
||||||
if e[0] == errno.EADDRINUSE:
|
if e[0] == errno.EADDRINUSE:
|
||||||
log.error("Connection in use: %s" % str(addr))
|
self.log.error("Connection in use: %s" % str(addr))
|
||||||
if i < 5:
|
if i < 5:
|
||||||
log.error("Retrying in 1 second.")
|
self.log.error("Retrying in 1 second.")
|
||||||
time.sleep(1)
|
time.sleep(1)
|
||||||
|
|
||||||
def init_socket_fromfd(self, fd, address):
|
def init_socket_fromfd(self, fd, address):
|
||||||
@ -126,15 +129,15 @@ class Arbiter(object):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
if sig not in self.SIG_NAMES:
|
if sig not in self.SIG_NAMES:
|
||||||
log.info("Ignoring unknown signal: %s" % sig)
|
self.log.info("Ignoring unknown signal: %s" % sig)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
signame = self.SIG_NAMES.get(sig)
|
signame = self.SIG_NAMES.get(sig)
|
||||||
handler = getattr(self, "handle_%s" % signame, None)
|
handler = getattr(self, "handle_%s" % signame, None)
|
||||||
if not handler:
|
if not handler:
|
||||||
log.error("Unhandled signal: %s" % signame)
|
self.log.error("Unhandled signal: %s" % signame)
|
||||||
continue
|
continue
|
||||||
log.info("Handling signal: %s" % signame)
|
self.log.info("Handling signal: %s" % signame)
|
||||||
handler()
|
handler()
|
||||||
self.wakeup()
|
self.wakeup()
|
||||||
except StopIteration:
|
except StopIteration:
|
||||||
@ -143,18 +146,18 @@ class Arbiter(object):
|
|||||||
self.stop(False)
|
self.stop(False)
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
log.exception("Unhandled exception in main loop.")
|
self.log.exception("Unhandled exception in main loop.")
|
||||||
self.stop(False)
|
self.stop(False)
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
|
|
||||||
log.info("Master is shutting down.")
|
self.log.info("Master is shutting down.")
|
||||||
self.stop()
|
self.stop()
|
||||||
|
|
||||||
def handle_chld(self, sig, frame):
|
def handle_chld(self, sig, frame):
|
||||||
self.wakeup()
|
self.wakeup()
|
||||||
|
|
||||||
def handle_hup(self):
|
def handle_hup(self):
|
||||||
log.info("Master hang up.")
|
self.log.info("Master hang up.")
|
||||||
self.reexec()
|
self.reexec()
|
||||||
raise StopIteration
|
raise StopIteration
|
||||||
|
|
||||||
@ -184,10 +187,10 @@ class Arbiter(object):
|
|||||||
|
|
||||||
def handle_winch(self):
|
def handle_winch(self):
|
||||||
if os.getppid() == 1 or os.getpgrp() != os.getpid():
|
if os.getppid() == 1 or os.getpgrp() != os.getpid():
|
||||||
logger.info("graceful stop of workers")
|
self.logger.info("graceful stop of workers")
|
||||||
self.kill_workers(True)
|
self.kill_workers(True)
|
||||||
else:
|
else:
|
||||||
log.info("SIGWINCH ignored. not daemonized")
|
self.log.info("SIGWINCH ignored. not daemonized")
|
||||||
|
|
||||||
def wakeup(self):
|
def wakeup(self):
|
||||||
# Wake up the arbiter
|
# Wake up the arbiter
|
||||||
@ -278,17 +281,17 @@ class Arbiter(object):
|
|||||||
# Process Child
|
# Process Child
|
||||||
worker_pid = os.getpid()
|
worker_pid = os.getpid()
|
||||||
try:
|
try:
|
||||||
log.info("Worker %s booting" % worker_pid)
|
self.log.info("Worker %s booting" % worker_pid)
|
||||||
worker.run()
|
worker.run()
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
except SystemExit:
|
except SystemExit:
|
||||||
raise
|
raise
|
||||||
except:
|
except:
|
||||||
log.exception("Exception in worker process.")
|
self.log.exception("Exception in worker process.")
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
finally:
|
finally:
|
||||||
worker.tmp.close()
|
worker.tmp.close()
|
||||||
log.info("Worker %s exiting." % worker_pid)
|
self.log.info("Worker %s exiting." % worker_pid)
|
||||||
|
|
||||||
def kill_workers(self, sig):
|
def kill_workers(self, sig):
|
||||||
for pid in self.WORKERS.keys():
|
for pid in self.WORKERS.keys():
|
||||||
@ -300,7 +303,7 @@ class Arbiter(object):
|
|||||||
os.kill(pid, sig)
|
os.kill(pid, sig)
|
||||||
kpid, stat = os.waitpid(pid, os.WNOHANG)
|
kpid, stat = os.waitpid(pid, os.WNOHANG)
|
||||||
if kpid:
|
if kpid:
|
||||||
log.warning("Problem killing process: %s" % pid)
|
self.log.warning("Problem killing process: %s" % pid)
|
||||||
except OSError, e:
|
except OSError, e:
|
||||||
if e.errno == errno.ESRCH:
|
if e.errno == errno.ESRCH:
|
||||||
pass
|
pass
|
||||||
|
|||||||
@ -24,7 +24,6 @@ normalize_name
|
|||||||
NORMALIZE_SPACE = re.compile(r'(?:\r\n)?[ \t]+')
|
NORMALIZE_SPACE = re.compile(r'(?:\r\n)?[ \t]+')
|
||||||
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class RequestError(Exception):
|
class RequestError(Exception):
|
||||||
@ -57,7 +56,7 @@ class HTTPRequest(object):
|
|||||||
self._version = 11
|
self._version = 11
|
||||||
self.parser = HttpParser()
|
self.parser = HttpParser()
|
||||||
self.start_response_called = False
|
self.start_response_called = False
|
||||||
|
self.log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def read(self):
|
def read(self):
|
||||||
@ -79,9 +78,9 @@ class HTTPRequest(object):
|
|||||||
environ.update(self.DEFAULTS)
|
environ.update(self.DEFAULTS)
|
||||||
return environ
|
return environ
|
||||||
|
|
||||||
log.info("%s", self.parser.status)
|
self.log.info("%s", self.parser.status)
|
||||||
|
|
||||||
log.info("Got headers:\n%s" % headers)
|
self.log.info("Got headers:\n%s" % headers)
|
||||||
|
|
||||||
if self.parser.headers_dict.get('Except', '').lower() == "100-continue":
|
if self.parser.headers_dict.get('Except', '').lower() == "100-continue":
|
||||||
self.socket.send("100 Continue\n")
|
self.socket.send("100 Continue\n")
|
||||||
|
|||||||
@ -20,8 +20,7 @@ weekdayname = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
|
|||||||
monthname = [None,
|
monthname = [None,
|
||||||
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
|
'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
|
||||||
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
||||||
|
|
||||||
|
|
||||||
def close(sock):
|
def close(sock):
|
||||||
""" socket.close() doesn't *really* close if
|
""" socket.close() doesn't *really* close if
|
||||||
there's another reference to it in the TCP/IP stack.
|
there's another reference to it in the TCP/IP stack.
|
||||||
@ -34,6 +33,8 @@ def close(sock):
|
|||||||
sock.close()
|
sock.close()
|
||||||
except socket.error:
|
except socket.error:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
del sock
|
||||||
|
|
||||||
def read_partial(sock, length):
|
def read_partial(sock, length):
|
||||||
while True:
|
while True:
|
||||||
@ -63,6 +64,7 @@ def write(sock, data):
|
|||||||
if e[0] in (errno.EWOULDBLOCK, errno.EAGAIN):
|
if e[0] in (errno.EWOULDBLOCK, errno.EAGAIN):
|
||||||
break
|
break
|
||||||
elif e[0] in (errno.EPIPE,):
|
elif e[0] in (errno.EPIPE,):
|
||||||
|
break
|
||||||
if i == 0:
|
if i == 0:
|
||||||
continue
|
continue
|
||||||
raise
|
raise
|
||||||
|
|||||||
@ -18,7 +18,7 @@ import time
|
|||||||
from gunicorn import http
|
from gunicorn import http
|
||||||
from gunicorn import util
|
from gunicorn import util
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
class Worker(object):
|
class Worker(object):
|
||||||
|
|
||||||
@ -50,6 +50,7 @@ class Worker(object):
|
|||||||
|
|
||||||
self.app = app
|
self.app = app
|
||||||
self.alive = True
|
self.alive = True
|
||||||
|
self.log = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def close_on_exec(self, fd):
|
def close_on_exec(self, fd):
|
||||||
@ -87,8 +88,7 @@ class Worker(object):
|
|||||||
# loop and wait for some lovin.
|
# loop and wait for some lovin.
|
||||||
while self.alive:
|
while self.alive:
|
||||||
try:
|
try:
|
||||||
client, addr = self.socket.accept()
|
client, addr = self.socket.accept()
|
||||||
|
|
||||||
|
|
||||||
# handle connection
|
# handle connection
|
||||||
self.handle(client, addr)
|
self.handle(client, addr)
|
||||||
@ -130,8 +130,7 @@ class Worker(object):
|
|||||||
response = self.app(req.read(), req.start_response)
|
response = self.app(req.read(), req.start_response)
|
||||||
http.HTTPResponse(client, response, req).send()
|
http.HTTPResponse(client, response, req).send()
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
log.exception("Error processing request. [%s]" % str(e))
|
# TODO: try to send something if an error happend
|
||||||
|
self.log.exception("Error processing request. [%s]" % str(e))
|
||||||
# try to send something if an error happend
|
# try to send something if an error happend
|
||||||
msg = "HTTP/1.1 500 Internal Server Error\r\n\r\n"
|
|
||||||
util.write_nonblock(client, msg)
|
|
||||||
util.close(client)
|
util.close(client)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user