From 1466cfb795d794aea775539acc5ddcfe9bd34e71 Mon Sep 17 00:00:00 2001
From: Marko Mecina <marko.mecina@univie.ac.at>
Date: Thu, 19 Jan 2023 15:51:31 +0100
Subject: [PATCH] handle SQL reconnect in poolmanager recv thread

---
 Ccs/pus_datapool.py | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/Ccs/pus_datapool.py b/Ccs/pus_datapool.py
index 41b81f5..b2d62f6 100644
--- a/Ccs/pus_datapool.py
+++ b/Ccs/pus_datapool.py
@@ -30,6 +30,7 @@ from typing import NamedTuple
 from collections import deque
 from database.tm_db import DbTelemetryPool, DbTelemetry, scoped_session_maker, FEEDataTelemetry, RMapTelemetry
 import importlib
+from sqlalchemy.exc import OperationalError as SQLOperationalError
 
 
 cfg = confignator.get_config(check_interpolation=False)
@@ -665,12 +666,13 @@ class DatapoolManager:
         #     start_new = True
 
         new_session = self.session_factory_storage
+        creation_time = round(time.time())
 
         # If no TC Pool has been started start new one
         if start_new:
             pool_row = DbTelemetryPool(
                 pool_name=pool_name,
-                modification_time=time.time(),
+                modification_time=creation_time,
                 protocol=protocol)
             new_session.add(pool_row)
             # new_session.flush()
@@ -825,6 +827,11 @@ class DatapoolManager:
                 self.logger.debug('Socket timeout ({}:{})'.format(host, port))
                 new_session.commit()
                 continue
+            except SQLOperationalError as e:
+                self.logger.warning(e)
+                new_session.close()
+                pool_row = new_session.query(DbTelemetryPool).filter(DbTelemetryPool.pool_name == pool_name,
+                                                                     DbTelemetryPool.modification_time == creation_time).first()
             except socket.error as e:
                 self.logger.error('Socket error ({}:{})'.format(host, port))
                 self.logger.exception(e)
@@ -836,6 +843,10 @@ class DatapoolManager:
                 self.logger.exception(e)
                 self.connections[pool_name]['recording'] = False
                 break
+            except Exception as e:
+                self.logger.error(e)
+                self.connections[pool_name]['recording'] = False
+                break
         # if self.state[pool_row.pool_name] % 10 != 0:
         new_session.commit()
         new_session.close()
@@ -968,7 +979,7 @@ class DatapoolManager:
                 with self.lock:
                     self.databuflen += len(buf)
             except socket.timeout:
-                self.logger.info('Socket timeout {}:{} [TC RX]'.format(host, port))
+                self.logger.debug('Socket timeout {}:{} [TC RX]'.format(host, port))
                 continue
             except socket.error:
                 self.logger.error('Socket error')
-- 
GitLab