@@ -25,11 +25,11 @@ type futureEvent struct {
2525// KEYS[1] - future event set key
2626// ARGV[1] - current timestamp for zrange
2727var 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" )
2929 if events ~= false and #events ~= 0 then
3030 redis.call("ZREMRANGEBYSCORE", KEYS[1], "-inf", ARGV[1])
31+ return redis.call("MGET", unpack(events))
3132 end
32- return events
3333` )
3434
3535func (rb * redisBackend ) GetWorkflowTask (ctx context.Context ) (* task.Workflow , error ) {
@@ -38,43 +38,45 @@ func (rb *redisBackend) GetWorkflowTask(ctx context.Context) (*task.Workflow, er
3838 nowStr := strconv .Itoa (int (now ))
3939
4040 result , err := futureEventsCmd .Run (ctx , rb .rdb , []string {futureEventsKey ()}, nowStr ).Result ()
41- if err != nil {
41+ if err != nil && err != redis . Nil {
4242 return nil , fmt .Errorf ("checking future events: %w" , err )
4343 }
4444
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+ }
5152
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+ }
5961 }
60- }
6162
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+ }
6667
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+ }
7172
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+ }
7880 }
7981 }
8082 }
@@ -171,7 +173,11 @@ func (rb *redisBackend) CompleteWorkflowTask(ctx context.Context, taskID string,
171173
172174 // TODO: use pipelines
173175 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 {
175181 // Add future events
176182 if err := addFutureEvent (ctx , rb .rdb , targetInstance , & event ); err != nil {
177183 return err
0 commit comments