From a23427d1700e32d4fc5d49c16d72e3f3c24f65f9 Mon Sep 17 00:00:00 2001 From: Olivier Grisel Date: Thu, 15 Sep 2022 11:18:25 +0200 Subject: [PATCH] Test child raises parent exits cleanly more reliable on macos (#1335) --- joblib/test/test_memmapping.py | 51 ++++++++++------------------------ 1 file changed, 14 insertions(+), 37 deletions(-) diff --git a/joblib/test/test_memmapping.py b/joblib/test/test_memmapping.py index 5488ac8a7..a666c5aa0 100644 --- a/joblib/test/test_memmapping.py +++ b/joblib/test/test_memmapping.py @@ -586,39 +586,6 @@ def parallel_raise(array, temp_dirs): assert b"resource_tracker" not in err, err.decode() -@with_numpy -@with_multiprocessing -def test_nested_loop_error_in_grandchild_resource_tracker_silent(): - # Safety smoke test: test that nested parallel calls using the loky backend - # don't yield noisy resource_tracker outputs when the grandchild errors - # out. - cmd = '''if 1: - from joblib import Parallel, delayed - - - def raise_error(i): - raise ValueError - - - def nested_loop(f): - Parallel(backend="loky", n_jobs=2)( - delayed(f)(i) for i in range(10) - ) - - - if __name__ == "__main__": - Parallel(backend="loky", n_jobs=2)( - delayed(nested_loop)(func) for func in [raise_error] - ) - ''' - p = subprocess.Popen([sys.executable, '-c', cmd], - stderr=subprocess.PIPE, stdout=subprocess.PIPE) - p.wait() - out, err = p.communicate() - assert p.returncode == 1, out.decode() - assert b"resource_tracker" not in err, err.decode() - - @with_numpy @with_multiprocessing @parametrize("backend", ["multiprocessing", "loky"]) @@ -813,6 +780,7 @@ def test_child_raises_parent_exits_cleanly(backend): # - the resource_tracker does not emit any warnings. cmd = """if 1: import os + from pathlib import Path from time import sleep import numpy as np @@ -824,9 +792,9 @@ def test_child_raises_parent_exits_cleanly(backend): def get_temp_folder(parallel_obj, backend): if "{b}" == "loky": - return p._backend._workers._temp_folder + return Path(p._backend._workers._temp_folder) else: - return p._backend._pool._temp_folder + return Path(p._backend._pool._temp_folder) if __name__ == "__main__": @@ -839,13 +807,22 @@ def get_temp_folder(parallel_obj, backend): # the temporary folder should be deleted by the end of this # call but apparently on some file systems, this takes # some time to be visible. + # + # We attempt to write into the temporary folder to test for + # its existence and we wait for a maximum of 10 seconds. for i in range(100): - if not os.path.exists(temp_folder): + try: + with open(temp_folder / "some_file.txt", "w") as f: + f.write("some content") + except FileNotFoundError: + # temp_folder has been deleted, all is fine break + + # ... else, wait a bit and try again sleep(.1) else: raise AssertionError( - temp_folder + " was not deleted" + str(temp_folder) + " was not deleted" ) from e """.format(b=backend) env = os.environ.copy()