From 8e164499603af3071f61f1bc2affb3266a045ef4 Mon Sep 17 00:00:00 2001 From: Alexey Skalozub Date: Sun, 11 Jun 2017 17:38:20 +0300 Subject: [PATCH] Do not call state filter if job was not in Processing state --- .../States/ConsoleApplyStateFilter.cs | 6 ++++++ .../States/ConsoleApplyStateFilterFacts.cs | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/Hangfire.Console/States/ConsoleApplyStateFilter.cs b/src/Hangfire.Console/States/ConsoleApplyStateFilter.cs index 40f4549..35b640a 100644 --- a/src/Hangfire.Console/States/ConsoleApplyStateFilter.cs +++ b/src/Hangfire.Console/States/ConsoleApplyStateFilter.cs @@ -29,6 +29,12 @@ public void OnStateApplied(ApplyStateContext context, IWriteOnlyTransaction tran return; } + if (context.OldStateName != ProcessingState.StateName) + { + // Job was not in 'Processing' state, ignore. + return; + } + var jobDetails = context.Storage.GetMonitoringApi().JobDetails(context.BackgroundJob.Id); if (jobDetails == null || jobDetails.History == null) { diff --git a/tests/Hangfire.Console.Tests/States/ConsoleApplyStateFilterFacts.cs b/tests/Hangfire.Console.Tests/States/ConsoleApplyStateFilterFacts.cs index 16c0c8c..f0a8c3f 100644 --- a/tests/Hangfire.Console.Tests/States/ConsoleApplyStateFilterFacts.cs +++ b/tests/Hangfire.Console.Tests/States/ConsoleApplyStateFilterFacts.cs @@ -69,6 +69,25 @@ public void DoesNotExpire_IfNotFollowsJobRetention() stateChanger.ChangeState(context); + _monitoring.Verify(x => x.JobDetails(It.IsAny()), Times.Never); + _transaction.Verify(x => x.ExpireSet(It.IsAny(), It.IsAny()), Times.Never); + _transaction.Verify(x => x.ExpireHash(It.IsAny(), It.IsAny()), Times.Never); + } + + [Fact] + public void DoesNotExpire_IfOldStateWasNotProcessing() + { + _connection.Setup(x => x.GetJobData("1")) + .Returns(CreateJobData(EnqueuedState.StateName)); + _monitoring.Setup(x => x.JobDetails("1")) + .Returns(CreateJobDetails()); + + var stateChanger = new BackgroundJobStateChanger(CreateJobFilterProvider()); + var context = CreateStateChangeContext(new MockSucceededState()); + + stateChanger.ChangeState(context); + + _monitoring.Verify(x => x.JobDetails(It.IsAny()), Times.Never); _transaction.Verify(x => x.ExpireSet(It.IsAny(), It.IsAny()), Times.Never); _transaction.Verify(x => x.ExpireHash(It.IsAny(), It.IsAny()), Times.Never); }