[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[dak/master 6/7] dakmultiprocessing: close all session



Make sure to close all sessions so we do not run out of connections.
Before this exceptions in the workers might leave open transactions
around.

Signed-off-by: Ansgar Burchardt <ansgar@debian.org>
---
 daklib/dakmultiprocessing.py |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)

diff --git a/daklib/dakmultiprocessing.py b/daklib/dakmultiprocessing.py
index 646f363..ded81a2 100644
--- a/daklib/dakmultiprocessing.py
+++ b/daklib/dakmultiprocessing.py
@@ -26,6 +26,14 @@ multiprocessing for DAK
 ###############################################################################
 
 import multiprocessing
+import sqlalchemy.orm.session
+
+def _func_wrapper(func, *args, **kwds):
+    try:
+        return func(*args, **kwds)
+    finally:
+        # Make sure connections are closed. We might die otherwise.
+        sqlalchemy.orm.session.Session.close_all()
 
 class Pool():
     def __init__(self, *args, **kwds):
@@ -33,7 +41,9 @@ class Pool():
         self.results = []
 
     def apply_async(self, func, args=(), kwds={}, callback=None):
-        self.results.append(self.pool.apply_async(func, args, kwds, callback))
+        wrapper_args = list(args)
+        wrapper_args.insert(0, func)
+        self.results.append(self.pool.apply_async(_func_wrapper, wrapper_args, kwds, callback))
 
     def close(self):
         self.pool.close()
-- 
1.7.2.5



Reply to: