mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
fix temporary file leaking .
This commit is contained in:
parent
0c00019312
commit
ac1688fe9b
@ -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
|
||||
|
||||
@ -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()
|
||||
|
||||
28
gunicorn/workers/workertmp.py
Normal file
28
gunicorn/workers/workertmp.py
Normal 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()
|
||||
Loading…
x
Reference in New Issue
Block a user