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