From 4dfb3f9ab382e34feee9d6d0c68852a0a6328a17 Mon Sep 17 00:00:00 2001
From: David Trattnig <david@subsquare.at>
Date: Fri, 14 Jan 2022 18:28:06 +0100
Subject: [PATCH] Improve graceful shutdown. #88

---
 run.py                      | 21 ++++++++++-----------
 src/engine.py               |  2 ++
 src/scheduling/api.py       |  2 +-
 src/scheduling/programme.py |  2 +-
 src/scheduling/scheduler.py |  2 +-
 5 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/run.py b/run.py
index f56e0569..f50c6319 100755
--- a/run.py
+++ b/run.py
@@ -26,6 +26,7 @@ import os
 import sys
 import signal
 import logging
+import threading
 
 from flask               import Flask
 from flask_sqlalchemy    import SQLAlchemy
@@ -54,7 +55,6 @@ class EngineRunner:
     logger = None
     config = None
     engine = None
-    lqs = None
 
 
     def __init__(self):
@@ -64,12 +64,12 @@ class EngineRunner:
         self.config = config
         AuraLogger(self.config)
         self.logger = logging.getLogger("AuraEngine")
-        
+
 
     def run(self):
         """
         Starts Engine Core.
-        """                        
+        """
         from src.engine import Engine
         self.engine = Engine()
 
@@ -86,15 +86,14 @@ class EngineRunner:
         """
         Shutdown of the engine. Also terminates the Liquidsoap thread.
         """
+        for thread in threading.enumerate():
+            self.logger.info(thread.name)
+
         if self.engine:
             self.engine.terminate()
 
-        if self.lqs:
-            self.lqs.terminate()
-            self.logger.info("Terminated Liquidsoap")
-
-        self.logger.info("Gracefully terminated Aura Engine! (signum:%s, frame:%s)" % (signum, frame))
-        sys.exit(0)        
+        self.logger.info(f"Gracefully terminated Aura Engine! (signum:{signum}, frame:{frame})")
+        sys.exit(0)
 
 
 
@@ -103,7 +102,7 @@ class EngineRunner:
 #
 
 
-if __name__ == "__main__":        
+if __name__ == "__main__":
     runner = EngineRunner()
     signal.signal(signal.SIGINT, runner.exit_gracefully)
     signal.signal(signal.SIGTERM, runner.exit_gracefully)
@@ -112,5 +111,5 @@ if __name__ == "__main__":
         if "--recreate-database" in sys.argv:
             runner.recreate_db()
             sys.exit(0)
-         
+
     runner.run()
diff --git a/src/engine.py b/src/engine.py
index da4e963e..af8aebed 100644
--- a/src/engine.py
+++ b/src/engine.py
@@ -167,10 +167,12 @@ class Engine():
         """
         Terminates the engine and all related processes.
         """
+        if self.scheduler: self.scheduler.terminate()
         if self.eci: self.eci.terminate()
 
 
 
+
 #
 #   PLAYER
 #
diff --git a/src/scheduling/api.py b/src/scheduling/api.py
index c7e97657..e566c1aa 100644
--- a/src/scheduling/api.py
+++ b/src/scheduling/api.py
@@ -304,5 +304,5 @@ class ApiFetcher(threading.Thread):
         """
         Terminates the thread.
         """
-        self.logger.info("Shutting down API fetcher...")
+        self.logger.info(SU.yellow("[ApiFetcher] Shutting down..."))
         self.stop_event.set()
diff --git a/src/scheduling/programme.py b/src/scheduling/programme.py
index 3c29ca13..fb15cdfe 100644
--- a/src/scheduling/programme.py
+++ b/src/scheduling/programme.py
@@ -230,7 +230,7 @@ class ProgrammeService():
         """
         Called when thread is stopped or a signal to terminate is received.
         """
-        self.logger.info("Shutting down programme service ...")
+        self.logger.info(SU.yellow("[ProgrammeService] Shutting down..."))
         if self.api_fetcher:
             self.api_fetcher.terminate()
 
diff --git a/src/scheduling/scheduler.py b/src/scheduling/scheduler.py
index 62cbfd5d..a9728f72 100644
--- a/src/scheduling/scheduler.py
+++ b/src/scheduling/scheduler.py
@@ -407,7 +407,7 @@ class AuraScheduler(threading.Thread):
         """
         Called when thread is stopped or a signal to terminate is received.
         """
-        self.logger.info("Shutting down scheduler ...")
+        self.logger.info(SU.yellow("[Scheduler] Shutting down..."))
         self.programme.terminate()
         self.exit_event.set()
 
-- 
GitLab