Skip to content

Commit 79ec255

Browse files
authored
Avoid logging warnings when cancellation is requested (#114)
1 parent 59da55d commit 79ec255

File tree

4 files changed

+81
-41
lines changed

4 files changed

+81
-41
lines changed

src/Common/Caching/CacheClient.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -453,7 +453,7 @@ async Task CopyPackageContentToDestinationAsync(string sourceAbsolutePath, strin
453453
{
454454
Tracer.Warning(context, $"Package content `{sourceAbsolutePath}` was not copied to `{destinationAbsolutePath}` because package content `{firstSourceAbsolutePath}` already was.");
455455
}
456-
};
456+
}
457457

458458
async Task PlaceFilesAsync(CancellationToken ct)
459459
{

src/Common/MSBuildCachePluginBase.cs

Lines changed: 77 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ protected FileRealizationMode GetFileRealizationMode(string path)
209209
=> IsDuplicateIdenticalOutputPath(_pluginLogger!, path) ? FileRealizationMode.CopyNoVerify : FileRealizationMode.Any;
210210

211211
public override Task BeginBuildAsync(CacheContext context, PluginLoggerBase logger, CancellationToken cancellationToken)
212-
=> TimeAndLogAsync(logger, () => BeginBuildInnerAsync(context, logger, cancellationToken));
212+
=> TimeAndLogAsync(logger, () => BeginBuildInnerAsync(context, logger, cancellationToken), cancellationToken);
213213

214214
private async Task BeginBuildInnerAsync(CacheContext context, PluginLoggerBase logger, CancellationToken cancellationToken)
215215
{
@@ -341,7 +341,7 @@ private async Task BeginBuildInnerAsync(CacheContext context, PluginLoggerBase l
341341
}
342342

343343
public override Task EndBuildAsync(PluginLoggerBase logger, CancellationToken cancellationToken)
344-
=> TimeAndLogAsync(logger, () => EndBuildInnerAsync(logger, cancellationToken));
344+
=> TimeAndLogAsync(logger, () => EndBuildInnerAsync(logger, cancellationToken), cancellationToken);
345345

346346
private async Task EndBuildInnerAsync(PluginLoggerBase logger, CancellationToken cancellationToken)
347347
{
@@ -358,10 +358,11 @@ private async Task EndBuildInnerAsync(PluginLoggerBase logger, CancellationToken
358358
}
359359

360360
public override Task<CacheResult> GetCacheResultAsync(BuildRequestData buildRequest, PluginLoggerBase logger, CancellationToken cancellationToken)
361-
=> TimeAndLogAsync(
362-
logger,
363-
() => GetCacheResultInnerAsync(buildRequest, logger, cancellationToken),
364-
context: buildRequest.ProjectFullPath);
361+
=> TimeAndLogAsync(
362+
logger,
363+
() => GetCacheResultInnerAsync(buildRequest, logger, cancellationToken),
364+
cancellationToken,
365+
context: buildRequest.ProjectFullPath);
365366

366367
private async Task<CacheResult> GetCacheResultInnerAsync(BuildRequestData buildRequest, PluginLoggerBase logger, CancellationToken cancellationToken)
367368
{
@@ -466,49 +467,50 @@ private async Task<CacheResult> GetCacheResultSingleAsync(NodeContext nodeContex
466467
}
467468

468469
public override void HandleFileAccess(FileAccessContext fileAccessContext, FileAccessData fileAccessData)
469-
=> TimeAndLog(_pluginLogger, () => HandleFileAccessInner(fileAccessContext, fileAccessData));
470+
{
471+
if (Initialized)
472+
{
473+
TimeAndLog(_pluginLogger, () => HandleFileAccessInner(fileAccessContext, fileAccessData));
474+
}
475+
}
470476

471477
private void HandleFileAccessInner(FileAccessContext fileAccessContext, FileAccessData fileAccessData)
472478
{
473479
_hasHadFileAccessReport = true;
474480

475-
if (!Initialized)
476-
{
477-
return;
478-
}
479-
480481
NodeContext? nodeContext = GetNodeContext(fileAccessContext);
481482
if (nodeContext == null)
482483
{
483484
return;
484485
}
485486

486-
_fileAccessRepository.AddFileAccess(nodeContext, fileAccessData);
487+
_fileAccessRepository!.AddFileAccess(nodeContext, fileAccessData);
487488
}
488489

489490
public override void HandleProcess(FileAccessContext fileAccessContext, ProcessData processData)
490-
=> TimeAndLog(_pluginLogger, () => HandleProcessInner(fileAccessContext, processData));
491-
492-
private void HandleProcessInner(FileAccessContext fileAccessContext, ProcessData processData)
493491
{
494-
if (!Initialized)
492+
if (Initialized)
495493
{
496-
return;
494+
TimeAndLog(_pluginLogger, () => HandleProcessInner(fileAccessContext, processData));
497495
}
496+
}
498497

498+
private void HandleProcessInner(FileAccessContext fileAccessContext, ProcessData processData)
499+
{
499500
NodeContext? nodeContext = GetNodeContext(fileAccessContext);
500501
if (nodeContext == null)
501502
{
502503
return;
503504
}
504505

505-
_fileAccessRepository.AddProcess(nodeContext, processData);
506+
_fileAccessRepository!.AddProcess(nodeContext, processData);
506507
}
507508

508509
public override Task HandleProjectFinishedAsync(FileAccessContext fileAccessContext, BuildResult buildResult, PluginLoggerBase logger, CancellationToken cancellationToken)
509510
=> TimeAndLogAsync(
510511
logger,
511512
() => HandleProjectFinishedInnerAsync(fileAccessContext, buildResult, logger, cancellationToken),
513+
cancellationToken,
512514
context: fileAccessContext.ProjectFullPath);
513515

514516
private async Task HandleProjectFinishedInnerAsync(FileAccessContext fileAccessContext, BuildResult buildResult, PluginLoggerBase logger, CancellationToken cancellationToken)
@@ -1195,47 +1197,84 @@ private void CheckForDuplicateOutputs(PluginLoggerBase logger, IReadOnlyDictiona
11951197
}
11961198
}
11971199

1198-
private static async Task<T> TimeAndLogAsync<T>(PluginLoggerBase? logger, Func<Task<T>> innerAsync, string? context = null, [CallerMemberName] string memberName = "")
1200+
private static async Task<T> TimeAndLogAsync<T>(
1201+
PluginLoggerBase logger,
1202+
Func<Task<T>> innerAsync,
1203+
CancellationToken cancellationToken,
1204+
string? context = null,
1205+
[CallerMemberName] string memberName = "")
11991206
{
12001207
var timer = Stopwatch.StartNew();
12011208
try
12021209
{
1203-
return await innerAsync();
1210+
T result = await innerAsync();
1211+
1212+
// only log 1+ second operations to avoid debug spew
1213+
if (timer.ElapsedMilliseconds > 1000L)
1214+
{
1215+
if (context == null)
1216+
{
1217+
logger.LogMessage($"{memberName} succeeded after {timer.ElapsedMilliseconds} ms.");
1218+
}
1219+
else
1220+
{
1221+
logger.LogMessage($"{memberName}({context}) succeeded after {timer.ElapsedMilliseconds} ms.");
1222+
}
1223+
}
1224+
1225+
return result;
1226+
}
1227+
catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested)
1228+
{
1229+
if (context == null)
1230+
{
1231+
logger.LogMessage($"{memberName} cancelled after {timer.ElapsedMilliseconds} ms");
1232+
}
1233+
else
1234+
{
1235+
logger.LogMessage($"{memberName}({context}) cancelled after {timer.ElapsedMilliseconds} ms");
1236+
}
1237+
throw;
12041238
}
12051239
catch (Exception e)
12061240
{
12071241
if (context == null)
12081242
{
1209-
logger?.LogWarning($"{memberName} failed after {timer.ElapsedMilliseconds} ms: {e}");
1243+
logger.LogWarning($"{memberName} failed after {timer.ElapsedMilliseconds} ms: {e}");
12101244
}
12111245
else
12121246
{
1213-
logger?.LogWarning($"{memberName}({context}) failed after {timer.ElapsedMilliseconds} ms: {e}");
1247+
logger.LogWarning($"{memberName}({context}) failed after {timer.ElapsedMilliseconds} ms: {e}");
12141248
}
12151249
throw;
12161250
}
1217-
finally
1251+
}
1252+
1253+
private static void TimeAndLog(
1254+
PluginLoggerBase logger,
1255+
Action inner,
1256+
[CallerMemberName] string memberName = "")
1257+
{
1258+
var timer = Stopwatch.StartNew();
1259+
try
12181260
{
1261+
inner();
1262+
12191263
// only log 1+ second operations to avoid debug spew
1220-
if (timer.ElapsedMilliseconds > 1000.0)
1264+
if (timer.ElapsedMilliseconds > 1000L)
12211265
{
1222-
if (context == null)
1223-
{
1224-
logger?.LogMessage($"{memberName} succeeded after {timer.ElapsedMilliseconds} ms.");
1225-
}
1226-
else
1227-
{
1228-
logger?.LogMessage($"{memberName}({context}) succeeded after {timer.ElapsedMilliseconds} ms.");
1229-
}
1266+
logger.LogMessage($"{memberName} succeeded after {timer.ElapsedMilliseconds} ms.");
12301267
}
12311268
}
1269+
catch (Exception e)
1270+
{
1271+
logger.LogWarning($"{memberName} failed after {timer.ElapsedMilliseconds} ms: {e}");
1272+
throw;
1273+
}
12321274
}
12331275

1234-
private static Task<int> TimeAndLogAsync(PluginLoggerBase? logger, Func<Task> innerAsync, string? context = null, [CallerMemberName] string memberName = "")
1235-
=> TimeAndLogAsync(logger, async () => { await innerAsync(); return 0; }, context, memberName);
1236-
1237-
private static void TimeAndLog(PluginLoggerBase? logger, Action inner, string? context = null, [CallerMemberName] string memberName = "")
1238-
=> TimeAndLogAsync(logger, () => { inner(); return Task.CompletedTask; }, context, memberName).GetAwaiter().GetResult();
1276+
private static Task<int> TimeAndLogAsync(PluginLoggerBase logger, Func<Task> innerAsync, CancellationToken cancellationToken, string? context = null, [CallerMemberName] string memberName = "")
1277+
=> TimeAndLogAsync(logger, async () => { await innerAsync(); return 0; }, cancellationToken, context, memberName);
12391278
}
12401279

12411280
public static class ProjectGraphNodeExtensions

src/Common/PluginSettings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ private static SettingParseResult TryParseSettingValue(
390390

391391
return SettingParseResult.Success;
392392
}
393-
};
393+
}
394394
}
395395

396396
settingValue = null;

src/Common/SourceControl/Git.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ static void KillProcess(Process process)
7777

7878
#if NETFRAMEWORK
7979
process.WaitForExit();
80+
cancellationToken.ThrowIfCancellationRequested();
8081
#else
8182
await process.WaitForExitAsync(cancellationToken);
8283
#endif
@@ -92,6 +93,6 @@ static void KillProcess(Process process)
9293

9394
return onExit(process.ExitCode, await resultTask);
9495
}
95-
};
96+
}
9697
}
9798
}

0 commit comments

Comments
 (0)