• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

lucaslorentz / durabletask-extensions / 5805868292

pending completion
5805868292

push

github

lucaslorentz
Search by completed time

12 of 12 new or added lines in 5 files covered. (100.0%)

2311 of 2794 relevant lines covered (82.71%)

145.34 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

19.64
/src/LLL.DurableTask.EFCore/Extensions/HistoryEventExtensions.cs
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using DurableTask.Core;
5
using DurableTask.Core.History;
6
using DurableTask.Core.Serializing;
7

8
namespace LLL.DurableTask.EFCore.Extensions
9
{
10
    public static class HistoryEventExtensions
11
    {
12
        public static int? GetTriggerEventId(this HistoryEvent historyEvent)
13
        {
14
            switch (historyEvent)
15
            {
16
                case TaskCompletedEvent taskCompletedEvent:
17
                    return taskCompletedEvent.TaskScheduledId;
×
18
                case TaskFailedEvent taskFailedEvent:
19
                    return taskFailedEvent.TaskScheduledId;
×
20
                case TimerFiredEvent timerFiredEvent:
21
                    return timerFiredEvent.TimerId;
×
22
                case SubOrchestrationInstanceCompletedEvent subOrchestrationCreated:
23
                    return subOrchestrationCreated.TaskScheduledId;
×
24
                case SubOrchestrationInstanceFailedEvent subOrchestrationFailed:
25
                    return subOrchestrationFailed.TaskScheduledId;
×
26
            }
27
            return null;
×
28
        }
29

30
        public static IList<HistoryEvent> Reopen(this IList<HistoryEvent> historyEvents, DataConverter dataConverter)
31
        {
32
            return historyEvents
139✔
33
                .Select(e => e is ExecutionCompletedEvent completedEvent
163✔
34
                    && completedEvent.OrchestrationStatus == OrchestrationStatus.Completed
163✔
35
                    ? e.Rewind(dataConverter) : e)
163✔
36
                .ToArray();
139✔
37
        }
38

39
        public static RewindResult Rewind(this IList<HistoryEvent> historyEvents, HistoryEvent rewindPoint, string reason, DataConverter dataConverter)
40
        {
41
            var runtimeState = new OrchestrationRuntimeState(historyEvents);
×
42

43
            var eventsToKeep = historyEvents.TakeWhile(e => e != rewindPoint).ToArray();
×
44
            var eventsToRewind = historyEvents.SkipWhile(e => e != rewindPoint).ToArray();
×
45

46
            var result = new RewindResult();
×
47

48
            foreach (var eventToKeep in eventsToKeep)
×
49
            {
50
                result.HistoryEvents.Add(eventToKeep);
×
51

52
                var completionEventToRewind = eventsToRewind.FirstOrDefault(h => h.GetTriggerEventId() == eventToKeep.EventId);
×
53
                if (completionEventToRewind == null)
×
54
                    continue;
55

56
                switch (eventToKeep)
57
                {
58
                    case TaskScheduledEvent taskScheduledEvent:
59
                        {
60
                            result.OutboundMessages.Add(new TaskMessage
×
61
                            {
×
62
                                OrchestrationInstance = runtimeState.OrchestrationInstance,
×
63
                                Event = taskScheduledEvent,
×
64
                            });
×
65
                            break;
×
66
                        }
67
                    case TimerCreatedEvent timerCreatedEvent:
68
                        {
69
                            result.TimerMessages.Add(new TaskMessage
×
70
                            {
×
71
                                OrchestrationInstance = runtimeState.OrchestrationInstance,
×
72
                                Event = completionEventToRewind
×
73
                            });
×
74
                            break;
×
75
                        }
76
                    case SubOrchestrationInstanceCreatedEvent subOrchestrationCreatedEvent:
77
                        {
78
                            result.SubOrchestrationsInstancesToRewind.Add(subOrchestrationCreatedEvent.InstanceId);
×
79
                            break;
80
                        }
81
                }
82
            }
83

84
            foreach (var eventToRewind in eventsToRewind)
×
85
            {
86
                if (eventToRewind is OrchestratorStartedEvent || eventToRewind is OrchestratorCompletedEvent)
×
87
                {
88
                    result.HistoryEvents.Add(eventToRewind);
×
89
                }
90
                else
91
                {
92
                    var rewoundEvent = eventToRewind.Rewind(dataConverter);
×
93
                    result.HistoryEvents.Add(rewoundEvent);
×
94
                }
95
            }
96

97
            result.OrchestratorMessages.Add(new TaskMessage
×
98
            {
×
99
                OrchestrationInstance = runtimeState.OrchestrationInstance,
×
100
                Event = new GenericEvent(-1, $"Rewind reason: {reason}")
×
101
            });
×
102

103
            result.NewRuntimeState = new OrchestrationRuntimeState(result.HistoryEvents);
×
104

105
            return result;
×
106
        }
107

108
        public static HistoryEvent Rewind(this HistoryEvent eventToRewind, DataConverter dataConverter)
109
        {
110
            var rewoundData = dataConverter.Serialize(eventToRewind);
6✔
111
            var genericEvent = new GenericEvent(eventToRewind.EventId, $"Rewound: {rewoundData}")
6✔
112
            {
6✔
113
                Timestamp = eventToRewind.Timestamp
6✔
114
            };
6✔
115
            return genericEvent;
6✔
116
        }
117
    }
118

119
    public class RewindResult
120
    {
121
        public List<TaskMessage> OutboundMessages { get; } = new List<TaskMessage>();
×
122
        public List<TaskMessage> TimerMessages { get; } = new List<TaskMessage>();
×
123
        public List<TaskMessage> OrchestratorMessages { get; } = new List<TaskMessage>();
×
124
        public List<string> SubOrchestrationsInstancesToRewind { get; } = new List<string>();
×
125
        public List<HistoryEvent> HistoryEvents { get; } = new List<HistoryEvent>();
×
126
        public OrchestrationRuntimeState NewRuntimeState { get; set; }
×
127
    }
128
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc