From 041cd1eea183f7bb888d5a89e5691c59bad63161 Mon Sep 17 00:00:00 2001 From: Hans Mulder Date: Mon, 20 Jan 2020 13:06:55 +0100 Subject: [PATCH] Fixed: delete flowstate when Exception occurs --- Tapeti.Flow/Default/FlowContext.cs | 7 ++++++- Tapeti.Flow/Default/FlowContinuationMiddleware.cs | 4 +++- 2 files changed, 9 insertions(+), 2 deletions(-) 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();