diff --git a/pyopencl/cache.py b/pyopencl/cache.py index 6e01c90ef760c9e11f4d1e687c29579b55d3072f..582a790811969f5f6478a19d89c05947057909c4 100644 --- a/pyopencl/cache.py +++ b/pyopencl/cache.py @@ -88,18 +88,32 @@ class CacheLockManager(CleanupBase): except OSError: pass + # This value was chosen based on the py-filelock package: + # https://github.com/tox-dev/py-filelock/blob/a6c8fabc4192fa7a4ae19b1875ee842ec5eb4f61/src/filelock/_api.py#L113 + # When running pyopencl in an application with multiple ranks + # that share a cache_dir, higher timeouts can lead to + # application stalls even with low numbers of ranks. + # cf. https://github.com/inducer/pyopencl/pull/504 + wait_time_seconds = 0.05 + + # Warn every 10 seconds if not able to acquire lock + warn_attempts = int(10/wait_time_seconds) + + # Exit after 60 seconds if not able to acquire lock + exit_attempts = int(60/wait_time_seconds) + from time import sleep - sleep(1) + sleep(wait_time_seconds) attempts += 1 - if attempts > 10: + if attempts % warn_attempts == 0: from warnings import warn warn("could not obtain cache lock--delete '%s' if necessary" % self.lock_file) - if attempts > 3 * 60: - raise RuntimeError("waited more than three minutes " + if attempts > exit_attempts: + raise RuntimeError("waited more than one minute " "on the lock file '%s'" "--something is wrong" % self.lock_file)