Skip to content

Commit 3d36ca4

Browse files
committed
Simplify recurring schedule with respect to dynamic task reloading
We don't need to track dynamic task changes, we can just reload the metadata in every case. If it hasn't changed, Rails won't issue any new update to the process record. Also, we can just use `dynamic_tasks` everywhere, as an empty AR relation if dynamic tasks are disabled, avoiding extra queries but keeping the code simpler.
1 parent b012535 commit 3d36ca4

3 files changed

Lines changed: 30 additions & 56 deletions

File tree

lib/solid_queue/processes/registrable.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,8 @@ def heartbeat
6060
wake_up
6161
end
6262

63-
def refresh_registered_process
64-
wrap_in_app_executor { process&.update_columns(metadata: metadata.compact) }
63+
def reload_metadata
64+
wrap_in_app_executor { process&.update(metadata: metadata.compact) }
6565
end
6666
end
6767
end

lib/solid_queue/scheduler.rb

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def run
3434
loop do
3535
break if shutting_down?
3636

37-
reload_schedule if dynamic_tasks_enabled?
37+
reload_dynamic_schedule if dynamic_tasks_enabled?
3838

3939
interruptible_sleep(sleep_interval)
4040
end
@@ -52,13 +52,9 @@ def unschedule_recurring_tasks
5252
recurring_schedule.unschedule_tasks
5353
end
5454

55-
def reload_schedule
56-
recurring_schedule.reload!
57-
58-
if recurring_schedule.changed?
59-
refresh_registered_process
60-
recurring_schedule.clear_changes
61-
end
55+
def reload_dynamic_schedule
56+
recurring_schedule.reload_dynamic_tasks
57+
reload_metadata
6258
end
6359

6460
def dynamic_tasks_enabled?

lib/solid_queue/scheduler/recurring_schedule.rb

Lines changed: 24 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,18 @@ class Scheduler::RecurringSchedule
77
attr_reader :scheduled_tasks
88

99
def initialize(static_tasks, dynamic_tasks_enabled: false)
10-
@static_tasks = Array(static_tasks).map { |task| SolidQueue::RecurringTask.wrap(task) }.select(&:valid?)
11-
@scheduled_tasks = Concurrent::Hash.new
12-
@changes = Concurrent::Hash.new
10+
@static_tasks = Array(static_tasks).map { |task| RecurringTask.wrap(task) }.select(&:valid?)
1311
@dynamic_tasks_enabled = dynamic_tasks_enabled
12+
13+
@scheduled_tasks = Concurrent::Hash.new
1414
end
1515

1616
def configured_tasks
17-
if dynamic_tasks_enabled?
18-
static_tasks + dynamic_tasks.to_a
19-
else
20-
static_tasks
21-
end
17+
static_tasks + dynamic_tasks
2218
end
2319

2420
def empty?
25-
if dynamic_tasks_enabled?
26-
scheduled_tasks.empty? && dynamic_tasks.none?
27-
else
28-
scheduled_tasks.empty?
29-
end
21+
scheduled_tasks.empty? && dynamic_tasks.empty?
3022
end
3123

3224
def schedule_tasks
@@ -50,69 +42,55 @@ def unschedule_tasks
5042
end
5143

5244
def task_keys
53-
if dynamic_tasks_enabled?
54-
static_task_keys + dynamic_tasks.pluck(:key)
55-
else
56-
static_task_keys
57-
end
45+
static_task_keys + dynamic_task_keys
5846
end
5947

60-
def reload!
48+
def reload_dynamic_tasks
6149
wrap_in_app_executor do
62-
{ added_tasks: schedule_new_dynamic_tasks,
63-
removed_tasks: unschedule_old_dynamic_tasks }.each do |key, values|
64-
if values.any?
65-
@changes[key] = values
66-
else
67-
@changes.delete(key)
68-
end
69-
end
50+
schedule_created_dynamic_tasks
51+
unschedule_deleted_dynamic_tasks
7052
end
7153
end
7254

73-
def changed?
74-
@changes.any?
75-
end
76-
77-
def clear_changes
78-
@changes.clear
79-
end
80-
8155
private
8256
attr_reader :static_tasks
8357

84-
def dynamic_tasks_enabled?
85-
@dynamic_tasks_enabled
58+
def static_task_keys
59+
static_tasks.map(&:key)
8660
end
8761

8862
def dynamic_tasks
89-
SolidQueue::RecurringTask.dynamic
63+
dynamic_tasks_enabled? ? RecurringTask.dynamic : RecurringTask.none
9064
end
9165

92-
def static_task_keys
93-
static_tasks.map(&:key)
66+
def dynamic_task_keys
67+
dynamic_tasks.pluck(:key)
68+
end
69+
70+
def dynamic_tasks_enabled?
71+
@dynamic_tasks_enabled
9472
end
9573

96-
def schedule_new_dynamic_tasks
74+
def schedule_created_dynamic_tasks
9775
dynamic_tasks.where.not(key: scheduled_tasks.keys).each do |task|
9876
schedule_task(task)
9977
end
10078
end
10179

102-
def unschedule_old_dynamic_tasks
103-
(scheduled_tasks.keys - SolidQueue::RecurringTask.pluck(:key)).each do |key|
80+
def unschedule_deleted_dynamic_tasks
81+
(scheduled_tasks.keys - RecurringTask.pluck(:key)).each do |key|
10482
scheduled_tasks[key].cancel
10583
scheduled_tasks.delete(key)
10684
end
10785
end
10886

10987
def persist_static_tasks
110-
SolidQueue::RecurringTask.static.where.not(key: static_task_keys).delete_all
111-
SolidQueue::RecurringTask.create_or_update_all static_tasks
88+
RecurringTask.static.where.not(key: static_task_keys).delete_all
89+
RecurringTask.create_or_update_all static_tasks
11290
end
11391

11492
def reload_static_tasks
115-
@static_tasks = SolidQueue::RecurringTask.static.where(key: static_task_keys).to_a
93+
@static_tasks = RecurringTask.static.where(key: static_task_keys).to_a
11694
end
11795

11896
def schedule(task)

0 commit comments

Comments
 (0)