diff --git a/Tapeti.Flow/Default/FlowContext.cs b/Tapeti.Flow/Default/FlowContext.cs index 686e2df..dd955a3 100644 --- a/Tapeti.Flow/Default/FlowContext.cs +++ b/Tapeti.Flow/Default/FlowContext.cs @@ -36,9 +36,14 @@ namespace Tapeti.Flow.Default await FlowStateLock.DeleteFlowState(); } + public bool IsStoredOrDeleted() + { + return storeCalled || deleteCalled; + } + public void EnsureStoreOrDeleteIsCalled() { - if (!storeCalled && !deleteCalled) + if (!IsStoredOrDeleted()) throw new InvalidProgramException("Neither Store nor Delete are called for the state of the current flow. FlowID = " + FlowStateLock?.FlowID); } diff --git a/Tapeti.Flow/Default/FlowContinuationMiddleware.cs b/Tapeti.Flow/Default/FlowContinuationMiddleware.cs index cb6fe78..79a7883 100644 --- a/Tapeti.Flow/Default/FlowContinuationMiddleware.cs +++ b/Tapeti.Flow/Default/FlowContinuationMiddleware.cs @@ -57,7 +57,9 @@ namespace Tapeti.Flow.Default if (flowContext?.FlowStateLock != null) { - if (consumeResult == ConsumeResult.Error) + if (!flowContext.IsStoredOrDeleted()) + // The exception strategy can set the consume result to Success. Instead, check if the yield point + // was handled. The flow provider ensures we only end up here in case of an exception. await flowContext.FlowStateLock.DeleteFlowState(); flowContext.FlowStateLock.Dispose();