File tree 3 files changed +45
-2
lines changed
3 files changed +45
-2
lines changed Original file line number Diff line number Diff line change @@ -30,8 +30,8 @@ def run
30
30
loop do
31
31
break if shutting_down?
32
32
33
- recurring_schedule . schedule_new_dynamic_tasks . tap do |new_tasks |
34
- if new_tasks . any?
33
+ recurring_schedule . update_scheduled_tasks . tap do |updated_tasks |
34
+ if updated_tasks . any?
35
35
process . update_columns ( metadata : metadata . compact )
36
36
end
37
37
end
Original file line number Diff line number Diff line change @@ -37,6 +37,17 @@ def schedule_new_dynamic_tasks
37
37
end
38
38
end
39
39
40
+ def unschedule_old_dynamic_tasks
41
+ ( scheduled_tasks . keys - dynamic_tasks . pluck ( :key ) ) . each do |key |
42
+ scheduled_tasks [ key ] . cancel
43
+ scheduled_tasks . delete ( key )
44
+ end
45
+ end
46
+
47
+ def update_scheduled_tasks
48
+ schedule_new_dynamic_tasks + unschedule_old_dynamic_tasks
49
+ end
50
+
40
51
def schedule_task ( task )
41
52
scheduled_tasks [ task . key ] = schedule ( task )
42
53
end
Original file line number Diff line number Diff line change @@ -99,4 +99,36 @@ class SchedulerTest < ActiveSupport::TestCase
99
99
ensure
100
100
scheduler &.stop
101
101
end
102
+
103
+ test "updates metadata after removing dynamic task post-start" do
104
+ old_dynamic_task = SolidQueue ::RecurringTask . create (
105
+ key : "old_dynamic_task" ,
106
+ static : false ,
107
+ class_name : "AddToBufferJob" ,
108
+ schedule : "every second" ,
109
+ arguments : [ 42 ]
110
+ )
111
+
112
+ scheduler = SolidQueue ::Scheduler . new ( recurring_tasks : { } ) . tap do |s |
113
+ s . define_singleton_method ( :interruptible_sleep ) { |interval | } # avoid real sleeping
114
+ s . start
115
+ end
116
+
117
+ wait_for_registered_processes ( 1 , timeout : 1 . second )
118
+
119
+ process = SolidQueue ::Process . first
120
+ # initially there is one recurring_schedule key
121
+ assert_metadata process , recurring_schedule : [ "old_dynamic_task" ]
122
+
123
+ old_dynamic_task . destroy
124
+
125
+ sleep 1
126
+
127
+ process . reload
128
+
129
+ # The task is unschedule after it's being removed, and it's reflected in the metadata
130
+ assert process . metadata , { }
131
+ ensure
132
+ scheduler &.stop
133
+ end
102
134
end
You can’t perform that action at this time.
0 commit comments