From 7401d0924a3c17513df473a00a377af91de6a837 Mon Sep 17 00:00:00 2001 From: Vaclav Bartos <bartos@cesnet.cz> Date: Fri, 26 May 2017 15:09:56 +0200 Subject: [PATCH] Client: Fixed memory leak in Error object --- warden3/warden_client/warden_client.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/warden3/warden_client/warden_client.py b/warden3/warden_client/warden_client.py index 9e78526..9f71393 100644 --- a/warden3/warden_client/warden_client.py +++ b/warden3/warden_client/warden_client.py @@ -120,6 +120,14 @@ class Error(Exception): kwargs["send_events_limit"] = int(kwargs["send_events_limit"]) except Exception: del kwargs["send_events_limit"] + if "exc" in kwargs: + # Traceback objects cause reference loops, so memory may be not + # correctly free'd. We only need traceback to log it in str_debug(), + # so let's get the string representation now and forget the + # traceback object, thus preventing the loop. + exctype, excvalue, tb = kwargs["exc"] + tb = format_tb(tb) + kwargs["exc"] = exctype, excvalue, tb self.errors.append(kwargs) @@ -211,10 +219,10 @@ class Error(Exception): out.append(self.str_preamble(e)) if not "exc" in e or not e["exc"]: return "" - exc_tb = e["exc"][2] + exc_tb = e["exc"][2] # exc_tb is string repr. of traceback object if exc_tb: out.append("Traceback:\n") - out.extend(format_tb(exc_tb)) + out.extend(exc_tb) return "".join(out) -- GitLab