From c974f4fdc062fb57f31734b6c9dcbc202a6b9d22 Mon Sep 17 00:00:00 2001
From: David Hoese <david.hoese@ssec.wisc.edu>
Date: Tue, 2 Jul 2024 13:55:06 -0500
Subject: [PATCH] Set socket timeout on loggernet receiver

---
 metobscommon/archive/loggernet_receiver.py | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/metobscommon/archive/loggernet_receiver.py b/metobscommon/archive/loggernet_receiver.py
index f52b8f1..a589eba 100644
--- a/metobscommon/archive/loggernet_receiver.py
+++ b/metobscommon/archive/loggernet_receiver.py
@@ -19,14 +19,24 @@ LOG = logging.getLogger(__name__)
 def _ldmp_worker(host, port, queue, run_event):
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
     s.connect((host, port))
+    s.settimeout(30.0)
 
     data_str = ""
     while run_event.is_set():
         # Get the data from the LDMP server
         while not data_str or data_str[-1] != '\n':
-            data = s.recv(2048)
+            try:
+                data = s.recv(2048)
+            except TimeoutError:
+                LOG.info("Timeout error (30 seconds) from LDMP socket")
+                if not run_event.is_set():
+                    LOG.debug("Signal to stop background process seen during receive timeout")
+                    break
             data_str += data.decode('utf8')
 
+        if not run_event.is_set():
+            continue
+
         # Acknowledge that we received the record
         s.send(b'\r')
 
@@ -63,9 +73,10 @@ class LDMPReceiver(object):
         if not self._started:
             return
         self._run_event.clear()
+        LOG.info("Background process told to stop")
         self._worker.join()
         self._started = False
-        LOG.info("Background thread successfully terminated")
+        LOG.info("Background process successfully terminated")
 
     def close(self):
         return self.stop()
@@ -80,7 +91,7 @@ class LDMPReceiver(object):
     def __iter__(self):
         try:
             while True:
-                yield self._queue.get(timeout=600)  # 5 minutes
+                yield self._queue.get(timeout=300)  # 5 minutes
         except KeyboardInterrupt:
             LOG.info("Keyboard interrupt encountered, killing background "
                      "thread...")
-- 
GitLab