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:
Benoit Chesneau 2010-01-19 00:50:07 +01:00
parent 43b9209144
commit 46086720f5
4 changed files with 14 additions and 9 deletions

View File

@ -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

View File

@ -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))

View File

@ -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):

View File

@ -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,6 +98,7 @@ 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)