From 07d4043700e57afc98c4ebd8645f95ea6c0d6241 Mon Sep 17 00:00:00 2001
From: Thomas Kluyver <thomas@kluyver.me.uk>
Date: Tue, 14 Jun 2022 15:29:10 +0100
Subject: [PATCH] Clean shutdown on SIGTERM

---
 webservice/job_monitor.py | 21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/webservice/job_monitor.py b/webservice/job_monitor.py
index 5b1d2140b..b63383cfa 100644
--- a/webservice/job_monitor.py
+++ b/webservice/job_monitor.py
@@ -3,6 +3,7 @@ import argparse
 import json
 import locale
 import logging
+import signal
 import time
 from datetime import datetime, timezone
 from pathlib import Path
@@ -93,6 +94,13 @@ class JobsMonitor:
         self.kafka_topic = config['kafka']['topic']
         self.time_interval = int(config['web-service']['job-update-interval'])
 
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        self.job_db.close()
+        self.kafka_prod.close(timeout=5)
+
     def run(self):
         while True:
             try:
@@ -293,6 +301,9 @@ class JobsMonitor:
             log.error("Failed to update MDC dark run id %s", dark_run_id)
             log.error(Errors.MDC_RESPONSE.format(response))
 
+def interrupted(signum, frame):
+    raise KeyboardInterrupt
+
 def main(argv=None):
     # Ensure files are opened as UTF-8 by default, regardless of environment.
     locale.setlocale(locale.LC_CTYPE, ('en_US', 'UTF-8'))
@@ -318,7 +329,15 @@ def main(argv=None):
     )
     # DEBUG logs from kafka-python are very verbose, so we'll turn them off
     logging.getLogger('kafka').setLevel(logging.INFO)
-    JobsMonitor(config).run()
+
+    # Treat SIGTERM like SIGINT (Ctrl-C) & do a clean shutdown
+    signal.signal(signal.SIGTERM, interrupted)
+
+    with JobsMonitor(config) as jm:
+        try:
+            jm.run()
+        except KeyboardInterrupt:
+            logging.info("Shutting down on SIGINT/SIGTERM")
 
 
 if __name__ == "__main__":
-- 
GitLab