From 34db4a6669283168d31461fc97200748c4f90631 Mon Sep 17 00:00:00 2001 From: "Paul J. Davis" Date: Thu, 3 Dec 2009 02:41:50 -0500 Subject: [PATCH] Updates to fix errors under load. --- gunicorn/arbiter.py | 2 +- gunicorn/worker.py | 29 +++++++++++++++++++---------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/gunicorn/arbiter.py b/gunicorn/arbiter.py index 16b3df91..d19e7457 100644 --- a/gunicorn/arbiter.py +++ b/gunicorn/arbiter.py @@ -96,7 +96,7 @@ class Arbiter(object): sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) sock.bind(address) - sock.listen(64) + sock.listen(2048) return sock def run(self): diff --git a/gunicorn/worker.py b/gunicorn/worker.py index 47e2a87e..73cc2d67 100644 --- a/gunicorn/worker.py +++ b/gunicorn/worker.py @@ -1,9 +1,10 @@ -import BaseHTTPServer +import errno import logging import os import select import signal +import socket import http import util @@ -36,15 +37,23 @@ class Worker(object): if ret[0]: break - (conn, addr) = self.socket.accept() - log.info("Client connected: %s:%s" % addr) - conn.setblocking(1) - try: - self.handle(conn, addr) - except: - log.exception("Error processing request.") - finally: - conn.close() + # Accept until we hit EAGAIN + while True: + try: + (conn, addr) = self.socket.accept() + except socket.error, e: + if e[0] in [errno.EAGAIN, errno.EINTR]: + continue # Jump back to select + raise # Uh oh! + + #log.info("Client connected: %s:%s" % addr) + conn.setblocking(1) + try: + self.handle(conn, addr) + except: + log.exception("Error processing request.") + finally: + conn.close() def handle(self, conn, client): while True: