don't close the unix socket when the worker exit

When the worker was exiting, eventlet is closing the listening socket in th
worker. Since the socket instances are shared, this was also removing the unix
socket on close. This change make sure that the socket can only be closed by
its parent (where the socket have been bound).

While I'm here, also make sure we don't use any blocking function in eventlet
while switching).

fix #965
This commit is contained in:
benoitc 2015-07-22 06:22:24 +02:00
parent 0d86a9094d
commit 64a5b5cdf3
2 changed files with 9 additions and 5 deletions

View File

@ -57,7 +57,6 @@ class BaseSocket(object):
self.sock.close()
except socket.error as e:
self.log.info("Error while closing socket %s", str(e))
time.sleep(0.3)
del self.sock
@ -104,6 +103,7 @@ class UnixSocket(BaseSocket):
os.remove(addr)
else:
raise ValueError("%r is not a socket" % addr)
self.parent = os.getpid()
super(UnixSocket, self).__init__(addr, conf, log, fd=fd)
def __str__(self):
@ -118,7 +118,8 @@ class UnixSocket(BaseSocket):
def close(self):
super(UnixSocket, self).close()
os.unlink(self.cfg_addr)
if self.parent == os.getpid():
os.unlink(self.cfg_addr)
def _sock_type(addr):

View File

@ -25,7 +25,6 @@ import greenlet
from gunicorn.http.wsgi import sendfile as o_sendfile
from gunicorn.workers.async import AsyncWorker
def _eventlet_sendfile(fdout, fdin, offset, nbytes):
while True:
try:
@ -87,11 +86,11 @@ def patch_sendfile():
class EventletWorker(AsyncWorker):
def patch(self):
hubs.use_hub()
eventlet.monkey_patch(os=False)
patch_sendfile()
def init_process(self):
hubs.use_hub()
self.patch()
super(EventletWorker, self).init_process()
@ -119,7 +118,11 @@ class EventletWorker(AsyncWorker):
while self.alive:
self.notify()
eventlet.sleep(1.0)
try:
eventlet.sleep(1.0)
except AssertionError:
self.alive = False
break
self.notify()
try: