Skip to content

Commit e740447

Browse files
author
Bjørn Moe
committed
Add UtcNow to IDateTimeProvider, and use that throughout. Fix some assignments to EventTimeUtc.
Old version with DateTime.Now.ToUniversalTime was less clear and above an order of magnitude slower.
1 parent b4dee83 commit e740447

File tree

12 files changed

+27
-23
lines changed

12 files changed

+27
-23
lines changed

src/WorkflowCore/Interface/IDateTimeProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ namespace WorkflowCore.Interface
55
public interface IDateTimeProvider
66
{
77
DateTime Now { get; }
8+
DateTime UtcNow { get; }
89
}
910
}

src/WorkflowCore/Services/BackgroundTasks/EventConsumer.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ protected override async Task ProcessItem(string itemId, CancellationToken cance
3737
{
3838
cancellationToken.ThrowIfCancellationRequested();
3939
var evt = await _persistenceStore.GetEvent(itemId);
40-
if (evt.EventTime <= _datetimeProvider.Now.ToUniversalTime())
40+
if (evt.EventTime <= _datetimeProvider.UtcNow)
4141
{
4242
var subs = await _persistenceStore.GetSubcriptions(evt.EventName, evt.EventKey, evt.EventTime);
4343
var toQueue = new List<string>();

src/WorkflowCore/Services/BackgroundTasks/WorkflowConsumer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ protected override async Task ProcessItem(string itemId, CancellationToken cance
7171

7272
await persistenceStore.PersistErrors(result.Errors);
7373

74-
var readAheadTicks = _datetimeProvider.Now.Add(Options.PollInterval).ToUniversalTime().Ticks;
74+
var readAheadTicks = _datetimeProvider.UtcNow.Add(Options.PollInterval).Ticks;
7575

7676
if ((workflow.Status == WorkflowStatus.Runnable) && workflow.NextExecution.HasValue && workflow.NextExecution.Value < readAheadTicks)
7777
{
@@ -109,7 +109,7 @@ private async void FutureQueue(WorkflowInstance workflow, CancellationToken canc
109109
return;
110110
}
111111

112-
var target = (workflow.NextExecution.Value - _datetimeProvider.Now.ToUniversalTime().Ticks);
112+
var target = (workflow.NextExecution.Value - _datetimeProvider.UtcNow.Ticks);
113113
if (target > 0)
114114
{
115115
await Task.Delay(TimeSpan.FromTicks(target), cancellationToken);

src/WorkflowCore/Services/DateTimeProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@ namespace WorkflowCore.Services
66
public class DateTimeProvider : IDateTimeProvider
77
{
88
public DateTime Now => DateTime.Now;
9+
public DateTime UtcNow => DateTime.UtcNow;
910
}
1011
}

src/WorkflowCore/Services/ErrorHandlers/CompensateHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public void Handle(WorkflowInstance workflow, WorkflowDefinition def, ExecutionP
6060
}
6161

6262
scopePointer.Active = false;
63-
scopePointer.EndTime = _datetimeProvider.Now.ToUniversalTime();
63+
scopePointer.EndTime = _datetimeProvider.UtcNow;
6464
scopePointer.Status = PointerStatus.Failed;
6565

6666
if (scopeStep.CompensationStepId.HasValue)

src/WorkflowCore/Services/ErrorHandlers/RetryHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public RetryHandler(IDateTimeProvider datetimeProvider, WorkflowOptions options)
2222
public void Handle(WorkflowInstance workflow, WorkflowDefinition def, ExecutionPointer pointer, WorkflowStep step, Exception exception, Queue<ExecutionPointer> bubbleUpQueue)
2323
{
2424
pointer.RetryCount++;
25-
pointer.SleepUntil = _datetimeProvider.Now.ToUniversalTime().Add(step.RetryInterval ?? def.DefaultErrorRetryInterval ?? _options.ErrorRetryInterval);
25+
pointer.SleepUntil = _datetimeProvider.UtcNow.Add(step.RetryInterval ?? def.DefaultErrorRetryInterval ?? _options.ErrorRetryInterval);
2626
step.PrimeForRetry(pointer);
2727
}
2828
}

src/WorkflowCore/Services/ErrorHandlers/SuspendHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public void Handle(WorkflowInstance workflow, WorkflowDefinition def, ExecutionP
2424
workflow.Status = WorkflowStatus.Suspended;
2525
_eventPublisher.PublishNotification(new WorkflowSuspended()
2626
{
27-
EventTimeUtc = _datetimeProvider.Now,
27+
EventTimeUtc = _datetimeProvider.UtcNow,
2828
Reference = workflow.Reference,
2929
WorkflowInstanceId = workflow.Id,
3030
WorkflowDefinitionId = workflow.WorkflowDefinitionId,

src/WorkflowCore/Services/ErrorHandlers/TerminateHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public void Handle(WorkflowInstance workflow, WorkflowDefinition def, ExecutionP
2424
workflow.Status = WorkflowStatus.Terminated;
2525
_eventPublisher.PublishNotification(new WorkflowTerminated()
2626
{
27-
EventTimeUtc = _datetimeProvider.Now,
27+
EventTimeUtc = _datetimeProvider.UtcNow,
2828
Reference = workflow.Reference,
2929
WorkflowInstanceId = workflow.Id,
3030
WorkflowDefinitionId = workflow.WorkflowDefinitionId,

src/WorkflowCore/Services/ExecutionResultProcessor.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public void ProcessExecutionResult(WorkflowInstance workflow, WorkflowDefinition
3333
pointer.Outcome = result.OutcomeValue;
3434
if (result.SleepFor.HasValue)
3535
{
36-
pointer.SleepUntil = _datetimeProvider.Now.ToUniversalTime().Add(result.SleepFor.Value);
36+
pointer.SleepUntil = _datetimeProvider.UtcNow.Add(result.SleepFor.Value);
3737
pointer.Status = PointerStatus.Sleeping;
3838
}
3939

@@ -57,7 +57,7 @@ public void ProcessExecutionResult(WorkflowInstance workflow, WorkflowDefinition
5757
if (result.Proceed)
5858
{
5959
pointer.Active = false;
60-
pointer.EndTime = _datetimeProvider.Now.ToUniversalTime();
60+
pointer.EndTime = _datetimeProvider.UtcNow;
6161
pointer.Status = PointerStatus.Complete;
6262

6363
foreach (var outcomeTarget in step.Outcomes.Where(x => object.Equals(x.GetValue(workflow.Data), result.OutcomeValue) || x.GetValue(workflow.Data) == null))
@@ -67,7 +67,7 @@ public void ProcessExecutionResult(WorkflowInstance workflow, WorkflowDefinition
6767

6868
_eventPublisher.PublishNotification(new StepCompleted()
6969
{
70-
EventTimeUtc = _datetimeProvider.Now,
70+
EventTimeUtc = _datetimeProvider.UtcNow,
7171
Reference = workflow.Reference,
7272
ExecutionPointerId = pointer.Id,
7373
StepId = step.Id,
@@ -92,7 +92,7 @@ public void HandleStepException(WorkflowInstance workflow, WorkflowDefinition de
9292
{
9393
_eventPublisher.PublishNotification(new WorkflowError()
9494
{
95-
EventTimeUtc = _datetimeProvider.Now,
95+
EventTimeUtc = _datetimeProvider.UtcNow,
9696
Reference = workflow.Reference,
9797
WorkflowInstanceId = workflow.Id,
9898
WorkflowDefinitionId = workflow.WorkflowDefinitionId,

src/WorkflowCore/Services/WorkflowExecutor.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public async Task<WorkflowExecutorResult> Execute(WorkflowInstance workflow)
4141
{
4242
var wfResult = new WorkflowExecutorResult();
4343

44-
var exePointers = new List<ExecutionPointer>(workflow.ExecutionPointers.Where(x => x.Active && (!x.SleepUntil.HasValue || x.SleepUntil < _datetimeProvider.Now.ToUniversalTime())));
44+
var exePointers = new List<ExecutionPointer>(workflow.ExecutionPointers.Where(x => x.Active && (!x.SleepUntil.HasValue || x.SleepUntil < _datetimeProvider.UtcNow)));
4545
var def = _registry.GetDefinition(workflow.WorkflowDefinitionId, workflow.Version);
4646
if (def == null)
4747
{
@@ -60,12 +60,12 @@ public async Task<WorkflowExecutorResult> Execute(WorkflowInstance workflow)
6060
if (step == null)
6161
{
6262
_logger.LogError("Unable to find step {0} in workflow definition", pointer.StepId);
63-
pointer.SleepUntil = _datetimeProvider.Now.ToUniversalTime().Add(_options.ErrorRetryInterval);
63+
pointer.SleepUntil = _datetimeProvider.UtcNow.Add(_options.ErrorRetryInterval);
6464
wfResult.Errors.Add(new ExecutionError()
6565
{
6666
WorkflowId = workflow.Id,
6767
ExecutionPointerId = pointer.Id,
68-
ErrorTime = _datetimeProvider.Now.ToUniversalTime(),
68+
ErrorTime = _datetimeProvider.UtcNow,
6969
Message = $"Unable to find step {pointer.StepId} in workflow definition"
7070
});
7171
continue;
@@ -85,7 +85,7 @@ public async Task<WorkflowExecutorResult> Execute(WorkflowInstance workflow)
8585
{
8686
WorkflowId = workflow.Id,
8787
ExecutionPointerId = pointer.Id,
88-
ErrorTime = _datetimeProvider.Now.ToUniversalTime(),
88+
ErrorTime = _datetimeProvider.UtcNow,
8989
Message = ex.Message
9090
});
9191

@@ -108,7 +108,7 @@ private bool InitializeStep(WorkflowInstance workflow, WorkflowStep step, Workfl
108108
return false;
109109
case ExecutionPipelineDirective.EndWorkflow:
110110
workflow.Status = WorkflowStatus.Complete;
111-
workflow.CompleteTime = _datetimeProvider.Now.ToUniversalTime();
111+
workflow.CompleteTime = _datetimeProvider.UtcNow;
112112
return false;
113113
}
114114

@@ -117,7 +117,7 @@ private bool InitializeStep(WorkflowInstance workflow, WorkflowStep step, Workfl
117117
pointer.Status = PointerStatus.Running;
118118
_publisher.PublishNotification(new StepStarted()
119119
{
120-
EventTimeUtc = _datetimeProvider.Now,
120+
EventTimeUtc = _datetimeProvider.UtcNow,
121121
Reference = workflow.Reference,
122122
ExecutionPointerId = pointer.Id,
123123
StepId = step.Id,
@@ -129,7 +129,7 @@ private bool InitializeStep(WorkflowInstance workflow, WorkflowStep step, Workfl
129129

130130
if (!pointer.StartTime.HasValue)
131131
{
132-
pointer.StartTime = _datetimeProvider.Now.ToUniversalTime();
132+
pointer.StartTime = _datetimeProvider.UtcNow;
133133
}
134134

135135
return true;
@@ -146,12 +146,12 @@ private async Task ExecuteStep(WorkflowInstance workflow, WorkflowStep step, Exe
146146
if (body == null)
147147
{
148148
_logger.LogError("Unable to construct step body {0}", step.BodyType.ToString());
149-
pointer.SleepUntil = _datetimeProvider.Now.ToUniversalTime().Add(_options.ErrorRetryInterval);
149+
pointer.SleepUntil = _datetimeProvider.UtcNow.Add(_options.ErrorRetryInterval);
150150
wfResult.Errors.Add(new ExecutionError()
151151
{
152152
WorkflowId = workflow.Id,
153153
ExecutionPointerId = pointer.Id,
154-
ErrorTime = _datetimeProvider.Now.ToUniversalTime(),
154+
ErrorTime = _datetimeProvider.UtcNow,
155155
Message = $"Unable to construct step body {step.BodyType.ToString()}"
156156
});
157157
return;
@@ -175,7 +175,7 @@ private async Task ExecuteStep(WorkflowInstance workflow, WorkflowStep step, Exe
175175
return;
176176
case ExecutionPipelineDirective.EndWorkflow:
177177
workflow.Status = WorkflowStatus.Complete;
178-
workflow.CompleteTime = _datetimeProvider.Now.ToUniversalTime();
178+
workflow.CompleteTime = _datetimeProvider.UtcNow;
179179
return;
180180
}
181181

@@ -245,10 +245,10 @@ private void DetermineNextExecutionTime(WorkflowInstance workflow)
245245
return;
246246

247247
workflow.Status = WorkflowStatus.Complete;
248-
workflow.CompleteTime = _datetimeProvider.Now.ToUniversalTime();
248+
workflow.CompleteTime = _datetimeProvider.UtcNow;
249249
_publisher.PublishNotification(new WorkflowCompleted()
250250
{
251-
EventTimeUtc = _datetimeProvider.Now,
251+
EventTimeUtc = _datetimeProvider.UtcNow,
252252
Reference = workflow.Reference,
253253
WorkflowInstanceId = workflow.Id,
254254
WorkflowDefinitionId = workflow.WorkflowDefinitionId,

0 commit comments

Comments
 (0)