mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
we don't want to block accepted socket. Fix a bug I got with
friendpaste. also make worker select timeout related to arbiter.
This commit is contained in:
parent
43b9209144
commit
46086720f5
@ -267,7 +267,8 @@ class Arbiter(object):
|
|||||||
if i in workers:
|
if i in workers:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
worker = Worker(i, self.pid, self.LISTENER, self.modname)
|
worker = Worker(i, self.pid, self.LISTENER, self.modname,
|
||||||
|
self.timeout / 2.0)
|
||||||
pid = os.fork()
|
pid = os.fork()
|
||||||
if pid != 0:
|
if pid != 0:
|
||||||
self.WORKERS[pid] = worker
|
self.WORKERS[pid] = worker
|
||||||
|
|||||||
@ -24,14 +24,14 @@ class HTTPResponse(object):
|
|||||||
def send(self):
|
def send(self):
|
||||||
# send headers
|
# send headers
|
||||||
resp_head = []
|
resp_head = []
|
||||||
resp_head.append("HTTP/1.0 %s\r\n" % (self.status))
|
resp_head.append("HTTP/1.1 %s\r\n" % (self.status))
|
||||||
|
|
||||||
resp_head.append("Server: %s\r\n" % self.SERVER_VERSION)
|
resp_head.append("Server: %s\r\n" % self.SERVER_VERSION)
|
||||||
resp_head.append("Date: %s\r\n" % http_date())
|
resp_head.append("Date: %s\r\n" % http_date())
|
||||||
# broken clients
|
# broken clients
|
||||||
resp_head.append("Status: %s\r\n" % str(self.status))
|
resp_head.append("Status: %s\r\n" % str(self.status))
|
||||||
# always close the conenction
|
# always close the conenction
|
||||||
#resp_head.append("Connection: close\r\n")
|
resp_head.append("Connection: close\r\n")
|
||||||
for name, value in self.headers.items():
|
for name, value in self.headers.items():
|
||||||
resp_head.append("%s: %s\r\n" % (name, value))
|
resp_head.append("%s: %s\r\n" % (name, value))
|
||||||
|
|
||||||
|
|||||||
@ -60,7 +60,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
|
continue
|
||||||
raise
|
raise
|
||||||
|
|
||||||
def write_nonblock(sock, data):
|
def write_nonblock(sock, data):
|
||||||
|
|||||||
@ -25,9 +25,10 @@ class Worker(object):
|
|||||||
"HUP QUIT INT TERM TTIN TTOU USR1".split()
|
"HUP QUIT INT TERM TTIN TTOU USR1".split()
|
||||||
)
|
)
|
||||||
|
|
||||||
def __init__(self, workerid, ppid, socket, app):
|
def __init__(self, workerid, ppid, socket, app, timeout):
|
||||||
self.id = workerid
|
self.id = workerid
|
||||||
self.ppid = ppid
|
self.ppid = ppid
|
||||||
|
self.timeout = timeout
|
||||||
fd, tmpname = tempfile.mkstemp()
|
fd, tmpname = tempfile.mkstemp()
|
||||||
self.tmp = os.fdopen(fd, "r+b")
|
self.tmp = os.fdopen(fd, "r+b")
|
||||||
self.tmpname = tmpname
|
self.tmpname = tmpname
|
||||||
@ -76,7 +77,8 @@ class Worker(object):
|
|||||||
spinner = (spinner+1) % 2
|
spinner = (spinner+1) % 2
|
||||||
self._fchmod(spinner)
|
self._fchmod(spinner)
|
||||||
try:
|
try:
|
||||||
ret = select.select([self.socket], [], [], 2.0)
|
ret = select.select([self.socket], [], [],
|
||||||
|
self.timeout)
|
||||||
if ret[0]:
|
if ret[0]:
|
||||||
break
|
break
|
||||||
except select.error, e:
|
except select.error, e:
|
||||||
@ -96,7 +98,8 @@ class Worker(object):
|
|||||||
while self.alive:
|
while self.alive:
|
||||||
try:
|
try:
|
||||||
client, addr = self.socket.accept()
|
client, addr = self.socket.accept()
|
||||||
|
client.setblocking(0)
|
||||||
|
|
||||||
# handle connection
|
# handle connection
|
||||||
self.handle(client, addr)
|
self.handle(client, addr)
|
||||||
|
|
||||||
@ -105,7 +108,8 @@ class Worker(object):
|
|||||||
spinner = (spinner+1) % 2
|
spinner = (spinner+1) % 2
|
||||||
self._fchmod(spinner)
|
self._fchmod(spinner)
|
||||||
except socket.error, e:
|
except socket.error, e:
|
||||||
if e[0] in [errno.EAGAIN, errno.ECONNABORTED]:
|
if e[0] in [errno.EAGAIN, errno.ECONNABORTED,
|
||||||
|
errno.EWOULDBLOCK]:
|
||||||
break # Uh oh!
|
break # Uh oh!
|
||||||
raise
|
raise
|
||||||
|
|
||||||
@ -118,6 +122,6 @@ class Worker(object):
|
|||||||
except Exception, e:
|
except Exception, e:
|
||||||
self.log.exception("Error processing request. [%s]" % str(e))
|
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.0 500 Internal Server Error\r\n\r\n"
|
msg = "HTTP/1.1 500 Internal Server Error\r\n\r\n"
|
||||||
util.write_nonblock(client, msg)
|
util.write_nonblock(client, msg)
|
||||||
util.close(client)
|
util.close(client)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user