From 77b3538c96f34b78b0daa78ae18edb9a889fd757 Mon Sep 17 00:00:00 2001 From: Norman Fomferra Date: Sun, 2 Oct 2022 09:06:44 +0200 Subject: [PATCH 1/2] Registered signals for termination --- xcube/server/webservers/tornado.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/xcube/server/webservers/tornado.py b/xcube/server/webservers/tornado.py index 8b29e6f06..fbd8de009 100644 --- a/xcube/server/webservers/tornado.py +++ b/xcube/server/webservers/tornado.py @@ -23,6 +23,8 @@ import concurrent.futures import functools import logging +import signal +import sys import traceback import urllib.parse from typing import (Any, Optional, Sequence, Union, Callable, Type, @@ -64,6 +66,8 @@ def __init__(self, io_loop: Optional[tornado.ioloop.IOLoop] = None): self._application = application or tornado.web.Application() self._io_loop = io_loop + self._server: Optional[tornado.web.HTTPServer] = None + self.configure_signals() self.configure_logging() @property @@ -149,7 +153,9 @@ def start(self, ctx: Context): address = config["address"] tornado_settings = config.get("tornado", {}) - self.application.listen(port, address=address, **tornado_settings) + self._server = self.application.listen(port, + address=address, + **tornado_settings) address_ = "127.0.0.1" if address == "0.0.0.0" else address # TODO: get test URL template from configuration @@ -188,6 +194,25 @@ def run_in_executor( *args ) + def shutdown(self): + LOG.info('Shutting down...') + # noinspection PyBroadException + try: + if self._server is not None: + self._server.stop() + self.io_loop.stop() + except Exception as e: + LOG.error(f'Shutdown failed: {e}', exc_info=True) + sys.exit(1) + + def configure_signals(self): + def sig_handler(signum, frame): + self.io_loop.add_callback_from_signal(self.shutdown) + + signal.signal(signal.SIGTERM, sig_handler) + signal.signal(signal.SIGINT, sig_handler) + signal.signal(signal.SIGABRT, sig_handler) + @staticmethod def configure_logging(): # Configure Tornado loggers to use root handlers, so we From d0a4a7a83a0be4e3a1657dc7afe41c337789e4ce Mon Sep 17 00:00:00 2001 From: Norman Fomferra Date: Sun, 2 Oct 2022 09:19:51 +0200 Subject: [PATCH 2/2] Registered signals for termination --- xcube/server/webservers/tornado.py | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/xcube/server/webservers/tornado.py b/xcube/server/webservers/tornado.py index fbd8de009..9de5c2d89 100644 --- a/xcube/server/webservers/tornado.py +++ b/xcube/server/webservers/tornado.py @@ -67,7 +67,6 @@ def __init__(self, self._application = application or tornado.web.Application() self._io_loop = io_loop self._server: Optional[tornado.web.HTTPServer] = None - self.configure_signals() self.configure_logging() @property @@ -164,9 +163,13 @@ def start(self, ctx: Context): LOG.info(f"Try {test_url}") LOG.info(f"Press CTRL+C to stop service") + self.configure_signals() + self.io_loop.start() def stop(self, ctx: Context): + if self._server is not None: + self._server.stop() self.io_loop.stop() def call_later(self, @@ -194,20 +197,9 @@ def run_in_executor( *args ) - def shutdown(self): - LOG.info('Shutting down...') - # noinspection PyBroadException - try: - if self._server is not None: - self._server.stop() - self.io_loop.stop() - except Exception as e: - LOG.error(f'Shutdown failed: {e}', exc_info=True) - sys.exit(1) - def configure_signals(self): def sig_handler(signum, frame): - self.io_loop.add_callback_from_signal(self.shutdown) + self.io_loop.add_callback_from_signal(self.stop) signal.signal(signal.SIGTERM, sig_handler) signal.signal(signal.SIGINT, sig_handler)