Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ internal static void CompleteCancelledModules(
IModuleResultRegistrar resultRegistrar,
CancellationToken cancellationToken)
{
var cancelledModules = scheduler.CancelPendingModules(cancelModuleResultAwaiters: false);
var cancelledModules = scheduler.CancelPendingModules();
resultRegistrar.RegisterTerminatedResultsForCancelledModules(
cancelledModules,
new OperationCanceledException(cancellationToken));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public void MarkModuleCompleted(Type moduleType, bool success, Exception? except

public ModuleState? GetModuleState(Type moduleType) => null;

public IReadOnlyList<IModule> CancelPendingModules(bool cancelModuleResultAwaiters = true)
public IReadOnlyList<IModule> CancelPendingModules()
{
return [];
}
Expand Down
7 changes: 0 additions & 7 deletions src/ModularPipelines/Engine/GeneratedModuleMetadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -208,8 +208,6 @@ IModuleResult CreateFailure(

ILogger GetOutputLogger(IServiceProvider serviceProvider);

void CancelCompletionSource(IModule module);

void SetCompletionSource(IModule module, IModuleResult result);

Task<IModuleResult> ExecuteAsync(
Expand Down Expand Up @@ -257,11 +255,6 @@ public ILogger GetOutputLogger(IServiceProvider serviceProvider)
return serviceProvider.GetRequiredService<ILogger<TModule>>();
}

public void CancelCompletionSource(IModule module)
{
((Module<TResult>) module).CompletionSource.TrySetCanceled();
}

public void SetCompletionSource(IModule module, IModuleResult result)
{
((Module<TResult>) module).CompletionSource.TrySetResult((ModuleResult<TResult>) result);
Expand Down
12 changes: 5 additions & 7 deletions src/ModularPipelines/Engine/IModuleScheduler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -49,13 +49,11 @@ internal interface IModuleScheduler : IDisposable
ModuleState? GetModuleState(Type moduleType);

/// <summary>
/// Cancels all modules that are queued or pending (not yet executing)
/// This is used when the pipeline is cancelled to ensure TaskCompletionSources are properly completed.
/// Cancels all modules that are queued or pending (not yet executing).
/// AlwaysRun modules are excluded and are allowed to complete.
/// This cancels only the scheduler's internal completion sources. Call
/// <c>RegisterTerminatedResultsForCancelledModules</c> for the returned modules to complete their public result tasks.
/// </summary>
/// <param name="cancelModuleResultAwaiters">
/// Whether to cancel typed module result awaiters immediately. Set to <see langword="false"/>
/// when terminated results will be registered after scheduler cancellation.
/// </param>
/// <returns>The modules transitioned to the completed state by cancellation.</returns>
IReadOnlyList<IModule> CancelPendingModules(bool cancelModuleResultAwaiters = true);
IReadOnlyList<IModule> CancelPendingModules();
Comment thread
thomhurst marked this conversation as resolved.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}
9 changes: 3 additions & 6 deletions src/ModularPipelines/Engine/IModuleStateTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,12 @@ internal interface IModuleStateTracker

/// <summary>
/// Cancels all modules that are queued or pending (not yet executing).
/// This is used when the pipeline is cancelled to ensure TaskCompletionSources are properly completed.
/// This cancels only the scheduler's internal completion sources. Call
/// <c>RegisterTerminatedResultsForCancelledModules</c> for the returned modules to complete their public result tasks.
/// Note: AlwaysRun modules are not cancelled as they should be allowed to complete.
/// </summary>
/// <param name="cancelModuleResultAwaiters">
/// Whether to cancel typed module result awaiters immediately. Set to <see langword="false"/>
/// when terminated results will be registered after scheduler cancellation.
/// </param>
/// <returns>The modules transitioned to the completed state by cancellation.</returns>
IReadOnlyList<IModule> CancelPendingModules(bool cancelModuleResultAwaiters = true);
IReadOnlyList<IModule> CancelPendingModules();

/// <summary>
/// Gets the state for a specific module.
Expand Down
58 changes: 0 additions & 58 deletions src/ModularPipelines/Engine/ModuleCompletionSourceCanceller.cs

This file was deleted.

6 changes: 3 additions & 3 deletions src/ModularPipelines/Engine/ModuleExecutor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ private async Task<IEnumerable<IModule>> ExecuteWithSchedulerAsync(
catch (Exception exception)
{
var cancelledModules =
scheduler.CancelPendingModules(cancelModuleResultAwaiters: false);
scheduler.CancelPendingModules();
_resultRegistrar.RegisterTerminatedResultsForCancelledModules(
cancelledModules,
exception);
Expand Down Expand Up @@ -230,7 +230,7 @@ private async Task<IEnumerable<IModule>> ExecuteWithSchedulerAsync(
private void RegisterCancellationCallback(CancellationTokenSource cancellationTokenSource, IModuleScheduler scheduler)
{
cancellationTokenSource.Token.Register(
() => scheduler.CancelPendingModules(cancelModuleResultAwaiters: false));
() => scheduler.CancelPendingModules());
}

private async Task<Exception?> ExecuteWorkerPoolAsync(
Expand Down Expand Up @@ -277,7 +277,7 @@ await Parallel.ForEachAsync(
if (isFirstFailure)
{
var cancelledModules =
scheduler.CancelPendingModules(cancelModuleResultAwaiters: false);
scheduler.CancelPendingModules();
_resultRegistrar.RegisterTerminatedResultsForCancelledModules(
cancelledModules,
ex);
Expand Down
12 changes: 5 additions & 7 deletions src/ModularPipelines/Engine/ModuleScheduler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -216,21 +216,19 @@ public void MarkModuleCompleted(Type moduleType, bool success, Exception? except
}

/// <summary>
/// Cancels all modules that are queued or pending (not yet executing)
/// This is used when the pipeline is cancelled to ensure TaskCompletionSources are properly completed
/// Cancels all modules that are queued or pending (not yet executing).
/// This cancels only the scheduler's internal completion sources. Call
/// <c>RegisterTerminatedResultsForCancelledModules</c> for the returned modules to complete their public result tasks.
/// Note: AlwaysRun modules are not cancelled as they should be allowed to complete.
/// </summary>
/// <param name="cancelModuleResultAwaiters">
/// Whether to cancel typed module result awaiters immediately.
/// </param>
public IReadOnlyList<IModule> CancelPendingModules(bool cancelModuleResultAwaiters = true)
public IReadOnlyList<IModule> CancelPendingModules()
{
if (IsDisposed)
{
return [];
}

return _stateTracker.CancelPendingModules(cancelModuleResultAwaiters);
return _stateTracker.CancelPendingModules();
}

public void Dispose()
Expand Down
6 changes: 1 addition & 5 deletions src/ModularPipelines/Engine/ModuleStateTracker.cs
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ public void MarkModuleCompleted(Type moduleType, bool success, Exception? except
}

/// <inheritdoc />
public IReadOnlyList<IModule> CancelPendingModules(bool cancelModuleResultAwaiters = true)
public IReadOnlyList<IModule> CancelPendingModules()
{
List<(ModuleState State, ModuleExecutionState OriginalState)> cancelledModules;

Expand Down Expand Up @@ -288,10 +288,6 @@ public IReadOnlyList<IModule> CancelPendingModules(bool cancelModuleResultAwaite
foreach (var (moduleState, _) in cancelledModules)
{
moduleState.CompletionSource.TrySetCanceled();
if (cancelModuleResultAwaiters)
{
ModuleCompletionSourceCanceller.Cancel(moduleState.Module, moduleState.ModuleType);
}
}

// Logging outside lock
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -192,7 +192,7 @@ private static Mock<IModuleScheduler> CreateMockScheduler(params ModuleState[] m
return tcs.Task;
});
scheduler.Setup(s => s.MarkModuleStarted(It.IsAny<Type>())).Returns(true);
scheduler.Setup(s => s.CancelPendingModules(It.IsAny<bool>())).Returns([]);
scheduler.Setup(s => s.CancelPendingModules()).Returns([]);

return scheduler;
}
Expand Down Expand Up @@ -898,7 +898,7 @@ public async Task Cancellation_After_Start_Claim_Completes_Module_Result(
var module = new DistributedModule();
var moduleState = new ModuleState(module, typeof(DistributedModule));
var scheduler = CreateMockScheduler(moduleState);
scheduler.Setup(s => s.CancelPendingModules(false))
scheduler.Setup(s => s.CancelPendingModules())
.Returns([]);
scheduler.Setup(s => s.MarkModuleStarted(typeof(DistributedModule)))
.Returns(() =>
Expand Down Expand Up @@ -954,7 +954,7 @@ public async Task Publish_Failure_Completes_Module_Result(
var module = new DistributedModule();
var moduleState = new ModuleState(module, typeof(DistributedModule));
var scheduler = CreateMockScheduler(moduleState);
scheduler.Setup(s => s.CancelPendingModules(false))
scheduler.Setup(s => s.CancelPendingModules())
.Returns([]);

var publishException = new InvalidOperationException("Broker unavailable");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ public void CompleteCancelledModules_RegistersTerminatedResults()
var scheduler = new Mock<IModuleScheduler>();
var resultRegistrar = new Mock<IModuleResultRegistrar>();
scheduler
.Setup(x => x.CancelPendingModules(false))
.Setup(x => x.CancelPendingModules())
.Returns(cancelledModules);

DistributedModuleExecutor.CompleteCancelledModules(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,21 +99,6 @@ public async Task Cancelled_Result_Registration_Defers_AlwaysRun_Completion()
}
}

[Test]
public async Task Generated_Runtime_Cancels_Typed_Completion_Source()
{
var module = new GeneratedMetadataDependencyModule();

var found = GeneratedModuleMetadata.TryGetRuntime(module.GetType(), out var runtime);
runtime.CancelCompletionSource(module);

using (Assert.Multiple())
{
await Assert.That(found).IsTrue();
await Assert.That(module.CompletionSource.Task.IsCanceled).IsTrue();
}
}

[Test]
public async Task Generated_Runtime_Resolves_Unbuffered_Output_Logger()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public async Task SuccessfulCompletion_DoesNotLogCancellation()

var logOutput = logs.ToString();
await Assert.That(logOutput).DoesNotContain("Cancellation triggered");
scheduler.Verify(x => x.CancelPendingModules(false), Times.Once);
scheduler.Verify(x => x.CancelPendingModules(), Times.Once);
}

[Test]
Expand All @@ -119,7 +119,7 @@ public async Task SchedulerAndAlwaysRunFaults_AreAggregatedAfterRegisteringTermi
scheduler.SetupGet(x => x.ReadyModules).Returns(readyModules.Reader);
scheduler.Setup(x => x.RunSchedulerAsync(It.IsAny<CancellationToken>()))
.Returns(Task.CompletedTask);
scheduler.Setup(x => x.CancelPendingModules(false))
scheduler.Setup(x => x.CancelPendingModules())
.Returns(cancelledModules);
var schedulerFactory = new Mock<IModuleSchedulerFactory>();
schedulerFactory.Setup(x => x.Create()).Returns(scheduler.Object);
Expand Down Expand Up @@ -668,7 +668,7 @@ public async Task CancelPendingModules_WithPendingModule_LogsCancellation()
}

[Test]
public async Task CancelPendingModules_CompletesPendingModuleAwaitable()
public async Task CancelPendingModules_LeavesModuleResultForRegistrarCompletion()
{
var module = new LaterModule();
var state = new ModuleState(module, module.GetType());
Expand All @@ -680,8 +680,8 @@ public async Task CancelPendingModules_CompletesPendingModuleAwaitable()

using (Assert.Multiple())
{
await Assert.That(module.CompletionSource.Task.IsCanceled).IsTrue();
await Assert.That(((IInternalModule) module).ResultTask.IsCompleted).IsTrue();
await Assert.That(state.CompletionSource.Task.IsCanceled).IsTrue();
await Assert.That(((IInternalModule) module).ResultTask.IsCompleted).IsFalse();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -292,7 +292,7 @@ private static async Task<WeakReference> CreateAbandonedSchedulerFaultAsync(Exce
scheduler.SetupGet(x => x.ReadyModules).Returns(readyModules.Reader);
scheduler.Setup(x => x.RunSchedulerAsync(It.IsAny<CancellationToken>()))
.Returns(schedulerTaskSource.Task);
scheduler.Setup(x => x.CancelPendingModules(false)).Returns([]);
scheduler.Setup(x => x.CancelPendingModules()).Returns([]);
var schedulerFactory = new Mock<IModuleSchedulerFactory>();
schedulerFactory.Setup(x => x.Create()).Returns(scheduler.Object);
var alwaysRunHandler = new Mock<IAlwaysRunHandler>();
Expand Down
Loading