From a48f1c4b5870bb9922bb18e186c02bf2d2dfbd40 Mon Sep 17 00:00:00 2001 From: allegroai <> Date: Sun, 5 Feb 2023 10:19:44 +0200 Subject: [PATCH] Keep original upload URI when reporting events when URI is changed due to path substitution --- .../backend_interface/metrics/interface.py | 4 +-- clearml/storage/helper.py | 35 ++++++++++++------- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/clearml/backend_interface/metrics/interface.py b/clearml/backend_interface/metrics/interface.py index 1fde6cad..3c7cceed 100644 --- a/clearml/backend_interface/metrics/interface.py +++ b/clearml/backend_interface/metrics/interface.py @@ -167,9 +167,9 @@ class Metrics(InterfaceBase): storage = self._get_storage(upload_uri) retries = getattr(e, 'retries', None) or self._file_upload_retries if isinstance(e.stream, Path): - url = storage.upload(e.stream.as_posix(), e.url, retries=retries) + url = storage.upload(e.stream.as_posix(), e.url, retries=retries, return_canonized=False) else: - url = storage.upload_from_stream(e.stream, e.url, retries=retries) + url = storage.upload_from_stream(e.stream, e.url, retries=retries, return_canonized=False) e.event.update(url=url) except Exception as exp: self._get_logger().warning("Failed uploading to {} ({})".format( diff --git a/clearml/storage/helper.py b/clearml/storage/helper.py index 274c0c1b..95b4f79a 100644 --- a/clearml/storage/helper.py +++ b/clearml/storage/helper.py @@ -698,9 +698,9 @@ class StorageHelper(object): return folder_uri - def upload_from_stream(self, stream, dest_path, extra=None, retries=1): - dest_path = self._canonize_url(dest_path) - object_name = self._normalize_object_name(dest_path) + def upload_from_stream(self, stream, dest_path, extra=None, retries=1, return_canonized=True): + canonized_dest_path = self._canonize_url(dest_path) + object_name = self._normalize_object_name(canonized_dest_path) extra = extra.copy() if extra else {} extra.update(self._extra) last_ex = None @@ -726,38 +726,47 @@ class StorageHelper(object): if last_ex: raise last_ex + result_dest_path = canonized_dest_path if return_canonized else dest_path + if self.scheme in _HttpDriver.schemes: # quote link - dest_path = quote_url(dest_path) + result_dest_path = quote_url(result_dest_path) - return dest_path + return result_dest_path - def upload(self, src_path, dest_path=None, extra=None, async_enable=False, cb=None, retries=3): + def upload( + self, src_path, dest_path=None, extra=None, async_enable=False, cb=None, retries=3, return_canonized=True + ): if not dest_path: dest_path = os.path.basename(src_path) - dest_path = self._canonize_url(dest_path) + canonized_dest_path = self._canonize_url(dest_path) dest_path = dest_path.replace('\\', '/') + canonized_dest_path = canonized_dest_path.replace('\\', '/') + + result_path = canonized_dest_path if return_canonized else dest_path if cb and self.scheme in _HttpDriver.schemes: # store original callback a_cb = cb # quote link - def callback(a_path): - return a_cb(quote_url(a_path) if a_path else a_path) + def callback(result): + return a_cb(quote_url(result_path) if result else result) # replace callback with wrapper cb = callback if async_enable: - data = self._UploadData(src_path=src_path, dest_path=dest_path, extra=extra, callback=cb, retries=retries) + data = self._UploadData( + src_path=src_path, dest_path=canonized_dest_path, extra=extra, callback=cb, retries=retries + ) StorageHelper._initialize_upload_pool() return StorageHelper._upload_pool.apply_async(self._do_async_upload, args=(data,)) else: - res = self._do_upload(src_path, dest_path, extra, cb, verbose=False, retries=retries) + res = self._do_upload(src_path, canonized_dest_path, extra, cb, verbose=False, retries=retries) if res: - res = quote_url(res) - return res + result_path = quote_url(result_path) + return result_path def list(self, prefix=None, with_metadata=False): """