Skip to content

az artifacts universal download failed due to file system not supporting hard linking #32528

@demoray

Description

@demoray

Describe the bug

When running on a file system that doesn't support hard linking, the download tool fails.

Related command

az artifacts universal download

Errors

the following error is shown:

Encountered an unexpected error.
System.IO.IOException: Hard linking failed!
Status: FailedSinceNotSupportedByFilesystem
Path: ./PATH/TO/FILE
at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupStoreClient.DownloadAndHardlinkTempFile(DedupNode node, String fullPath, Uri proxyUri, EdgeCache edgeCache, CancellationToken cancellationToken)
at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupStoreClient.DownloadToFileAsync(DedupNode node, String fullPath, Uri proxyUri, EdgeCache edgeCache, CancellationToken cancellationToken)
at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupStoreClientWithDataport.DownloadToFileAsync(IDedupDataPort dataport, DedupNode node, String fullPath, Uri proxyUri, EdgeCache edgeCache, CancellationToken cancellationToken)
at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupStoreClientWithDataport.DownloadToFileAsync(IDedupDataPort dataport, DedupIdentifier dedupId, String fullPath, UInt64 fileSize, GetDedupAsyncFunc dedupFetcher, Uri proxyUri, EdgeCache edgeCache, CancellationToken cancellationToken)
at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupManifestArtifactClient.<>c__DisplayClass31_0.<b__5>d.MoveNext()
--- End of stack trace from previous location ---
at Microsoft.VisualStudio.Services.Content.Common.NonSwallowingActionBlock.<>c__DisplayClass5_01.<<CreateNonSwallowingFunc>b__0>d.MoveNext() --- End of stack trace from previous location --- at Microsoft.VisualStudio.Services.Content.Common.TargetBlockExtensions.SendAllAndCompleteAsync[T1,T2](ITargetBlock1 targetBlock, IEnumerable1 inputs, ITargetBlock1 finalBlock, CancellationToken token)
at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupManifestArtifactClient.DownloadAsyncWithManifestPath(DownloadDedupManifestArtifactOptions downloadOptions, IEnumerable1 minimatcherFuncs, Boolean downloadManifestReferences, ISet1 excludedPaths, CancellationToken cancellationToken)
at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupManifestArtifactClient.DownloadSingleManifestAsync(DownloadDedupManifestArtifactOptions downloadOptions, Boolean downloadManifestReferences, ISet1 excludedPaths, CancellationToken cancellationToken) at Microsoft.VisualStudio.Services.BlobStore.WebApi.DedupManifestArtifactClient.DownloadAsync(DownloadDedupManifestArtifactOptions downloadOptions, CancellationToken cancellationToken) at Microsoft.VisualStudio.Services.Packaging.UPackClientShared.UPackSharedClient.DownloadAsync(String projectNameOrId, String feedNameOrId, String packageName, String packageVersion, String targetDirectory, IEnumerable1 minimatchPatterns, CancellationToken cancellationToken)
at ArtifactTool.Commands.UPack.UPackDownloadCommandBase.<>c__DisplayClass2_0.<b__0>d.MoveNext() in D:\a_work\1\s\src\ArtifactTool\Commands\UPack\UPackDownloadCommandBase.cs:line 26
--- End of stack trace from previous location ---
at ArtifactTool.Commands.UPack.UPackExceptionMapper.WithExceptionHandlingAsync(Func1 act) in D:\a\_work\1\s\src\ArtifactTool\Commands\UPack\UPackExceptionMapper.cs:line 39 at ArtifactTool.Commands.UPack.UPackDownloadCommandBase.DownloadPackageAsync(UPackSinglePackageDownloadRequest request) in D:\a\_work\1\s\src\ArtifactTool\Commands\UPack\UPackDownloadCommandBase.cs:line 23 at ArtifactTool.Commands.UPackDownloadCommand.ExecuteAsync() in D:\a\_work\1\s\src\ArtifactTool\Commands\UPack\UPackDownloadCommand.cs:line 41 at ArtifactTool.Commands.CommandBase.OnExecuteAsync() in D:\a\_work\1\s\src\ArtifactTool\Commands\CommandBase.cs:line 105 at McMaster.Extensions.CommandLineUtils.Conventions.ExecuteMethodConvention.InvokeAsync(MethodInfo method, Object instance, Object[] arguments) in C:\projects\commandlineutils\src\CommandLineUtils\Conventions\ExecuteMethodConvention.cs:line 77 at McMaster.Extensions.CommandLineUtils.Conventions.ExecuteMethodConvention.OnExecute(ConventionContext context) in C:\projects\commandlineutils\src\CommandLineUtils\Conventions\ExecuteMethodConvention.cs:line 62 at McMaster.Extensions.CommandLineUtils.Conventions.ExecuteMethodConvention.<>c__DisplayClass0_0.<<Apply>b__0>d.MoveNext() in C:\projects\commandlineutils\src\CommandLineUtils\Conventions\ExecuteMethodConvention.cs:line 25 --- End of stack trace from previous location --- at McMaster.Extensions.CommandLineUtils.CommandLineApplication.<>c__DisplayClass126_0.<OnExecute>b__0() in C:\projects\commandlineutils\src\CommandLineUtils\CommandLineApplication.cs:line 505 at McMaster.Extensions.CommandLineUtils.CommandLineApplication.Execute(String[] args) in C:\projects\commandlineutils\src\CommandLineUtils\CommandLineApplication.cs:line 611 at McMaster.Extensions.CommandLineUtils.CommandLineApplication.Execute[TApp](CommandLineContext context) in C:\projects\commandlineutils\src\CommandLineUtils\CommandLineApplication.Execute.cs:line 57 at McMaster.Extensions.CommandLineUtils.CommandLineApplication.ExecuteAsync[TApp](CommandLineContext context) in C:\projects\commandlineutils\src\CommandLineUtils\CommandLineApplication.Execute.cs:line 145 at McMaster.Extensions.CommandLineUtils.CommandLineApplication.ExecuteAsync[TApp](IConsole console, String[] args) in C:\projects\commandlineutils\src\CommandLineUtils\CommandLineApplication.Execute.cs:line 130 at McMaster.Extensions.CommandLineUtils.CommandLineApplication.ExecuteAsync[TApp](String[] args) in C:\projects\commandlineutils\src\CommandLineUtils\CommandLineApplication.Execute.cs:line 112 at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor) at System.Reflection.MethodBaseInvoker.InvokeDirectByRefWithFewArgs(Object obj, Span1 copyOfArgs, BindingFlags invokeAttr)
Process ['C:\Users\USER\.azure\azuredevops\cli\tools\artifacttool\ArtifactTool_win-x64_0.2.508\artifacttool', 'universal', 'download', '--service', 'https://dev.azure.com/ORG/', '--patvar', 'AZURE_DEVOPS_EXT_ARTIFACTTOOL_PATVAR', '--feed', 'FEED', '--package-name', 'PACKAGE', '--package-version', 'VERSION', '--path', './PATH', '--project', 'PROJECT'] with PID 6112 exited with return code 1

