Skip to content

Commit 493c993

Browse files
authored
Optionally use max parallelism value from the client settings API (#5132)
Optionally use our existing client settings API to set the default if it is not overridden on a pipeline level. If the client setting is not available or set, continue using the 192 default.
1 parent f5f74fe commit 493c993

File tree

7 files changed

+72
-63
lines changed

7 files changed

+72
-63
lines changed

src/Agent.Plugins/Artifact/FileContainerProvider.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ private async Task DownloadFileContainerAsync(IEnumerable<FileContainerItem> ite
170170
(dedupClient, clientTelemetry) = DedupManifestArtifactClientFactory.Instance.CreateDedupClient(
171171
this.connection,
172172
domainId,
173-
DedupManifestArtifactClientFactory.Instance.GetDedupStoreClientMaxParallelism(context),
173+
DedupManifestArtifactClientFactory.Instance.GetDedupStoreClientMaxParallelism(context, clientSettings),
174174
clientSettings.GetRedirectTimeout(),
175175
false,
176176
(str) => this.tracer.Info(str),

src/Agent.Plugins/Artifact/PipelineArtifactServer.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@ internal async Task UploadAsync(
6060
context.IsSystemDebugTrue(),
6161
(str) => context.Output(str),
6262
connection,
63-
DedupManifestArtifactClientFactory.Instance.GetDedupStoreClientMaxParallelism(context),
6463
domainId,
6564
clientSettings,
6665
context,

src/Agent.Worker/Build/FileContainerServer.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,12 @@ private async Task<UploadResult> BlobUploadAsync(IAsyncCommandContext context, I
364364
Microsoft.VisualStudio.Services.BlobStore.WebApi.Contracts.Client.BuildArtifact,
365365
DedupManifestArtifactClientFactory.CreateArtifactsTracer(verbose, tracer),
366366
token);
367-
367+
int maxParallelism = context.GetHostContext().GetService<IConfigurationStore>().GetSettings().MaxDedupParallelism;
368+
if (maxParallelism == 0)
369+
{
370+
// if we have a client setting for max parallelism, use that:
371+
maxParallelism = DedupManifestArtifactClientFactory.Instance.GetDedupStoreClientMaxParallelism(clientSettings, msg => context.Output(msg));
372+
}
368373
// Check if the pipeline has an override domain set, if not, use the default domain from the client settings.
369374
string overrideDomain = AgentKnobs.SendBuildArtifactsToBlobstoreDomain.GetValue(context).AsString();
370375
IDomainId domainId = String.IsNullOrWhiteSpace(overrideDomain) ? clientSettings.GetDefaultDomainId() : DomainIdFactory.Create(overrideDomain);
@@ -373,7 +378,7 @@ private async Task<UploadResult> BlobUploadAsync(IAsyncCommandContext context, I
373378
.CreateDedupClient(
374379
_connection,
375380
domainId,
376-
context.GetHostContext().GetService<IConfigurationStore>().GetSettings().MaxDedupParallelism,
381+
maxParallelism,
377382
clientSettings.GetRedirectTimeout(),
378383
verbose,
379384
tracer,

src/Microsoft.VisualStudio.Services.Agent/Blob/BlobstoreClientSettings.cs

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,26 @@
22
// Licensed under the MIT License.
33

44
using System;
5+
using System.Collections.Generic;
56
using System.Threading;
67
using System.Threading.Tasks;
7-
using Microsoft.VisualStudio.Services.BlobStore.WebApi;
8-
using Microsoft.VisualStudio.Services.Content.Common.Tracing;
9-
using Microsoft.VisualStudio.Services.WebApi;
10-
using Microsoft.VisualStudio.Services.Content.Common;
118
using Agent.Sdk;
12-
using Microsoft.VisualStudio.Services.BlobStore.Common;
9+
using Agent.Sdk.Knob;
1310
using BuildXL.Cache.ContentStore.Hashing;
11+
using Microsoft.VisualStudio.Services.BlobStore.Common;
12+
using Microsoft.VisualStudio.Services.BlobStore.WebApi;
1413
using Microsoft.VisualStudio.Services.BlobStore.WebApi.Contracts;
15-
using Agent.Sdk.Knob;
16-
using System.Collections.Generic;
14+
using Microsoft.VisualStudio.Services.Content.Common;
15+
using Microsoft.VisualStudio.Services.Content.Common.Tracing;
16+
using Microsoft.VisualStudio.Services.WebApi;
1717

1818
namespace Microsoft.VisualStudio.Services.Agent.Blob
1919
{
2020
public class BlobstoreClientSettings
2121
{
2222
private readonly ClientSettingsInfo clientSettings;
2323
private readonly IAppTraceSource tracer;
24-
24+
2525
private BlobstoreClientSettings(ClientSettingsInfo settings, IAppTraceSource tracer)
2626
{
2727
clientSettings = settings;
@@ -37,8 +37,8 @@ public static async Task<BlobstoreClientSettings> GetClientSettingsAsync(
3737
BlobStore.WebApi.Contracts.Client? client,
3838
IAppTraceSource tracer,
3939
CancellationToken cancellationToken)
40-
{
41-
if(client.HasValue)
40+
{
41+
if (client.HasValue)
4242
{
4343
try
4444
{
@@ -75,8 +75,8 @@ public IDomainId GetDefaultDomainId()
7575
{
7676
tracer.Info($"Error converting the domain id '{clientSettings.Properties[ClientSettingsConstants.DefaultDomainId]}': {exception.Message}. Falling back to default.");
7777
}
78-
}
79-
else
78+
}
79+
else
8080
{
8181
tracer.Verbose($"No client settings found, using the default domain id '{domainId}'.");
8282
}
@@ -117,5 +117,18 @@ public HashType GetClientHashType(AgentTaskPluginExecutionContext context)
117117
return null;
118118
}
119119
}
120+
121+
public int? GetMaxParallelism()
122+
{
123+
const string MaxParallelism = "MaxParallelism";
124+
if (int.TryParse(clientSettings?.Properties.GetValueOrDefault(MaxParallelism), out int maxParallelism))
125+
{
126+
return maxParallelism;
127+
}
128+
else
129+
{
130+
return null;
131+
}
132+
}
120133
}
121134
}

src/Microsoft.VisualStudio.Services.Agent/Blob/DedupManifestArtifactClientFactory.cs

Lines changed: 27 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,15 @@
44
using System;
55
using System.Threading;
66
using System.Threading.Tasks;
7-
using Microsoft.VisualStudio.Services.BlobStore.WebApi;
8-
using Microsoft.VisualStudio.Services.Content.Common.Tracing;
9-
using Microsoft.VisualStudio.Services.WebApi;
10-
using Microsoft.VisualStudio.Services.Content.Common;
11-
using Microsoft.VisualStudio.Services.BlobStore.Common.Telemetry;
127
using Agent.Sdk;
8+
using BuildXL.Cache.ContentStore.Hashing;
139
using Microsoft.TeamFoundation.DistributedTask.WebApi;
1410
using Microsoft.VisualStudio.Services.BlobStore.Common;
15-
using BuildXL.Cache.ContentStore.Hashing;
16-
using Microsoft.VisualStudio.Services.BlobStore.WebApi.Contracts;
17-
using Agent.Sdk.Knob;
18-
using System.Collections.Generic;
11+
using Microsoft.VisualStudio.Services.BlobStore.Common.Telemetry;
12+
using Microsoft.VisualStudio.Services.BlobStore.WebApi;
13+
using Microsoft.VisualStudio.Services.Content.Common;
14+
using Microsoft.VisualStudio.Services.Content.Common.Tracing;
15+
using Microsoft.VisualStudio.Services.WebApi;
1916

2017
namespace Microsoft.VisualStudio.Services.Agent.Blob
2118
{
@@ -36,7 +33,6 @@ public interface IDedupManifestArtifactClientFactory
3633
bool verbose,
3734
Action<string> traceOutput,
3835
VssConnection connection,
39-
int maxParallelism,
4036
IDomainId domainId,
4137
BlobstoreClientSettings clientSettings,
4238
AgentTaskPluginExecutionContext context,
@@ -74,13 +70,6 @@ public interface IDedupManifestArtifactClientFactory
7470
bool verbose,
7571
Action<string> traceOutput,
7672
CancellationToken cancellationToken);
77-
78-
/// <summary>
79-
/// Gets the maximum parallelism to use for dedup related downloads and uploads.
80-
/// </summary>
81-
/// <param name="context">Context which may specify overrides for max parallelism</param>
82-
/// <returns>max parallelism</returns>
83-
int GetDedupStoreClientMaxParallelism(AgentTaskPluginExecutionContext context);
8473
}
8574

8675
public class DedupManifestArtifactClientFactory : IDedupManifestArtifactClientFactory
@@ -118,7 +107,6 @@ private DedupManifestArtifactClientFactory()
118107
context.IsSystemDebugTrue(),
119108
(str) => context.Output(str),
120109
connection,
121-
DedupManifestArtifactClientFactory.Instance.GetDedupStoreClientMaxParallelism(context),
122110
domainId,
123111
clientSettings,
124112
context,
@@ -129,26 +117,22 @@ private DedupManifestArtifactClientFactory()
129117
bool verbose,
130118
Action<string> traceOutput,
131119
VssConnection connection,
132-
int maxParallelism,
133120
IDomainId domainId,
134121
BlobstoreClientSettings clientSettings,
135122
AgentTaskPluginExecutionContext context,
136123
CancellationToken cancellationToken)
137124
{
138125
const int maxRetries = 5;
139126
var tracer = CreateArtifactsTracer(verbose, traceOutput);
140-
if (maxParallelism == 0)
141-
{
142-
maxParallelism = DefaultDedupStoreClientMaxParallelism;
143-
}
127+
int maxParallelism = DedupManifestArtifactClientFactory.Instance.GetDedupStoreClientMaxParallelism(context, clientSettings);
144128

145129
traceOutput($"Max dedup parallelism: {maxParallelism}");
146130
traceOutput($"DomainId: {domainId}");
147131

148132
IDedupStoreHttpClient dedupStoreHttpClient = GetDedupStoreHttpClient(connection, domainId, maxRetries, tracer, cancellationToken);
149133

150134
var telemetry = new BlobStoreClientTelemetry(tracer, dedupStoreHttpClient.BaseAddress);
151-
HashType hashType= clientSettings.GetClientHashType(context);
135+
HashType hashType = clientSettings.GetClientHashType(context);
152136

153137
if (hashType == BuildXL.Cache.ContentStore.Hashing.HashType.Dedup1024K)
154138
{
@@ -222,32 +206,37 @@ private static IDedupStoreHttpClient GetDedupStoreHttpClient(VssConnection conne
222206
return (client, telemetry);
223207
}
224208

225-
public int GetDedupStoreClientMaxParallelism(AgentTaskPluginExecutionContext context)
209+
public int GetDedupStoreClientMaxParallelism(AgentTaskPluginExecutionContext context, BlobstoreClientSettings clientSettings)
226210
{
227211
ConfigureEnvironmentVariables(context);
228212

229-
int parallelism = DefaultDedupStoreClientMaxParallelism;
230-
231-
if (context.Variables.TryGetValue("AZURE_PIPELINES_DEDUP_PARALLELISM", out VariableValue v))
213+
// prefer the pipeline variable over the client settings
214+
if (context.Variables.TryGetValue(DedupParallelism, out VariableValue v))
232215
{
233-
if (!int.TryParse(v.Value, out parallelism))
234-
{
235-
context.Output($"Could not parse the value of AZURE_PIPELINES_DEDUP_PARALLELISM, '{v.Value}', as an integer. Defaulting to {DefaultDedupStoreClientMaxParallelism}");
236-
parallelism = DefaultDedupStoreClientMaxParallelism;
237-
}
238-
else
216+
if (int.TryParse(v.Value, out int parallelism))
239217
{
240218
context.Output($"Overriding default max parallelism with {parallelism}");
219+
return parallelism;
241220
}
242221
}
243-
else
222+
return GetDedupStoreClientMaxParallelism(clientSettings, msg => context.Output(msg));
223+
}
224+
225+
public int GetDedupStoreClientMaxParallelism(BlobstoreClientSettings clientSettings, Action<string> logOutput)
226+
{
227+
// if we have a client setting for max parallelism, use that:
228+
int? maxParallelism = clientSettings?.GetMaxParallelism();
229+
if (maxParallelism.HasValue)
244230
{
245-
context.Output($"Using default max parallelism.");
231+
logOutput($"Using max parallelism from client settings: {maxParallelism}");
232+
return maxParallelism.Value;
246233
}
247-
248-
return parallelism;
234+
// if we get here, nothing left to do but use the default:
235+
logOutput($"Using default max parallelism.");
236+
return DefaultDedupStoreClientMaxParallelism;
249237
}
250238

239+
public static string DedupParallelism = "AZURE_PIPELINES_DEDUP_PARALLELISM";
251240
private static readonly string[] EnvironmentVariables = new[] { "VSO_DEDUP_REDIRECT_TIMEOUT_IN_SEC" };
252241

253242
private static void ConfigureEnvironmentVariables(AgentTaskPluginExecutionContext context)
@@ -269,7 +258,6 @@ private static void ConfigureEnvironmentVariables(AgentTaskPluginExecutionContex
269258
}
270259
}
271260

272-
273261
public static IAppTraceSource CreateArtifactsTracer(bool verbose, Action<string> traceOutput)
274262
{
275263
return new CallbackAppTraceSource(

src/Microsoft.VisualStudio.Services.Agent/JobServer.cs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,18 @@ public async Task<BlobIdentifierWithBlocks> UploadLogToBlobStore(Stream blob, st
172172

173173
public async Task<(DedupIdentifier dedupId, ulong length)> UploadAttachmentToBlobStore(bool verbose, string itemPath, Guid planId, Guid jobId, CancellationToken cancellationToken)
174174
{
175-
int maxParallelism = HostContext.GetService<IConfigurationStore>().GetSettings().MaxDedupParallelism;
176175
var clientSettings = await BlobstoreClientSettings.GetClientSettingsAsync(
177-
_connection,
178-
client: null,
176+
_connection,
177+
client: null,
179178
DedupManifestArtifactClientFactory.CreateArtifactsTracer(verbose, (str) => Trace.Info(str)), cancellationToken);
179+
180+
int maxParallelism = HostContext.GetService<IConfigurationStore>().GetSettings().MaxDedupParallelism;
181+
if (maxParallelism == 0)
182+
{
183+
// if we have a client setting for max parallelism, use that - this won't log anything:
184+
maxParallelism = DedupManifestArtifactClientFactory.Instance.GetDedupStoreClientMaxParallelism(clientSettings, msg => { });
185+
}
186+
180187
var (dedupClient, clientTelemetry) = DedupManifestArtifactClientFactory.Instance
181188
.CreateDedupClient(
182189
_connection,

src/Test/L0/Plugin/TestFileShareProvider/MockDedupManifestArtifactClientFactory.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,11 @@
66
using System.Threading.Tasks;
77
using Agent.Sdk;
88
using Microsoft.VisualStudio.Services.Agent.Blob;
9+
using Microsoft.VisualStudio.Services.BlobStore.Common;
10+
using Microsoft.VisualStudio.Services.BlobStore.Common.Telemetry;
911
using Microsoft.VisualStudio.Services.BlobStore.WebApi;
10-
using Microsoft.VisualStudio.Services.BlobStore.WebApi.Contracts;
1112
using Microsoft.VisualStudio.Services.Content.Common.Tracing;
1213
using Microsoft.VisualStudio.Services.WebApi;
13-
using Microsoft.VisualStudio.Services.BlobStore.Common.Telemetry;
14-
using Agent.Plugins.PipelineArtifact;
15-
using Microsoft.VisualStudio.Services.BlobStore.Common;
1614

1715
namespace Microsoft.VisualStudio.Services.Agent.Tests
1816
{
@@ -40,7 +38,6 @@ public class MockDedupManifestArtifactClientFactory : IDedupManifestArtifactClie
4038
bool verbose,
4139
Action<string> traceOutput,
4240
VssConnection connection,
43-
int maxParallelism,
4441
IDomainId domainId,
4542
BlobstoreClientSettings clientSettings,
4643
AgentTaskPluginExecutionContext context,

0 commit comments

Comments
 (0)