Skip to content

Commit 84037ad

Browse files
committed
Unschedule removed RecurringTask
1 parent a05b42d commit 84037ad

File tree

3 files changed

+45
-2
lines changed

3 files changed

+45
-2
lines changed

lib/solid_queue/scheduler.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ def run
3030
loop do
3131
break if shutting_down?
3232

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?
3535
process.update_columns(metadata: metadata.compact)
3636
end
3737
end

lib/solid_queue/scheduler/recurring_schedule.rb

+11
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,17 @@ def schedule_new_dynamic_tasks
3737
end
3838
end
3939

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+
4051
def schedule_task(task)
4152
scheduled_tasks[task.key] = schedule(task)
4253
end

test/unit/scheduler_test.rb

+32
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,36 @@ class SchedulerTest < ActiveSupport::TestCase
9999
ensure
100100
scheduler&.stop
101101
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
102134
end

0 commit comments

Comments
 (0)