Issue script & Debug output

az_command_data_logger: command args: artifacts universal download --organization={} --project={} --scope={} --feed={} --name={} --version={} --path={} --d
ebug
cli.knack.cli: Event: CommandInvoker.OnPreArgumentLoad [<function register_global_subscription_argument..add_subscription_parameter at 0x03E7E848>]
cli.knack.cli: Event: CommandInvoker.OnPostArgumentLoad []
cli.knack.cli: Event: CommandInvoker.OnPostCommandTableCreate [<function register_ids_argument..add_ids_arguments at 0x03E94AC8>, <function registe
r_cache_arguments..add_cache_arguments at 0x03E94BB8>, <function register_upcoming_breaking_change_info..update_breaking_change_info at 0x0
3E94C08>]
cli.knack.cli: Event: CommandInvoker.OnCommandTableLoaded []
cli.knack.cli: Event: CommandInvoker.OnPreParseArgs []
cli.knack.cli: Event: CommandInvoker.OnPostParseArgs [<function OutputProducer.handle_output_argument at 0x0207B168>, <function CLIQuery.handle_query_param
eter at 0x0209B348>, <function register_ids_argument..parse_ids_arguments at 0x03E94B18>, <function DevCommandsLoader.post_parse_args at 0x03EBBDE8

]
az_command_data_logger: extension name: azure-devops
az_command_data_logger: extension version: 1.0.2

Expected behavior

download to succeed

Environment Summary

azure-cli 2.81.0

core 2.81.0
telemetry 1.1.0

Extensions:
azure-devops 1.0.2

Dependencies:
msal 1.34.0b1
azure-mgmt-resource 23.3.0

Python location 'C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\python.exe'
Config directory 'C:\Users\USER.azure'
Extensions directory 'C:\Users\USER.azure\cliextensions'

Python (Windows) 3.13.9 (tags/v3.13.9:8183fa5, Oct 14 2025, 14:00:05) [MSC v.1944 32 bit (Intel)]

Legal docs and information: aka.ms/AzureCliLegal

Your CLI is up-to-date.

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Artifactsaz artifactsAuto-AssignAuto assign by botService AttentionThis issue is responsible by Azure service team.Similar-IssuebugThis issue requires a change to an existing behavior in the product in order to be resolved.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions