From ecd684eaed6b41ee59d506f15c47a109a9afe8ea Mon Sep 17 00:00:00 2001 From: Benoit Chesneau Date: Sat, 16 Jan 2010 05:12:00 +0100 Subject: [PATCH] fix workers relaunch --- gunicorn/arbiter.py | 13 +++++++------ gunicorn/http/request.py | 4 +--- gunicorn/http/response.py | 2 -- gunicorn/util.py | 2 +- gunicorn/worker.py | 5 ----- 5 files changed, 9 insertions(+), 17 deletions(-) diff --git a/gunicorn/arbiter.py b/gunicorn/arbiter.py index 8effce120..0b753f45f 100644 --- a/gunicorn/arbiter.py +++ b/gunicorn/arbiter.py @@ -126,20 +126,24 @@ def init_socket(self, address): sock.listen(2048) return sock - def set_sockopts(self, sock): + def set_sockopts(self, sock): + sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 0) if hasattr(socket, "TCP_CORK"): sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_CORK, 1) elif hasattr(socket, "TCP_NOPUSH"): sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NOPUSH, 1) - + def run(self): self.manage_workers() while True: try: sig = self.SIG_QUEUE.pop(0) if len(self.SIG_QUEUE) else None if sig is None: + self.murder_workers() + self.reap_workers() + self.manage_workers() self.sleep() continue @@ -155,9 +159,6 @@ def run(self): log.info("Handling signal: %s" % signame) handler() - self.murder_workers() - self.reap_workers() - self.manage_workers() except StopIteration: break except KeyboardInterrupt: diff --git a/gunicorn/http/request.py b/gunicorn/http/request.py index 3c186d4f7..10b1d5b91 100644 --- a/gunicorn/http/request.py +++ b/gunicorn/http/request.py @@ -69,13 +69,11 @@ def read(self): remain = CHUNK_SIZE buf = create_string_buffer(remain) remain -= self.socket.recv_into(buf, remain) - while not self.parser.headers(headers, buf): data = create_string_buffer(remain) remain -= self.socket.recv_into(data, remain) buf = create_string_buffer(data.value + buf.value) - - print headers + if headers.get('Except', '').lower() == "100-continue": self.socket.send("100 Continue\n") diff --git a/gunicorn/http/response.py b/gunicorn/http/response.py index 07442f532..f6de63a6c 100644 --- a/gunicorn/http/response.py +++ b/gunicorn/http/response.py @@ -53,11 +53,9 @@ def send(self): self.sock.send("%s\r\n" % "".join(resp_head)) - for chunk in self.data: self.sock.send(chunk) - print "sent" self.sock.close() if hasattr(self.data, "close"): diff --git a/gunicorn/util.py b/gunicorn/util.py index dffe850bf..3a0cc98df 100644 --- a/gunicorn/util.py +++ b/gunicorn/util.py @@ -26,7 +26,7 @@ import time -CHUNK_SIZE = 16 * 1024 +CHUNK_SIZE = (16 * 1024) MAX_BODY = 1024 * (80 + 32) diff --git a/gunicorn/worker.py b/gunicorn/worker.py index 02d30ba2d..16f421d71 100644 --- a/gunicorn/worker.py +++ b/gunicorn/worker.py @@ -102,24 +102,19 @@ def run(self): except select.error, e: if e[0] == errno.EINTR: break - elif e[0] == errno.EBADF: - return raise - # Accept until we hit EAGAIN. We're betting that when we're # processing clients that more clients are waiting. When # there's no more clients waiting we go back to the select() # loop and wait for some lovin. while self.alive: try: - conn, addr = self.socket.accept() conn.setblocking(1) # handle connection self.handle(conn, addr) - # Update the fd mtime on each client completion # to signal that this worker process is alive.