From d1564b592e979b17301d75d6a544302d5ca8fbd8 Mon Sep 17 00:00:00 2001
From: Manuela Kuhn <manuela.kuhn@desy.de>
Date: Fri, 29 Apr 2016 15:32:44 +0200
Subject: [PATCH] Added term handler to TaskProvider and DataDispatcher

---
 src/sender/DataDispatcher.py | 10 +++++++++-
 src/sender/TaskProvider.py   | 15 +++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/sender/DataDispatcher.py b/src/sender/DataDispatcher.py
index f88dab20..475bb6fa 100644
--- a/src/sender/DataDispatcher.py
+++ b/src/sender/DataDispatcher.py
@@ -8,6 +8,7 @@ import logging
 import traceback
 import cPickle
 import shutil
+import signal
 from multiprocessing import Process
 
 try:
@@ -53,7 +54,9 @@ class DataDispatcher():
         self.id              = id
         self.log             = self.__getLogger(logQueue)
 
-        self.currentPID         = os.getpid()
+        signal.signal(signal.SIGTERM, self.signal_term_handler)
+
+        self.currentPID      = os.getpid()
         self.log.debug("DataDispatcher-" + str(self.id) + " started (PID " + str(self.currentPID) + ").")
 
         self.controlConId    = controlConId
@@ -297,6 +300,11 @@ class DataDispatcher():
             self.context = None
 
 
+    def signal_term_handler(self, signal, frame):
+        self.log.debug('got SIGTERM')
+        self.stop()
+
+
     def __exit__ (self):
         self.stop()
 
diff --git a/src/sender/TaskProvider.py b/src/sender/TaskProvider.py
index 7f04013a..6f9f965b 100644
--- a/src/sender/TaskProvider.py
+++ b/src/sender/TaskProvider.py
@@ -7,6 +7,8 @@ import logging
 import sys
 import trace
 import cPickle
+import signal
+import errno
 
 try:
     BASE_PATH = os.path.dirname ( os.path.dirname ( os.path.dirname ( os.path.realpath ( __file__ ) )))
@@ -45,6 +47,8 @@ class TaskProvider():
 
         self.log                = self.getLogger(logQueue)
 
+        signal.signal(signal.SIGTERM, self.signal_term_handler)
+
         self.currentPID         = os.getpid()
         self.log.debug("TaskProvider started (PID " + str(self.currentPID) + ").")
 
@@ -158,6 +162,12 @@ class TaskProvider():
                 workloadList = self.eventDetector.getNewEvent()
             except KeyboardInterrupt:
                 break
+            except IOError as e:
+                if e.errno == errno.EINTR:
+                    break
+                else:
+                    self.log.error("Invalid fileEvent message received.", exc_info=True)
+                    continue
             except:
                 self.log.error("Invalid fileEvent message received.", exc_info=True)
                 #skip all further instructions and continue with next iteration
@@ -240,6 +250,11 @@ class TaskProvider():
             self.context = None
 
 
+    def signal_term_handler(self, signal, frame):
+        self.log.debug('got SIGTERM')
+        self.stop()
+
+
     def __exit__ (self):
         self.stop()
 
-- 
GitLab