delayed 1.2.1 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +19 -6
- data/Rakefile +5 -1
- data/app/models/delayed/job.rb +42 -29
- data/db/migrate/1_create_delayed_jobs.rb +0 -2
- data/db/migrate/3_add_index_to_delayed_jobs_name.rb +14 -6
- data/db/migrate/4_index_live_jobs.rb +33 -0
- data/db/migrate/5_index_failed_jobs.rb +24 -0
- data/db/migrate/6_set_postgres_fillfactor.rb +31 -0
- data/db/migrate/7_remove_legacy_index.rb +12 -0
- data/lib/delayed/backend/job_preparer.rb +19 -0
- data/lib/delayed/exceptions.rb +4 -1
- data/lib/delayed/helpers/migration.rb +116 -0
- data/lib/delayed/monitor.rb +21 -11
- data/lib/delayed/version.rb +1 -1
- data/lib/delayed/worker.rb +1 -1
- data/lib/delayed.rb +1 -0
- data/spec/delayed/__snapshots__/job_spec.rb.snap +271 -0
- data/spec/delayed/__snapshots__/monitor_spec.rb.snap +969 -0
- data/spec/delayed/job_spec.rb +189 -13
- data/spec/delayed/monitor_spec.rb +61 -18
- data/spec/helper.rb +129 -11
- data/spec/sample_jobs.rb +10 -0
- data/spec/worker_spec.rb +18 -0
- metadata +15 -3
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
snapshots["generates the expected postgresql query 1"] = <<-SNAP
|
|
2
|
+
SELECT \"delayed_jobs\".*
|
|
3
|
+
FROM \"delayed_jobs\"
|
|
4
|
+
WHERE \"delayed_jobs\".\"failed_at\" IS NULL
|
|
5
|
+
AND \"delayed_jobs\".\"run_at\" <= '2025-11-10 17:20:13'
|
|
6
|
+
AND (\"delayed_jobs\".\"locked_at\" IS NULL
|
|
7
|
+
OR \"delayed_jobs\".\"locked_at\" < '2025-11-10 16:59:43'
|
|
8
|
+
OR \"delayed_jobs\".\"locked_by\" = 'worker1'
|
|
9
|
+
AND \"delayed_jobs\".\"locked_at\" >= '2025-11-10 16:59:43')
|
|
10
|
+
ORDER BY \"delayed_jobs\".\"priority\" ASC, \"delayed_jobs\".\"run_at\" ASC
|
|
11
|
+
SNAP
|
|
12
|
+
|
|
13
|
+
snapshots["generates the expected postgresql query plan 1"] = <<-SNAP
|
|
14
|
+
Index Scan using idx_delayed_jobs_live on public.delayed_jobs (cost=...)
|
|
15
|
+
Output: id, priority, attempts, handler, last_error, run_at, locked_at, failed_at, locked_by, queue, created_at, updated_at, name
|
|
16
|
+
Index Cond: (delayed_jobs.run_at <= '2025-11-10 17:20:13'::timestamp without time zone)
|
|
17
|
+
Filter: ((delayed_jobs.locked_at IS NULL) OR (delayed_jobs.locked_at < '2025-11-10 16:59:43'::timestamp without time zone) OR (((delayed_jobs.locked_by)::text = 'worker1'::text) AND (delayed_jobs.locked_at >= '2025-11-10 16:59:43'::timestamp without time zone)))
|
|
18
|
+
SNAP
|
|
19
|
+
|
|
20
|
+
snapshots["generates the expected postgresql query for one queue 1"] = <<-SNAP
|
|
21
|
+
SELECT \"delayed_jobs\".*
|
|
22
|
+
FROM \"delayed_jobs\"
|
|
23
|
+
WHERE \"delayed_jobs\".\"failed_at\" IS NULL
|
|
24
|
+
AND \"delayed_jobs\".\"run_at\" <= '2025-11-10 17:20:13'
|
|
25
|
+
AND (\"delayed_jobs\".\"locked_at\" IS NULL
|
|
26
|
+
OR \"delayed_jobs\".\"locked_at\" < '2025-11-10 16:59:43'
|
|
27
|
+
OR \"delayed_jobs\".\"locked_by\" = 'worker1'
|
|
28
|
+
AND \"delayed_jobs\".\"locked_at\" >= '2025-11-10 16:59:43')
|
|
29
|
+
AND \"delayed_jobs\".\"queue\" = 'default'
|
|
30
|
+
ORDER BY \"delayed_jobs\".\"priority\" ASC, \"delayed_jobs\".\"run_at\" ASC
|
|
31
|
+
SNAP
|
|
32
|
+
|
|
33
|
+
snapshots["generates a postgresql query plan for one queue 1"] = <<-SNAP
|
|
34
|
+
Index Scan using idx_delayed_jobs_live on public.delayed_jobs (cost=...)
|
|
35
|
+
Output: id, priority, attempts, handler, last_error, run_at, locked_at, failed_at, locked_by, queue, created_at, updated_at, name
|
|
36
|
+
Index Cond: ((delayed_jobs.run_at <= '2025-11-10 17:20:13'::timestamp without time zone) AND ((delayed_jobs.queue)::text = 'default'::text))
|
|
37
|
+
Filter: ((delayed_jobs.locked_at IS NULL) OR (delayed_jobs.locked_at < '2025-11-10 16:59:43'::timestamp without time zone) OR (((delayed_jobs.locked_by)::text = 'worker1'::text) AND (delayed_jobs.locked_at >= '2025-11-10 16:59:43'::timestamp without time zone)))
|
|
38
|
+
SNAP
|
|
39
|
+
|
|
40
|
+
snapshots["generates the expected postgresql query for multiple queue 1"] = <<-SNAP
|
|
41
|
+
SELECT \"delayed_jobs\".*
|
|
42
|
+
FROM \"delayed_jobs\"
|
|
43
|
+
WHERE \"delayed_jobs\".\"failed_at\" IS NULL
|
|
44
|
+
AND \"delayed_jobs\".\"run_at\" <= '2025-11-10 17:20:13'
|
|
45
|
+
AND (\"delayed_jobs\".\"locked_at\" IS NULL
|
|
46
|
+
OR \"delayed_jobs\".\"locked_at\" < '2025-11-10 16:59:43'
|
|
47
|
+
OR \"delayed_jobs\".\"locked_by\" = 'worker1'
|
|
48
|
+
AND \"delayed_jobs\".\"locked_at\" >= '2025-11-10 16:59:43')
|
|
49
|
+
AND \"delayed_jobs\".\"queue\" IN ('default', 'mailers', 'tracking')
|
|
50
|
+
ORDER BY \"delayed_jobs\".\"priority\" ASC, \"delayed_jobs\".\"run_at\" ASC
|
|
51
|
+
SNAP
|
|
52
|
+
|
|
53
|
+
snapshots["generates a postgresql query plan for multiple queues 1"] = <<-SNAP
|
|
54
|
+
Index Scan using idx_delayed_jobs_live on public.delayed_jobs (cost=...)
|
|
55
|
+
Output: id, priority, attempts, handler, last_error, run_at, locked_at, failed_at, locked_by, queue, created_at, updated_at, name
|
|
56
|
+
Index Cond: (delayed_jobs.run_at <= '2025-11-10 17:20:13'::timestamp without time zone)
|
|
57
|
+
Filter: (((delayed_jobs.queue)::text = ANY ('{default,mailers,tracking}'::text[])) AND ((delayed_jobs.locked_at IS NULL) OR (delayed_jobs.locked_at < '2025-11-10 16:59:43'::timestamp without time zone) OR (((delayed_jobs.locked_by)::text = 'worker1'::text) AND (delayed_jobs.locked_at >= '2025-11-10 16:59:43'::timestamp without time zone))))
|
|
58
|
+
SNAP
|
|
59
|
+
|
|
60
|
+
snapshots["[legacy index] generates the expected postgresql query plan 1"] = <<-SNAP
|
|
61
|
+
Index Scan using delayed_jobs_priority on public.delayed_jobs (cost=...)
|
|
62
|
+
Output: id, priority, attempts, handler, last_error, run_at, locked_at, failed_at, locked_by, queue, created_at, updated_at, name
|
|
63
|
+
Index Cond: (delayed_jobs.run_at <= '2025-11-10 17:20:13'::timestamp without time zone)
|
|
64
|
+
Filter: ((delayed_jobs.failed_at IS NULL) AND ((delayed_jobs.locked_at IS NULL) OR (delayed_jobs.locked_at < '2025-11-10 16:59:43'::timestamp without time zone) OR (((delayed_jobs.locked_by)::text = 'worker1'::text) AND (delayed_jobs.locked_at >= '2025-11-10 16:59:43'::timestamp without time zone))))
|
|
65
|
+
SNAP
|
|
66
|
+
|
|
67
|
+
snapshots["[legacy index] generates a postgresql query plan for one queue 1"] = <<-SNAP
|
|
68
|
+
Index Scan using delayed_jobs_priority on public.delayed_jobs (cost=...)
|
|
69
|
+
Output: id, priority, attempts, handler, last_error, run_at, locked_at, failed_at, locked_by, queue, created_at, updated_at, name
|
|
70
|
+
Index Cond: (delayed_jobs.run_at <= '2025-11-10 17:20:13'::timestamp without time zone)
|
|
71
|
+
Filter: ((delayed_jobs.failed_at IS NULL) AND ((delayed_jobs.queue)::text = 'default'::text) AND ((delayed_jobs.locked_at IS NULL) OR (delayed_jobs.locked_at < '2025-11-10 16:59:43'::timestamp without time zone) OR (((delayed_jobs.locked_by)::text = 'worker1'::text) AND (delayed_jobs.locked_at >= '2025-11-10 16:59:43'::timestamp without time zone))))
|
|
72
|
+
SNAP
|
|
73
|
+
|
|
74
|
+
snapshots["[legacy index] generates a postgresql query plan for multiple queues 1"] = <<-SNAP
|
|
75
|
+
Index Scan using delayed_jobs_priority on public.delayed_jobs (cost=...)
|
|
76
|
+
Output: id, priority, attempts, handler, last_error, run_at, locked_at, failed_at, locked_by, queue, created_at, updated_at, name
|
|
77
|
+
Index Cond: (delayed_jobs.run_at <= '2025-11-10 17:20:13'::timestamp without time zone)
|
|
78
|
+
Filter: ((delayed_jobs.failed_at IS NULL) AND ((delayed_jobs.queue)::text = ANY ('{default,mailers,tracking}'::text[])) AND ((delayed_jobs.locked_at IS NULL) OR (delayed_jobs.locked_at < '2025-11-10 16:59:43'::timestamp without time zone) OR (((delayed_jobs.locked_by)::text = 'worker1'::text) AND (delayed_jobs.locked_at >= '2025-11-10 16:59:43'::timestamp without time zone))))
|
|
79
|
+
SNAP
|
|
80
|
+
|
|
81
|
+
snapshots["generates a well-scoped postgresql query 1"] = <<-SNAP
|
|
82
|
+
SELECT \"delayed_jobs\".\"locked_at\", \"delayed_jobs\".\"locked_by\"
|
|
83
|
+
FROM \"delayed_jobs\"
|
|
84
|
+
WHERE \"delayed_jobs\".\"locked_by\" = 'worker1'
|
|
85
|
+
AND \"delayed_jobs\".\"locked_at\" >= '2025-11-10 16:59:43'
|
|
86
|
+
AND \"delayed_jobs\".\"failed_at\" IS NULL
|
|
87
|
+
AND \"delayed_jobs\".\"run_at\" <= '2025-11-10 17:20:13'
|
|
88
|
+
SNAP
|
|
89
|
+
|
|
90
|
+
snapshots["generates an efficient postgresql query plan 1"] = <<-SNAP
|
|
91
|
+
Index Scan using idx_delayed_jobs_live on public.delayed_jobs (cost=...)
|
|
92
|
+
Output: locked_at, locked_by
|
|
93
|
+
Index Cond: (delayed_jobs.run_at <= '2025-11-10 17:20:13'::timestamp without time zone)
|
|
94
|
+
Filter: ((delayed_jobs.locked_at >= '2025-11-10 16:59:43'::timestamp without time zone) AND ((delayed_jobs.locked_by)::text = 'worker1'::text))
|
|
95
|
+
SNAP
|
|
96
|
+
|
|
97
|
+
snapshots["[legacy index] generates an efficient postgresql query plan 1"] = <<-SNAP
|
|
98
|
+
Index Scan using delayed_jobs_priority on public.delayed_jobs (cost=...)
|
|
99
|
+
Output: locked_at, locked_by
|
|
100
|
+
Index Cond: (delayed_jobs.run_at <= '2025-11-10 17:20:13'::timestamp without time zone)
|
|
101
|
+
Filter: ((delayed_jobs.failed_at IS NULL) AND (delayed_jobs.locked_at >= '2025-11-10 16:59:43'::timestamp without time zone) AND ((delayed_jobs.locked_by)::text = 'worker1'::text))
|
|
102
|
+
SNAP
|
|
103
|
+
|
|
104
|
+
snapshots["generates the expected sqlite3 query 1"] = <<-SNAP
|
|
105
|
+
SELECT \"delayed_jobs\".*
|
|
106
|
+
FROM \"delayed_jobs\"
|
|
107
|
+
WHERE \"delayed_jobs\".\"failed_at\" IS NULL
|
|
108
|
+
AND \"delayed_jobs\".\"run_at\" <= '2025-11-10 17:20:13'
|
|
109
|
+
AND (\"delayed_jobs\".\"locked_at\" IS NULL
|
|
110
|
+
OR \"delayed_jobs\".\"locked_at\" < '2025-11-10 16:59:43'
|
|
111
|
+
OR \"delayed_jobs\".\"locked_by\" = 'worker1'
|
|
112
|
+
AND \"delayed_jobs\".\"locked_at\" >= '2025-11-10 16:59:43')
|
|
113
|
+
ORDER BY \"delayed_jobs\".\"priority\" ASC, \"delayed_jobs\".\"run_at\" ASC
|
|
114
|
+
SNAP
|
|
115
|
+
|
|
116
|
+
snapshots["generates the expected sqlite3 query plan 1"] = <<-SNAP
|
|
117
|
+
SCAN delayed_jobs USING INDEX idx_delayed_jobs_live
|
|
118
|
+
SNAP
|
|
119
|
+
|
|
120
|
+
snapshots["generates the expected sqlite3 query for one queue 1"] = <<-SNAP
|
|
121
|
+
SELECT \"delayed_jobs\".*
|
|
122
|
+
FROM \"delayed_jobs\"
|
|
123
|
+
WHERE \"delayed_jobs\".\"failed_at\" IS NULL
|
|
124
|
+
AND \"delayed_jobs\".\"run_at\" <= '2025-11-10 17:20:13'
|
|
125
|
+
AND (\"delayed_jobs\".\"locked_at\" IS NULL
|
|
126
|
+
OR \"delayed_jobs\".\"locked_at\" < '2025-11-10 16:59:43'
|
|
127
|
+
OR \"delayed_jobs\".\"locked_by\" = 'worker1'
|
|
128
|
+
AND \"delayed_jobs\".\"locked_at\" >= '2025-11-10 16:59:43')
|
|
129
|
+
AND \"delayed_jobs\".\"queue\" = 'default'
|
|
130
|
+
ORDER BY \"delayed_jobs\".\"priority\" ASC, \"delayed_jobs\".\"run_at\" ASC
|
|
131
|
+
SNAP
|
|
132
|
+
|
|
133
|
+
snapshots["generates a sqlite3 query plan for one queue 1"] = <<-SNAP
|
|
134
|
+
SCAN delayed_jobs USING INDEX idx_delayed_jobs_live
|
|
135
|
+
SNAP
|
|
136
|
+
|
|
137
|
+
snapshots["generates the expected sqlite3 query for multiple queue 1"] = <<-SNAP
|
|
138
|
+
SELECT \"delayed_jobs\".*
|
|
139
|
+
FROM \"delayed_jobs\"
|
|
140
|
+
WHERE \"delayed_jobs\".\"failed_at\" IS NULL
|
|
141
|
+
AND \"delayed_jobs\".\"run_at\" <= '2025-11-10 17:20:13'
|
|
142
|
+
AND (\"delayed_jobs\".\"locked_at\" IS NULL
|
|
143
|
+
OR \"delayed_jobs\".\"locked_at\" < '2025-11-10 16:59:43'
|
|
144
|
+
OR \"delayed_jobs\".\"locked_by\" = 'worker1'
|
|
145
|
+
AND \"delayed_jobs\".\"locked_at\" >= '2025-11-10 16:59:43')
|
|
146
|
+
AND \"delayed_jobs\".\"queue\" IN ('default', 'mailers', 'tracking')
|
|
147
|
+
ORDER BY \"delayed_jobs\".\"priority\" ASC, \"delayed_jobs\".\"run_at\" ASC
|
|
148
|
+
SNAP
|
|
149
|
+
|
|
150
|
+
snapshots["generates a sqlite3 query plan for multiple queues 1"] = <<-SNAP
|
|
151
|
+
SCAN delayed_jobs USING INDEX idx_delayed_jobs_live
|
|
152
|
+
SNAP
|
|
153
|
+
|
|
154
|
+
snapshots["[legacy index] generates the expected sqlite3 query plan 1"] = <<-SNAP
|
|
155
|
+
SCAN delayed_jobs USING INDEX delayed_jobs_priority
|
|
156
|
+
SNAP
|
|
157
|
+
|
|
158
|
+
snapshots["[legacy index] generates a sqlite3 query plan for one queue 1"] = <<-SNAP
|
|
159
|
+
SCAN delayed_jobs USING INDEX delayed_jobs_priority
|
|
160
|
+
SNAP
|
|
161
|
+
|
|
162
|
+
snapshots["[legacy index] generates a sqlite3 query plan for multiple queues 1"] = <<-SNAP
|
|
163
|
+
SCAN delayed_jobs USING INDEX delayed_jobs_priority
|
|
164
|
+
SNAP
|
|
165
|
+
|
|
166
|
+
snapshots["generates a well-scoped sqlite3 query 1"] = <<-SNAP
|
|
167
|
+
SELECT \"delayed_jobs\".\"locked_at\", \"delayed_jobs\".\"locked_by\"
|
|
168
|
+
FROM \"delayed_jobs\"
|
|
169
|
+
WHERE \"delayed_jobs\".\"locked_by\" = 'worker1'
|
|
170
|
+
AND \"delayed_jobs\".\"locked_at\" >= '2025-11-10 16:59:43'
|
|
171
|
+
AND \"delayed_jobs\".\"failed_at\" IS NULL
|
|
172
|
+
AND \"delayed_jobs\".\"run_at\" <= '2025-11-10 17:20:13'
|
|
173
|
+
SNAP
|
|
174
|
+
|
|
175
|
+
snapshots["generates an efficient sqlite3 query plan 1"] = <<-SNAP
|
|
176
|
+
SCAN delayed_jobs USING INDEX idx_delayed_jobs_live
|
|
177
|
+
SNAP
|
|
178
|
+
|
|
179
|
+
snapshots["[legacy index] generates an efficient sqlite3 query plan 1"] = <<-SNAP
|
|
180
|
+
SCAN delayed_jobs
|
|
181
|
+
SNAP
|
|
182
|
+
|
|
183
|
+
snapshots["generates the expected mysql2 query 1"] = <<-SNAP
|
|
184
|
+
SELECT `delayed_jobs`.*
|
|
185
|
+
FROM `delayed_jobs`
|
|
186
|
+
WHERE `delayed_jobs`.`failed_at` IS NULL
|
|
187
|
+
AND `delayed_jobs`.`run_at` <= '2025-11-10 17:20:13'
|
|
188
|
+
AND (`delayed_jobs`.`locked_at` IS NULL
|
|
189
|
+
OR `delayed_jobs`.`locked_at` < '2025-11-10 16:59:43'
|
|
190
|
+
OR `delayed_jobs`.`locked_by` = 'worker1'
|
|
191
|
+
AND `delayed_jobs`.`locked_at` >= '2025-11-10 16:59:43')
|
|
192
|
+
ORDER BY `delayed_jobs`.`priority` ASC, `delayed_jobs`.`run_at` ASC
|
|
193
|
+
SNAP
|
|
194
|
+
|
|
195
|
+
snapshots["generates the expected mysql2 query plan 1"] = <<-SNAP
|
|
196
|
+
-> Filter: ((delayed_jobs.locked_at is null) or (delayed_jobs.locked_at < TIMESTAMP'2025-11-10 16:59:43') or ((delayed_jobs.locked_by = 'worker1') and (delayed_jobs.locked_at >= TIMESTAMP'2025-11-10 16:59:43'))) (cost=...)
|
|
197
|
+
-> Index lookup on delayed_jobs using idx_delayed_jobs_live (failed_at = NULL), with index condition: ((delayed_jobs.failed_at is null) and (delayed_jobs.run_at <= TIMESTAMP'2025-11-10 17:20:13') and ((delayed_jobs.locked_at is null) or (delayed_jobs.locked_at < TIMESTAMP'2025-11-10 16:59:43') or (delayed_jobs.locked_at >= TIMESTAMP'2025-11-10 16:59:43'))) (cost=...)
|
|
198
|
+
SNAP
|
|
199
|
+
|
|
200
|
+
snapshots["generates the expected mysql2 query for one queue 1"] = <<-SNAP
|
|
201
|
+
SELECT `delayed_jobs`.*
|
|
202
|
+
FROM `delayed_jobs`
|
|
203
|
+
WHERE `delayed_jobs`.`failed_at` IS NULL
|
|
204
|
+
AND `delayed_jobs`.`run_at` <= '2025-11-10 17:20:13'
|
|
205
|
+
AND (`delayed_jobs`.`locked_at` IS NULL
|
|
206
|
+
OR `delayed_jobs`.`locked_at` < '2025-11-10 16:59:43'
|
|
207
|
+
OR `delayed_jobs`.`locked_by` = 'worker1'
|
|
208
|
+
AND `delayed_jobs`.`locked_at` >= '2025-11-10 16:59:43')
|
|
209
|
+
AND `delayed_jobs`.`queue` = 'default'
|
|
210
|
+
ORDER BY `delayed_jobs`.`priority` ASC, `delayed_jobs`.`run_at` ASC
|
|
211
|
+
SNAP
|
|
212
|
+
|
|
213
|
+
snapshots["generates a mysql2 query plan for one queue 1"] = <<-SNAP
|
|
214
|
+
-> Filter: ((delayed_jobs.locked_at is null) or (delayed_jobs.locked_at < TIMESTAMP'2025-11-10 16:59:43') or ((delayed_jobs.locked_by = 'worker1') and (delayed_jobs.locked_at >= TIMESTAMP'2025-11-10 16:59:43'))) (cost=...)
|
|
215
|
+
-> Index lookup on delayed_jobs using idx_delayed_jobs_live (failed_at = NULL), with index condition: ((delayed_jobs.queue = 'default') and (delayed_jobs.failed_at is null) and (delayed_jobs.run_at <= TIMESTAMP'2025-11-10 17:20:13') and ((delayed_jobs.locked_at is null) or (delayed_jobs.locked_at < TIMESTAMP'2025-11-10 16:59:43') or (delayed_jobs.locked_at >= TIMESTAMP'2025-11-10 16:59:43'))) (cost=...)
|
|
216
|
+
SNAP
|
|
217
|
+
|
|
218
|
+
snapshots["generates the expected mysql2 query for multiple queue 1"] = <<-SNAP
|
|
219
|
+
SELECT `delayed_jobs`.*
|
|
220
|
+
FROM `delayed_jobs`
|
|
221
|
+
WHERE `delayed_jobs`.`failed_at` IS NULL
|
|
222
|
+
AND `delayed_jobs`.`run_at` <= '2025-11-10 17:20:13'
|
|
223
|
+
AND (`delayed_jobs`.`locked_at` IS NULL
|
|
224
|
+
OR `delayed_jobs`.`locked_at` < '2025-11-10 16:59:43'
|
|
225
|
+
OR `delayed_jobs`.`locked_by` = 'worker1'
|
|
226
|
+
AND `delayed_jobs`.`locked_at` >= '2025-11-10 16:59:43')
|
|
227
|
+
AND `delayed_jobs`.`queue` IN ('default', 'mailers', 'tracking')
|
|
228
|
+
ORDER BY `delayed_jobs`.`priority` ASC, `delayed_jobs`.`run_at` ASC
|
|
229
|
+
SNAP
|
|
230
|
+
|
|
231
|
+
snapshots["generates a mysql2 query plan for multiple queues 1"] = <<-SNAP
|
|
232
|
+
-> Filter: ((delayed_jobs.locked_at is null) or (delayed_jobs.locked_at < TIMESTAMP'2025-11-10 16:59:43') or ((delayed_jobs.locked_by = 'worker1') and (delayed_jobs.locked_at >= TIMESTAMP'2025-11-10 16:59:43'))) (cost=...)
|
|
233
|
+
-> Index lookup on delayed_jobs using idx_delayed_jobs_live (failed_at = NULL), with index condition: ((delayed_jobs.failed_at is null) and (delayed_jobs.run_at <= TIMESTAMP'2025-11-10 17:20:13') and ((delayed_jobs.locked_at is null) or (delayed_jobs.locked_at < TIMESTAMP'2025-11-10 16:59:43') or (delayed_jobs.locked_at >= TIMESTAMP'2025-11-10 16:59:43')) and (delayed_jobs.queue in ('default','mailers','tracking'))) (cost=...)
|
|
234
|
+
SNAP
|
|
235
|
+
|
|
236
|
+
snapshots["[legacy index] generates the expected mysql2 query plan 1"] = <<-SNAP
|
|
237
|
+
-> Sort: delayed_jobs.priority, delayed_jobs.run_at (cost=...)
|
|
238
|
+
-> Filter: ((delayed_jobs.failed_at is null) and (delayed_jobs.run_at <= TIMESTAMP'2025-11-10 17:20:13') and ((delayed_jobs.locked_at is null) or (delayed_jobs.locked_at < TIMESTAMP'2025-11-10 16:59:43') or ((delayed_jobs.locked_by = 'worker1') and (delayed_jobs.locked_at >= TIMESTAMP'2025-11-10 16:59:43')))) (cost=...)
|
|
239
|
+
-> Table scan on delayed_jobs (cost=...)
|
|
240
|
+
SNAP
|
|
241
|
+
|
|
242
|
+
snapshots["[legacy index] generates a mysql2 query plan for one queue 1"] = <<-SNAP
|
|
243
|
+
-> Sort: delayed_jobs.priority, delayed_jobs.run_at (cost=...)
|
|
244
|
+
-> Filter: ((delayed_jobs.queue = 'default') and (delayed_jobs.failed_at is null) and (delayed_jobs.run_at <= TIMESTAMP'2025-11-10 17:20:13') and ((delayed_jobs.locked_at is null) or (delayed_jobs.locked_at < TIMESTAMP'2025-11-10 16:59:43') or ((delayed_jobs.locked_by = 'worker1') and (delayed_jobs.locked_at >= TIMESTAMP'2025-11-10 16:59:43')))) (cost=...)
|
|
245
|
+
-> Table scan on delayed_jobs (cost=...)
|
|
246
|
+
SNAP
|
|
247
|
+
|
|
248
|
+
snapshots["[legacy index] generates a mysql2 query plan for multiple queues 1"] = <<-SNAP
|
|
249
|
+
-> Sort: delayed_jobs.priority, delayed_jobs.run_at (cost=...)
|
|
250
|
+
-> Filter: ((delayed_jobs.failed_at is null) and (delayed_jobs.run_at <= TIMESTAMP'2025-11-10 17:20:13') and ((delayed_jobs.locked_at is null) or (delayed_jobs.locked_at < TIMESTAMP'2025-11-10 16:59:43') or ((delayed_jobs.locked_by = 'worker1') and (delayed_jobs.locked_at >= TIMESTAMP'2025-11-10 16:59:43'))) and (delayed_jobs.queue in ('default','mailers','tracking'))) (cost=...)
|
|
251
|
+
-> Table scan on delayed_jobs (cost=...)
|
|
252
|
+
SNAP
|
|
253
|
+
|
|
254
|
+
snapshots["generates a well-scoped mysql2 query 1"] = <<-SNAP
|
|
255
|
+
SELECT `delayed_jobs`.`locked_at`, `delayed_jobs`.`locked_by`
|
|
256
|
+
FROM `delayed_jobs`
|
|
257
|
+
WHERE `delayed_jobs`.`locked_by` = 'worker1'
|
|
258
|
+
AND `delayed_jobs`.`locked_at` >= '2025-11-10 16:59:43'
|
|
259
|
+
AND `delayed_jobs`.`failed_at` IS NULL
|
|
260
|
+
AND `delayed_jobs`.`run_at` <= '2025-11-10 17:20:13'
|
|
261
|
+
SNAP
|
|
262
|
+
|
|
263
|
+
snapshots["generates an efficient mysql2 query plan 1"] = <<-SNAP
|
|
264
|
+
-> Filter: (delayed_jobs.locked_by = 'worker1') (cost=...)
|
|
265
|
+
-> Index lookup on delayed_jobs using idx_delayed_jobs_live (failed_at = NULL), with index condition: ((delayed_jobs.locked_at >= TIMESTAMP'2025-11-10 16:59:43') and (delayed_jobs.failed_at is null) and (delayed_jobs.run_at <= TIMESTAMP'2025-11-10 17:20:13')) (cost=...)
|
|
266
|
+
SNAP
|
|
267
|
+
|
|
268
|
+
snapshots["[legacy index] generates an efficient mysql2 query plan 1"] = <<-SNAP
|
|
269
|
+
-> Filter: ((delayed_jobs.locked_by = 'worker1') and (delayed_jobs.locked_at >= TIMESTAMP'2025-11-10 16:59:43') and (delayed_jobs.failed_at is null) and (delayed_jobs.run_at <= TIMESTAMP'2025-11-10 17:20:13')) (cost=...)
|
|
270
|
+
-> Table scan on delayed_jobs (cost=...)
|
|
271
|
+
SNAP
|