@@ -25,11 +25,11 @@ type futureEvent struct {
25
25
// KEYS[1] - future event set key
26
26
// ARGV[1] - current timestamp for zrange
27
27
var futureEventsCmd = redis .NewScript (`
28
- local events = redis.call("ZRANGEBYSCORE ", KEYS[1], "-inf", ARGV[1])
28
+ local events = redis.call("ZRANGE ", KEYS[1], "-inf", ARGV[1], "BYSCORE" )
29
29
if events ~= false and #events ~= 0 then
30
30
redis.call("ZREMRANGEBYSCORE", KEYS[1], "-inf", ARGV[1])
31
+ return redis.call("MGET", unpack(events))
31
32
end
32
- return events
33
33
` )
34
34
35
35
func (rb * redisBackend ) GetWorkflowTask (ctx context.Context ) (* task.Workflow , error ) {
@@ -38,43 +38,45 @@ func (rb *redisBackend) GetWorkflowTask(ctx context.Context) (*task.Workflow, er
38
38
nowStr := strconv .Itoa (int (now ))
39
39
40
40
result , err := futureEventsCmd .Run (ctx , rb .rdb , []string {futureEventsKey ()}, nowStr ).Result ()
41
- if err != nil {
41
+ if err != nil && err != redis . Nil {
42
42
return nil , fmt .Errorf ("checking future events: %w" , err )
43
43
}
44
44
45
- for _ , eventR := range result .([]interface {}) {
46
- eventStr := eventR .(string )
47
- var futureEvent futureEvent
48
- if err := json .Unmarshal ([]byte (eventStr ), & futureEvent ); err != nil {
49
- return nil , fmt .Errorf ("unmarshaling event: %w" , err )
50
- }
45
+ if result != nil {
46
+ for _ , eventR := range result .([]interface {}) {
47
+ eventStr := eventR .(string )
48
+ var futureEvent futureEvent
49
+ if err := json .Unmarshal ([]byte (eventStr ), & futureEvent ); err != nil {
50
+ return nil , fmt .Errorf ("unmarshaling event: %w" , err )
51
+ }
51
52
52
- instanceState , err := readInstance (ctx , rb .rdb , futureEvent .Instance .InstanceID )
53
- if err != nil {
54
- if err == backend .ErrInstanceNotFound {
55
- rb .options .Logger .Debug ("Ignoring future event for non-existing instance" , "instance_id" , futureEvent .Instance .InstanceID , "event_id" , futureEvent .Event .ID )
56
- continue
57
- } else {
58
- return nil , fmt .Errorf ("reading instance: %w" , err )
53
+ instanceState , err := readInstance (ctx , rb .rdb , futureEvent .Instance .InstanceID )
54
+ if err != nil {
55
+ if err == backend .ErrInstanceNotFound {
56
+ rb .options .Logger .Debug ("Ignoring future event for non-existing instance" , "instance_id" , futureEvent .Instance .InstanceID , "event_id" , futureEvent .Event .ID )
57
+ continue
58
+ } else {
59
+ return nil , fmt .Errorf ("reading instance: %w" , err )
60
+ }
59
61
}
60
- }
61
62
62
- if instanceState .State != backend .WorkflowStateActive {
63
- rb .options .Logger .Debug ("Ignoring future event for already completed instance" , "instance_id" , futureEvent .Instance .InstanceID , "event_id" , futureEvent .Event .ID )
64
- continue
65
- }
63
+ if instanceState .State != backend .WorkflowStateActive {
64
+ rb .options .Logger .Debug ("Ignoring future event for already completed instance" , "instance_id" , futureEvent .Instance .InstanceID , "event_id" , futureEvent .Event .ID )
65
+ continue
66
+ }
66
67
67
- msgID , err := addEventToStream (ctx , rb .rdb , pendingEventsKey (futureEvent .Instance .InstanceID ), futureEvent .Event )
68
- if err != nil {
69
- return nil , fmt .Errorf ("adding future event to stream: %w" , err )
70
- }
68
+ msgID , err := addEventToStream (ctx , rb .rdb , pendingEventsKey (futureEvent .Instance .InstanceID ), futureEvent .Event )
69
+ if err != nil {
70
+ return nil , fmt .Errorf ("adding future event to stream: %w" , err )
71
+ }
71
72
72
- // Instance now has at least one pending event, try to queue task
73
- if _ , err := rb .workflowQueue .Enqueue (ctx , futureEvent .Instance .InstanceID , & workflowTaskData {
74
- LastPendingEventMessageID : * msgID ,
75
- }); err != nil {
76
- if err != taskqueue .ErrTaskAlreadyInQueue {
77
- return nil , fmt .Errorf ("queueing workflow task: %w" , err )
73
+ // Instance now has at least one pending event, try to queue task
74
+ if _ , err := rb .workflowQueue .Enqueue (ctx , futureEvent .Instance .InstanceID , & workflowTaskData {
75
+ LastPendingEventMessageID : * msgID ,
76
+ }); err != nil {
77
+ if err != taskqueue .ErrTaskAlreadyInQueue {
78
+ return nil , fmt .Errorf ("queueing workflow task: %w" , err )
79
+ }
78
80
}
79
81
}
80
82
}
@@ -171,7 +173,11 @@ func (rb *redisBackend) CompleteWorkflowTask(ctx context.Context, taskID string,
171
173
172
174
// TODO: use pipelines
173
175
for _ , event := range events {
174
- if event .VisibleAt != nil {
176
+ if event .Type == history .EventType_TimerCanceled {
177
+ if err := removeFutureEvent (ctx , rb .rdb , targetInstance , & event ); err != nil {
178
+ return err
179
+ }
180
+ } else if event .VisibleAt != nil {
175
181
// Add future events
176
182
if err := addFutureEvent (ctx , rb .rdb , targetInstance , & event ); err != nil {
177
183
return err
0 commit comments