cleanup openstack-common.conf and sync updated files

Closes-Bug: #1463778
Change-Id: I41aaf59c37a78e618ea1daf21bbdc19284b9ea40
This commit is contained in:
Davanum Srinivas 2015-06-07 10:09:51 -04:00 committed by Davanum Srinivas (dims)
parent b3c4c444ea
commit 576374a6cc
6 changed files with 39 additions and 35 deletions

View File

@ -143,7 +143,7 @@ def initialize_if_enabled():
# listen(). In any case, pull the port number out here. # listen(). In any case, pull the port number out here.
port = sock.getsockname()[1] port = sock.getsockname()[1]
LOG.info( LOG.info(
_LI('Eventlet backdoor listening on %(port)s for process %(pid)d') % _LI('Eventlet backdoor listening on %(port)s for process %(pid)d'),
{'port': port, 'pid': os.getpid()} {'port': port, 'pid': os.getpid()}
) )
eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock, eventlet.spawn_n(eventlet.backdoor.backdoor_server, sock,

View File

@ -84,9 +84,9 @@ class FixedIntervalLoopingCall(LoopingCallBase):
break break
delay = end - start - interval delay = end - start - interval
if delay > 0: if delay > 0:
LOG.warn(_LW('task %(func_name)r run outlasted ' LOG.warning(_LW('task %(func_name)r run outlasted '
'interval by %(delay).2f sec'), 'interval by %(delay).2f sec'),
{'func_name': self.f, 'delay': delay}) {'func_name': self.f, 'delay': delay})
greenthread.sleep(-delay if delay < 0 else 0) greenthread.sleep(-delay if delay < 0 else 0)
except LoopingCallDone as e: except LoopingCallDone as e:
self.stop() self.stop()

View File

@ -222,11 +222,11 @@ class PeriodicTasks(object):
try: try:
task(self, context) task(self, context)
except Exception as e: except Exception:
if raise_on_error: if raise_on_error:
raise raise
LOG.exception(_LE("Error during %(full_task_name)s: %(e)s"), LOG.exception(_LE("Error during %(full_task_name)s"),
{"full_task_name": full_task_name, "e": e}) {"full_task_name": full_task_name})
time.sleep(0) time.sleep(0)
return idle_for return idle_for

View File

@ -18,6 +18,7 @@
"""Generic Node base class for all workers that run on hosts.""" """Generic Node base class for all workers that run on hosts."""
import errno import errno
import io
import logging import logging
import os import os
import random import random
@ -25,14 +26,6 @@ import signal
import sys import sys
import time import time
try:
# Importing just the symbol here because the io module does not
# exist in Python 2.6.
from io import UnsupportedOperation # noqa
except ImportError:
# Python 2.6
UnsupportedOperation = None
import eventlet import eventlet
from eventlet import event from eventlet import event
from oslo_config import cfg from oslo_config import cfg
@ -59,15 +52,15 @@ def _is_daemon():
# http://www.gnu.org/software/bash/manual/bashref.html#Job-Control-Basics # http://www.gnu.org/software/bash/manual/bashref.html#Job-Control-Basics
try: try:
is_daemon = os.getpgrp() != os.tcgetpgrp(sys.stdout.fileno()) is_daemon = os.getpgrp() != os.tcgetpgrp(sys.stdout.fileno())
except io.UnsupportedOperation:
# Could not get the fileno for stdout, so we must be a daemon.
is_daemon = True
except OSError as err: except OSError as err:
if err.errno == errno.ENOTTY: if err.errno == errno.ENOTTY:
# Assume we are a daemon because there is no terminal. # Assume we are a daemon because there is no terminal.
is_daemon = True is_daemon = True
else: else:
raise raise
except UnsupportedOperation:
# Could not get the fileno for stdout, so we must be a daemon.
is_daemon = True
return is_daemon return is_daemon
@ -206,12 +199,16 @@ class ProcessLauncher(object):
for handler in cls._signal_handlers_set: for handler in cls._signal_handlers_set:
handler(*args, **kwargs) handler(*args, **kwargs)
def __init__(self): def __init__(self, wait_interval=0.01):
"""Constructor.""" """Constructor.
:param wait_interval: The interval to sleep for between checks
of child process exit.
"""
self.children = {} self.children = {}
self.sigcaught = None self.sigcaught = None
self.running = True self.running = True
self.wait_interval = wait_interval
rfd, self.writepipe = os.pipe() rfd, self.writepipe = os.pipe()
self.readpipe = eventlet.greenio.GreenPipe(rfd, 'r') self.readpipe = eventlet.greenio.GreenPipe(rfd, 'r')
self.handle_signal() self.handle_signal()
@ -230,7 +227,7 @@ class ProcessLauncher(object):
def _pipe_watcher(self): def _pipe_watcher(self):
# This will block until the write end is closed when the parent # This will block until the write end is closed when the parent
# dies unexpectedly # dies unexpectedly
self.readpipe.read() self.readpipe.read(1)
LOG.info(_LI('Parent process has died unexpectedly, exiting')) LOG.info(_LI('Parent process has died unexpectedly, exiting'))
@ -238,15 +235,12 @@ class ProcessLauncher(object):
def _child_process_handle_signal(self): def _child_process_handle_signal(self):
# Setup child signal handlers differently # Setup child signal handlers differently
def _sigterm(*args):
signal.signal(signal.SIGTERM, signal.SIG_DFL)
raise SignalExit(signal.SIGTERM)
def _sighup(*args): def _sighup(*args):
signal.signal(signal.SIGHUP, signal.SIG_DFL) signal.signal(signal.SIGHUP, signal.SIG_DFL)
raise SignalExit(signal.SIGHUP) raise SignalExit(signal.SIGHUP)
signal.signal(signal.SIGTERM, _sigterm) # Parent signals with SIGTERM when it wants us to go away.
signal.signal(signal.SIGTERM, signal.SIG_DFL)
if _sighup_supported(): if _sighup_supported():
signal.signal(signal.SIGHUP, _sighup) signal.signal(signal.SIGHUP, _sighup)
# Block SIGINT and let the parent send us a SIGTERM # Block SIGINT and let the parent send us a SIGTERM
@ -337,8 +331,8 @@ class ProcessLauncher(object):
def _wait_child(self): def _wait_child(self):
try: try:
# Block while any of child processes have exited # Don't block if no child processes have exited
pid, status = os.waitpid(0, 0) pid, status = os.waitpid(0, os.WNOHANG)
if not pid: if not pid:
return None return None
except OSError as exc: except OSError as exc:
@ -367,6 +361,10 @@ class ProcessLauncher(object):
while self.running: while self.running:
wrap = self._wait_child() wrap = self._wait_child()
if not wrap: if not wrap:
# Yield to other threads if no children have exited
# Sleep for a short time to avoid excessive CPU usage
# (see bug #1095346)
eventlet.greenthread.sleep(self.wait_interval)
continue continue
while self.running and len(wrap.children) < wrap.workers: while self.running and len(wrap.children) < wrap.workers:
self._start_child(wrap) self._start_child(wrap)
@ -391,8 +389,14 @@ class ProcessLauncher(object):
if not _is_sighup_and_daemon(self.sigcaught): if not _is_sighup_and_daemon(self.sigcaught):
break break
cfg.CONF.reload_config_files()
for service in set(
[wrap.service for wrap in self.children.values()]):
service.reset()
for pid in self.children: for pid in self.children:
os.kill(pid, signal.SIGHUP) os.kill(pid, signal.SIGHUP)
self.running = True self.running = True
self.sigcaught = None self.sigcaught = None
except eventlet.greenlet.GreenletExit: except eventlet.greenlet.GreenletExit:

View File

@ -17,6 +17,7 @@ import threading
import eventlet import eventlet
from eventlet import greenpool from eventlet import greenpool
from magnum.openstack.common._i18n import _LE
from magnum.openstack.common import loopingcall from magnum.openstack.common import loopingcall
@ -98,15 +99,15 @@ class ThreadGroup(object):
x.stop() x.stop()
except eventlet.greenlet.GreenletExit: except eventlet.greenlet.GreenletExit:
pass pass
except Exception as ex: except Exception:
LOG.exception(ex) LOG.exception(_LE('Error stopping thread.'))
def stop_timers(self): def stop_timers(self):
for x in self.timers: for x in self.timers:
try: try:
x.stop() x.stop()
except Exception as ex: except Exception:
LOG.exception(ex) LOG.exception(_LE('Error stopping timer.'))
self.timers = [] self.timers = []
def stop(self, graceful=False): def stop(self, graceful=False):
@ -132,8 +133,8 @@ class ThreadGroup(object):
x.wait() x.wait()
except eventlet.greenlet.GreenletExit: except eventlet.greenlet.GreenletExit:
pass pass
except Exception as ex: except Exception:
LOG.exception(ex) LOG.exception(_LE('Error waiting on ThreadGroup.'))
current = threading.current_thread() current = threading.current_thread()
# Iterate over a copy of self.threads so thread_done doesn't # Iterate over a copy of self.threads so thread_done doesn't

View File

@ -7,7 +7,6 @@ module=loopingcall
module=periodic_task module=periodic_task
module=service module=service
module=systemd module=systemd
module=versionutils
module=threadgroup module=threadgroup
# The base module to hold the copy of openstack.common # The base module to hold the copy of openstack.common