From 372b79de70de69411a37a92a93c61ab6dc4a55e0 Mon Sep 17 00:00:00 2001 From: jenswehner Date: Fri, 24 Jul 2026 13:30:00 +0000 Subject: [PATCH] Propagate directory upload errors without progress --- .../azure/ai/ml/_utils/_asset_utils.py | 3 +++ .../internal_utils/unittests/test_asset_utils.py | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/sdk/ml/azure-ai-ml/azure/ai/ml/_utils/_asset_utils.py b/sdk/ml/azure-ai-ml/azure/ai/ml/_utils/_asset_utils.py index ae1b487518be..babbb1677684 100644 --- a/sdk/ml/azure-ai-ml/azure/ai/ml/_utils/_asset_utils.py +++ b/sdk/ml/azure-ai-ml/azure/ai/ml/_utils/_asset_utils.py @@ -719,6 +719,9 @@ def upload_directory( future.result() # access result to propagate any exceptions file_path_name = futures_dict[future][0] pbar.update(size_dict.get(file_path_name) or 0) + else: + for future in as_completed(futures_dict): + future.result() @retry( diff --git a/sdk/ml/azure-ai-ml/tests/internal_utils/unittests/test_asset_utils.py b/sdk/ml/azure-ai-ml/tests/internal_utils/unittests/test_asset_utils.py index 1146aa49cea9..091977752a7c 100644 --- a/sdk/ml/azure-ai-ml/tests/internal_utils/unittests/test_asset_utils.py +++ b/sdk/ml/azure-ai-ml/tests/internal_utils/unittests/test_asset_utils.py @@ -5,6 +5,7 @@ import tempfile from pathlib import Path from typing import Callable, List, Tuple +from unittest.mock import patch import pytest @@ -19,6 +20,7 @@ get_ignore_file, get_object_hash, get_upload_files_from_folder, + upload_directory, ) from azure.ai.ml._utils.utils import convert_windows_path_to_unix from azure.ai.ml.constants._common import AutoDeleteCondition @@ -174,6 +176,19 @@ def basic_file(cls) -> "SymbolLinkTestCase": @pytest.mark.unittest @pytest.mark.core_sdk_test class TestAssetUtils: + def test_upload_directory_propagates_errors_without_progress(self, tmp_path: Path) -> None: + class BlobStorageClient: + def check_blob_exists(self): + pass + + source = tmp_path / "source" + source.mkdir() + (source / "file.txt").write_text("content") + + with patch("azure.ai.ml._utils._asset_utils.upload_file", side_effect=RuntimeError("upload failed")): + with pytest.raises(RuntimeError, match="upload failed"): + upload_directory(BlobStorageClient(), source, "destination", "Uploading", False, IgnoreFile(None)) + def test_amlignore_precedence( self, storage_test_directory: str, gitignore_file_directory: str, no_ignore_file_directory: str ) -> None: