Merge branch '14291-cdc-aws' refs #14291
[arvados.git] / services / fuse / tests / integration_test.py
index b485037c8cdfe5b897d2de64f42aeaba9ba3ea20..3c11fa2920654edeb1e3412dee60e350f23c64dd 100644 (file)
@@ -1,3 +1,7 @@
+# Copyright (C) The Arvados Authors. All rights reserved.
+#
+# SPDX-License-Identifier: AGPL-3.0
+
 import arvados
 import arvados_fuse
 import arvados_fuse.command
@@ -13,12 +17,8 @@ import sys
 import tempfile
 import unittest
 
-_pool = None
-
-
 @atexit.register
 def _pool_cleanup():
-    global _pool
     if _pool is None:
         return
     _pool.close()
@@ -32,6 +32,17 @@ def wrap_static_test_method(modName, clsName, funcName, args, kwargs):
     Test().runTest(*args, **kwargs)
 
 
+# To avoid Python's threading+multiprocessing=deadlock problems, we
+# use a single global pool with maxtasksperchild=None for the entire
+# test suite.
+_pool = None
+def workerPool():
+    global _pool
+    if _pool is None:
+        _pool = multiprocessing.Pool(processes=1, maxtasksperchild=None)
+    return _pool
+
+
 class IntegrationTest(unittest.TestCase):
     def pool_test(self, *args, **kwargs):
         """Run a static method as a unit test, in a different process.
@@ -39,13 +50,10 @@ class IntegrationTest(unittest.TestCase):
         If called by method 'foobar', the static method '_foobar' of
         the same class will be called in the other process.
         """
-        global _pool
-        if _pool is None:
-            _pool = multiprocessing.Pool(1, maxtasksperchild=1)
         modName = inspect.getmodule(self).__name__
         clsName = self.__class__.__name__
         funcName = inspect.currentframe().f_back.f_code.co_name
-        _pool.apply(
+        workerPool().apply(
             wrap_static_test_method,
             (modName, clsName, '_'+funcName, args, kwargs))
 
@@ -61,7 +69,6 @@ class IntegrationTest(unittest.TestCase):
     def setUp(self):
         self.mnt = tempfile.mkdtemp()
         run_test_server.authorize_with('active')
-        self.api = arvados.safeapi.ThreadSafeApiCache(arvados.config.settings())
 
     def tearDown(self):
         os.rmdir(self.mnt)