From 2daf7de67be5f8c31025d2e79029a585c12bd662 Mon Sep 17 00:00:00 2001
From: Jan Rinze Peterzon <peterzon@astron.nl>
Date: Wed, 21 Oct 2015 15:06:39 +0000
Subject: [PATCH] Task #8571: We can't pickle the backtrace and exceptions so
 only use the backtrace string when applicable. Also ForwardExceptions at the
 client tries to throw the same exception.

---
 LCS/Messaging/python/messaging/RPC.py     | 23 ++++++++++++++++----
 LCS/Messaging/python/messaging/Service.py | 26 +++++++++++++++--------
 2 files changed, 36 insertions(+), 13 deletions(-)

diff --git a/LCS/Messaging/python/messaging/RPC.py b/LCS/Messaging/python/messaging/RPC.py
index ac54343d943..800444fd632 100644
--- a/LCS/Messaging/python/messaging/RPC.py
+++ b/LCS/Messaging/python/messaging/RPC.py
@@ -59,13 +59,19 @@ class RPC():
         if (isinstance(answer,ReplyMessage)):
            status={}
            exception=None
+           errmsg=None
+           errbacktrace=None
            try:
               if (answer.status!="OK"):
                  status["state"]=answer.status
                  status["errmsg"]=answer.errmsg
                  status["backtrace"]=answer.backtrace
-                 if (answer.exception!=""):
-                    exception=pickle.loads(answer.exception)
+                 #if (answer.exception!=""):
+                 #    exception=pickle.loads(answer.exception)
+                 if (answer.errmsg!=""):
+                    errmsg=answer.errmsg
+                 if (answer.backtrace!=""):
+                    errbacktrace=answer.backtrace
               else:
                  status="OK"
            except Exception as e:
@@ -74,8 +80,17 @@ class RPC():
               status["backtrace"]=""
            else:
               if (self.ForwardExceptions==True):
-                if (exception!=None):
-                  raise exception[0],exception[1],exception[2]
+                #if (exception!=None):
+                #  raise exception[0],exception[1],exception[2]
+                #else:
+                if (errmsg!=None):
+                    excep_mod=__import__("exceptions")
+                    excep_class_= getattr(excep_mod,errmsg.split(':')[0],None)
+                    if (excep_class_!=None):
+                      instance=excep_class_(errbacktrace)
+                      raise(instance)
+                    else:
+                      raise(Exception(errmsg))
         try:
            answer=(answer.content,status)
         except Exception as e:
diff --git a/LCS/Messaging/python/messaging/Service.py b/LCS/Messaging/python/messaging/Service.py
index 921eca9178d..6e969de61da 100644
--- a/LCS/Messaging/python/messaging/Service.py
+++ b/LCS/Messaging/python/messaging/Service.py
@@ -100,7 +100,7 @@ class Service():
              status="unknown"
              backtrace=None
              errtxt=None
-             exception=None
+             #exception=None
 
              # Keep track of number of processed messages
              self.counter[index]+=1
@@ -131,19 +131,27 @@ class Service():
                   print errtxt
                   print backtrace
                 replymessage=None
-                exception=pickle.dumps(exception)
+                #exception=pickle.dumps(exc_info)
 
 
              self._debug("Done call")
-             # Compile Event message from reply and status.
+             # Compose Reply message from reply and status.
              ToSend=ReplyMessage(replymessage,msg.reply_to)
              ToSend.status=status
-             if (errtxt!=None):
-                ToSend.errmsg=errtxt
-             if (backtrace!=None):
-                ToSend.backtrace=backtrace
-             if (exception!=None):
-                ToSend.exception=exception
+             if (status!="OK"):
+               if (errtxt!=None):
+                  ToSend.errmsg=errtxt
+               else:
+                  ToSend.errmsg=""
+               if (backtrace!=None):
+                  ToSend.backtrace=backtrace
+               else:
+                  ToSend.backtrace=""
+               #if (exception!=None):
+               #  ToSend.exception=exception
+               else:
+                  ToSend.exception=""
+
 
              # ensure to deliver at the destination in the reply_to field
              #ToSend.subject=msg.reply_to
-- 
GitLab