Browse Source

Beat: Do not close logfile fds after fork. Closes celery/django-celery#288

Ask Solem 11 years ago
parent
commit
8015da0a3d
2 changed files with 9 additions and 35 deletions
  1. 6 34
      celery/platforms.py
  2. 3 1
      celery/utils/log.py

+ 6 - 34
celery/platforms.py

@@ -65,37 +65,6 @@ Seems we're already running? (pid: {1})"""
 _range = namedtuple('_range', ('start', 'stop'))
 
 
-def ranges(sequence, end):
-    """From a sequence of numbers return a list of ranges
-    avoiding those numbers.
-
-    Note: List must be sorted and uniq.
-
-    Useful for :func:`os.closerange` to provide a list
-    of file descriptors to keep:
-
-        >>> list(ranges([], end=2048))
-        _range(start=0, stop=2048)]
-
-        >>> list(ranges([1, 2, 3, 30, 1400], end=2048))
-        [_range(start=0, stop=1), _range(start=4, stop=30),
-         _range(start=31, stop=256)]
-
-        >>> list(ranges([1, 2, 3, 30, 1400], end=256))
-        [_range(start=0, stop=1), _range(start=4, stop=30),
-         _range(start=31, stop=1400), _range(start=1401, stop=2048)]
-
-    """
-    k, l = iter([-1] + sequence), iter(sequence)
-    for prev, stop in zip_longest(k, l):
-        prev = min(prev + 1, end)
-        if prev != stop:
-            if stop and stop > end:
-                yield _range(prev, end)
-                break
-            yield _range(prev, end if stop is None else stop)
-
-
 def pyimplementation():
     """Return string identifying the current Python implementation."""
     if hasattr(_platform, 'python_implementation'):
@@ -276,10 +245,13 @@ if hasattr(os, 'closerange'):
 
     def close_open_fds(keep=None):
         keep = [maybe_fileno(f)
-                for f in uniq(sorted((keep or [])))
+                for f in uniq(sorted(keep or []))
                 if maybe_fileno(f) is not None]
-        for low, high in ranges(keep, get_fdmax(default=2048)):
-            os.closerange(low, high)
+        maxfd = get_fdmax(default=2048)
+        kL, kH = iter([-1] + keep), iter(keep + [maxfd])
+        for low, high in zip_longest(kL, kH):
+            if low + 1 != high:
+                os.closerange(low + 1, high)
 
 else:
 

+ 3 - 1
celery/utils/log.py

@@ -53,7 +53,9 @@ def set_in_sighandler(value):
 
 def iter_open_logger_fds():
     seen = set()
-    for logger in values(logging.Logger.manager.loggerDict):
+    loggers = (list(values(logging.Logger.manager.loggerDict)) +
+               [logging.getLogger(None)])
+    for logger in loggers:
         try:
             for handler in logger.handlers:
                 try: