summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStuart McLaren <stuart.mclaren@hp.com>2014-10-21 16:59:43 +0000
committerLouis Taylor <louis@kragniz.eu>2015-04-07 10:45:29 +0000
commit0c7f1721177762b9f8fec9e9bfa3249aaeeecdc0 (patch)
treef7c29927f380ac4aedc1c1b6f6aa15e1e9a2f951
parent6dc5477a12b9b904332ac6fe7932abbc7a0275a7 (diff)
downloadglance-0c7f1721177762b9f8fec9e9bfa3249aaeeecdc0.tar.gz
Zero downtime config reload (glance-control)
Update glance-control to send a SIGHUP rather than perform a start/stop for the 'reload' operation. This allows picking up new configuration values without interrupting the service. Closes-bug: 1436275 Change-Id: I5a653daa3e582b665c0a2c402cf2d7c9e47e1c38
-rw-r--r--doc/source/controllingservers.rst13
-rw-r--r--glance/cmd/control.py26
2 files changed, 37 insertions, 2 deletions
diff --git a/doc/source/controllingservers.rst b/doc/source/controllingservers.rst
index c0216f6dd..1bc3b8858 100644
--- a/doc/source/controllingservers.rst
+++ b/doc/source/controllingservers.rst
@@ -222,3 +222,16 @@ here::
$> sudo glance-control registry restart etc/glance-registry.conf
Stopping glance-registry pid: 17611 signal: 15
Starting glance-registry with /home/jpipes/repos/glance/trunk/etc/glance-registry.conf
+
+Reloading a server
+-------------------
+
+You can reload a server with the ``glance-control`` program, as demonstrated
+here::
+
+ $> sudo glance-control api reload
+ Reloading glance-api (pid 18506) with signal(1)
+
+A reload sends a SIGHUP signal to the master process and causes new configuration
+settings to be picked up without any interruption to the running service (provided
+neither bind_host or bind_port has changed).
diff --git a/glance/cmd/control.py b/glance/cmd/control.py
index a1db670a3..e2e480af0 100644
--- a/glance/cmd/control.py
+++ b/glance/cmd/control.py
@@ -54,6 +54,7 @@ CONF = cfg.CONF
ALL_COMMANDS = ['start', 'status', 'stop', 'shutdown', 'restart',
'reload', 'force-reload']
ALL_SERVERS = ['api', 'registry', 'scrubber']
+RELOAD_SERVERS = ['glance-api', 'glance-registry']
GRACEFUL_SHUTDOWN_SERVERS = ['glance-api', 'glance-registry',
'glance-scrubber']
MAX_DESCRIPTORS = 32768
@@ -242,6 +243,28 @@ def get_pid_file(server, pid_file):
return pid_file
+def do_reload(pid_file, server):
+ if server not in RELOAD_SERVERS:
+ msg = (_('Reload of %(serv)s not supported') % {'serv': server})
+ sys.exit(msg)
+
+ pid = None
+ if os.path.exists(pid_file):
+ with open(pid_file, 'r') as pidfile:
+ pid = int(pidfile.read().strip())
+ else:
+ msg = (_('Server %(serv)s is stopped') % {'serv': server})
+ sys.exit(msg)
+
+ sig = signal.SIGHUP
+ try:
+ print(_('Reloading %(serv)s (pid %(pid)s) with signal(%(sig)s)')
+ % {'serv': server, 'pid': pid, 'sig': sig})
+ os.kill(pid, sig)
+ except OSError:
+ print(_("Process %d not running") % pid)
+
+
def do_stop(server, args, graceful=False):
if graceful and server in GRACEFUL_SHUTDOWN_SERVERS:
sig = signal.SIGHUP
@@ -383,8 +406,7 @@ def main():
if CONF.server.command in ('reload', 'force-reload'):
for server in CONF.server.servers:
- do_stop(server, CONF.server.args, graceful=True)
pid_file = get_pid_file(server, CONF.pid_file)
- do_start('Restart', pid_file, server, CONF.server.args)
+ do_reload(pid_file, server)
sys.exit(exitcode)