From fd2d6c6f5d46cad3e406e88eeb4d805455b5b3d8 Mon Sep 17 00:00:00 2001 From: allegroai <> Date: Fri, 17 Dec 2021 11:58:44 +0200 Subject: [PATCH] Fix path limitation on storage services (posix, object storage) when storing target artifacts by limiting length of project name (full path) and task name used for object path (issue #516) --- clearml/backend_interface/task/task.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/clearml/backend_interface/task/task.py b/clearml/backend_interface/task/task.py index 265d07ed..488967fe 100644 --- a/clearml/backend_interface/task/task.py +++ b/clearml/backend_interface/task/task.py @@ -503,8 +503,19 @@ class Task(IdObjectBase, AccessMixin, SetupUploadMixin): def _get_output_destination_suffix(self, extra_path=None): # type: (Optional[str]) -> str + # limit path to support various storage infrastructure limits (such as max path pn posix or object storage) + # project path limit to 256 (including subproject names), and task name limit to 128. + def limit_folder_name(a_name, uuid, max_length, always_add_uuid): + if always_add_uuid: + return '{}.{}'.format(a_name[:max(2, max_length-len(uuid)-1)], uuid) + if len(a_name) < max_length: + return a_name + return '{}.{}'.format(a_name[:max(2, max_length-len(uuid)-1)], uuid) + return '/'.join(quote(x, safe="'[]{}()$^,.; -_+-=") for x in - (self.get_project_name(), '%s.%s' % (self.name, self.data.id), extra_path) if x) + (limit_folder_name(self.get_project_name(), str(self.project), 256, False), + limit_folder_name(self.name, str(self.data.id), 128, True), + extra_path) if x) def _reload(self): # type: () -> Any