@@ -3,6 +3,7 @@ package redis
3
3
import (
4
4
"context"
5
5
"fmt"
6
+ "log"
6
7
"strconv"
7
8
"time"
8
9
@@ -23,24 +24,25 @@ import (
23
24
// Note: this does not work with Redis Cluster since not all keys are passed into the script.
24
25
var futureEventsCmd = redis .NewScript (`
25
26
-- Find events which should become visible now
26
- local events = redis.call("ZRANGE", KEYS[1], "-inf", ARGV[1], "BYSCORE")
27
+ local now = ARGV[1]
28
+ local events = redis.call("ZRANGE", KEYS[1], "-inf", now, "BYSCORE")
27
29
for i = 1, #events do
28
30
local instanceSegment = redis.call("HGET", events[i], "instance")
29
31
30
- -- Add event to pending event stream
31
- local eventData = redis.call("HGET", events[i], "event")
32
- local pending_events_key = "pending-events:" .. instanceSegment
33
- redis.call("XADD", pending_events_key, "*", "event", eventData)
34
-
35
- -- Try to queue workflow task
36
- local already_queued = redis.call("SADD", KEYS[3], instanceSegment)
37
- if already_queued ~= 0 then
32
+ -- Try to queue workflow task. If a workflow task is already queued, ignore this event for now.
33
+ local added = redis.call("SADD", KEYS[3], instanceSegment)
34
+ if added == 1 then
38
35
redis.call("XADD", KEYS[2], "*", "id", instanceSegment, "data", "")
39
- end
40
36
41
- -- Delete event hash data
42
- redis.call("DEL", events[i])
43
- redis.call("ZREM", KEYS[1], events[i])
37
+ -- Add event to pending event stream
38
+ local eventData = redis.call("HGET", events[i], "event")
39
+ local pending_events_key = "pending-events:" .. instanceSegment
40
+ redis.call("XADD", pending_events_key, "*", "event", eventData)
41
+
42
+ -- Delete event hash data
43
+ redis.call("DEL", events[i])
44
+ redis.call("ZREM", KEYS[1], events[i])
45
+ end
44
46
end
45
47
46
48
return #events
@@ -52,12 +54,14 @@ func scheduleFutureEvents(ctx context.Context, rb *redisBackend) error {
52
54
53
55
queueKeys := rb .workflowQueue .Keys ()
54
56
55
- if _ , err := futureEventsCmd .Run (ctx , rb .rdb , []string {
57
+ if r , err := futureEventsCmd .Run (ctx , rb .rdb , []string {
56
58
futureEventsKey (),
57
59
queueKeys .StreamKey ,
58
60
queueKeys .SetKey ,
59
61
}, nowStr ).Result (); err != nil && err != redis .Nil {
60
62
return fmt .Errorf ("checking future events: %w" , err )
63
+ } else {
64
+ log .Println ("Scheduled" , r .(int64 ), "future events" )
61
65
}
62
66
63
67
return nil
0 commit comments