fix temporary file leaking .

This commit is contained in:
benoitc 2010-11-20 12:43:46 +01:00 committed by benoitc
parent 0c00019312
commit ac1688fe9b
3 changed files with 32 additions and 13 deletions

View File

@ -452,7 +452,6 @@ class Arbiter(object):
try:
worker.tmp.close()
self.cfg.worker_exit(self, worker)
os.unlink(worker.tmpname)
except:
pass
@ -490,7 +489,6 @@ class Arbiter(object):
worker = self.WORKERS.pop(pid)
worker.tmp.close()
self.cfg.worker_exit(self, worker)
os.unlink(worker.tmpname)
return
except (KeyError, OSError):
return

View File

@ -12,6 +12,7 @@ import sys
import tempfile
from gunicorn import util
from gunicorn.workers.workertmp import WorkerTmp
class Worker(object):
@ -39,14 +40,10 @@ class Worker(object):
self.nr = 0
self.max_requests = cfg.max_requests or sys.maxint
self.alive = True
self.spinner = 0
self.log = logging.getLogger(__name__)
self.debug = cfg.debug
self.address = self.socket.getsockname()
self.fd, self.tmpname = tempfile.mkstemp(prefix="wgunicorn-")
util.chown(self.tmpname, cfg.uid, cfg.gid)
self.tmp = os.fdopen(self.fd, "r+b")
self.tmp = WorkerTmp()
def __str__(self):
return "<Worker %s>" % self.pid
@ -61,11 +58,7 @@ class Worker(object):
once every ``self.timeout`` seconds. If you fail in accomplishing
this task, the master process will murder your workers.
"""
self.spinner = (self.spinner+1) % 2
if getattr(os, 'fchmod', None):
os.fchmod(self.tmp.fileno(), self.spinner)
else:
os.chmod(self.tmpname, self.spinner)
self.tmp.notify()
def run(self):
"""\
@ -94,7 +87,7 @@ class Worker(object):
# Prevent fd inherientence
util.close_on_exec(self.socket)
util.close_on_exec(self.fd)
util.close_on_exec(self.tmp.fileno())
self.init_signals()
self.wsgi = self.app.wsgi()

View File

@ -0,0 +1,28 @@
# -*- coding: utf-8 -
#
# This file is part of gunicorn released under the MIT license.
# See the NOTICE for more information.
import os
import tempfile
class WorkerTmp(object):
def __init__(self):
self._tmp = tempfile.TemporaryFile(prefix="wgunicorn-")
self.spinner = 0
def notify(self):
try:
self.spinner = (self.spinner+1) % 2
os.fchmod(self._tmp.fileno(), self.spinner)
except AttributeError:
# python < 2.6
self._tmp.truncate(0)
os.write(self._tmp.fileno(), "X")
def fileno(self):
return self._tmp.fileno()
def close(self):
return self._tmp.close()