diff --git a/koji.spec b/koji.spec index 38b2c55a..a1caabf8 100644 --- a/koji.spec +++ b/koji.spec @@ -218,7 +218,6 @@ fi %post vm /sbin/chkconfig --add kojivmd -/sbin/service kojivmd condrestart &> /dev/null || : %preun vm if [ $1 = 0 ]; then diff --git a/vm/kojivmd b/vm/kojivmd index f014b4be..1659246d 100755 --- a/vm/kojivmd +++ b/vm/kojivmd @@ -23,7 +23,8 @@ import koji import koji.util from koji.daemon import SCM, TaskManager -from koji.tasks import ServerExit, BaseTaskHandler, MultiPlatformTask +from koji.tasks import ServerExit, ServerRestart, BaseTaskHandler, MultiPlatformTask +from koji.tasks import RestartTask, RestartVerifyTask import sys import logging import os @@ -181,7 +182,11 @@ def main(options, session): tm.scanPlugin(pt.load(name)) def shutdown(*args): raise SystemExit + def restart(*args): + logger.warn("Initiating graceful restart") + tm.restart_pending = True signal.signal(signal.SIGTERM,shutdown) + signal.signal(signal.SIGUSR1,restart) taken = False tm.cleanupAllVMs() while True: @@ -192,6 +197,9 @@ def main(options, session): except (SystemExit,ServerExit,KeyboardInterrupt): logger.warn("Exiting") break + except ServerRestart: + logger.warn("Restarting") + os.execv(sys.argv[0], sys.argv) except koji.AuthExpired: logger.error('Session expired') break diff --git a/vm/kojivmd.init b/vm/kojivmd.init index 1013c6b9..b0a6408d 100755 --- a/vm/kojivmd.init +++ b/vm/kojivmd.init @@ -54,6 +54,17 @@ restart() { start } +graceful() { + #SIGUSR1 initiates a graceful restart + pid=$(pidofproc kojivmd) + if test -z "$pid" + then + echo $"$prog not running" + else + kill -10 $pid + fi +} + # See how we were called. case "$1" in start) @@ -71,8 +82,11 @@ case "$1" in condrestart|try-restart) [ -f /var/lock/subsys/kojivmd ] && restart || : ;; + graceful) + graceful + ;; *) - echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}" + echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|graceful}" exit 1 esac