From 8d51aed6796e8560fc30a88972152aff281b08e1 Mon Sep 17 00:00:00 2001 From: allegroai <> Date: Sun, 5 Mar 2023 18:03:39 +0200 Subject: [PATCH] Protect against cache folders without permission --- clearml_agent/helper/package/base.py | 40 ++++++++++++++++------ clearml_agent/helper/package/translator.py | 12 ++++++- 2 files changed, 40 insertions(+), 12 deletions(-) diff --git a/clearml_agent/helper/package/base.py b/clearml_agent/helper/package/base.py index 60c7737..504e1f4 100644 --- a/clearml_agent/helper/package/base.py +++ b/clearml_agent/helper/package/base.py @@ -192,8 +192,13 @@ class PackageManager(object): if not self._get_cache_manager(): return None - keys = self._generate_reqs_hash_keys(requirements, docker_cmd, python_version, cuda_version) - return self._get_cache_manager().copy_cached_entry(keys, destination_folder) + try: + keys = self._generate_reqs_hash_keys(requirements, docker_cmd, python_version, cuda_version) + return self._get_cache_manager().copy_cached_entry(keys, destination_folder) + except Exception as ex: + print("WARNING: Failed accessing venvs cache at {}: {}".format(destination_folder, ex)) + print("WARNING: Skipping venv cache - folder not accessible!") + return None def add_cached_venv( self, @@ -210,9 +215,15 @@ class PackageManager(object): """ if not self._get_cache_manager(): return - keys = self._generate_reqs_hash_keys(requirements, docker_cmd, python_version, cuda_version) - return self._get_cache_manager().add_entry( - keys=keys, source_folder=source_folder, exclude_sub_folders=exclude_sub_folders) + + try: + keys = self._generate_reqs_hash_keys(requirements, docker_cmd, python_version, cuda_version) + return self._get_cache_manager().add_entry( + keys=keys, source_folder=source_folder, exclude_sub_folders=exclude_sub_folders) + except Exception as ex: + print("WARNING: Failed accessing venvs cache at {}: {}".format(source_folder, ex)) + print("WARNING: Skipping venv cache - folder not accessible!") + return None def get_cache_folder(self): # type: () -> Optional[Path] @@ -280,12 +291,19 @@ class PackageManager(object): def _get_cache_manager(self): if not self._cache_manager: - cache_folder = ENV_VENV_CACHE_PATH.get() or self.session.config.get(self._config_cache_folder, None) - if not cache_folder: + cache_folder = None + try: + cache_folder = ENV_VENV_CACHE_PATH.get() or self.session.config.get(self._config_cache_folder, None) + if not cache_folder: + return None + + max_entries = int(self.session.config.get(self._config_cache_max_entries, 10)) + free_space_threshold = float(self.session.config.get(self._config_cache_free_space_threshold, 0)) + self._cache_manager = FolderCache( + cache_folder, max_cache_entries=max_entries, min_free_space_gb=free_space_threshold) + except Exception as ex: + print("WARNING: Failed accessing venvs cache at {}: {}".format(cache_folder, ex)) + print("WARNING: Skipping venv cache - folder not accessible!") return None - max_entries = int(self.session.config.get(self._config_cache_max_entries, 10)) - free_space_threshold = float(self.session.config.get(self._config_cache_free_space_threshold, 0)) - self._cache_manager = FolderCache( - cache_folder, max_cache_entries=max_entries, min_free_space_gb=free_space_threshold) return self._cache_manager diff --git a/clearml_agent/helper/package/translator.py b/clearml_agent/helper/package/translator.py index f103a17..060063b 100644 --- a/clearml_agent/helper/package/translator.py +++ b/clearml_agent/helper/package/translator.py @@ -1,3 +1,4 @@ +from tempfile import mkdtemp from typing import Text from furl import furl @@ -20,7 +21,16 @@ class RequirementsTranslator(object): config = session.config self.cache_dir = cache_dir or Path(config["agent.pip_download_cache.path"]).expanduser().as_posix() self.enabled = config["agent.pip_download_cache.enabled"] - Path(self.cache_dir).mkdir(parents=True, exist_ok=True) + # noinspection PyBroadException + try: + Path(self.cache_dir).mkdir(parents=True, exist_ok=True) + except Exception: + temp_cache_folder = mkdtemp(prefix='pip_download_cache.') + print("Failed creating pip download cache folder at `{}` reverting to `{}`".format( + self.cache_dir, temp_cache_folder)) + self.cache_dir = temp_cache_folder + Path(self.cache_dir).mkdir(parents=True, exist_ok=True) + self.config = Config() self.pip = SystemPip(interpreter=interpreter, session=self._session) self._translate_back = {}