10000 Merge pull request #329 from peopledoc/ele_defer-periodic-job · Develop-Python/procrastinate@a8a7a50 · GitHub
[go: up one dir, main page]

Skip to content

Commit a8a7a50

Browse files
author
Éric Lemoine
authored
Merge pull request procrastinate-org#329 from peopledoc/ele_defer-periodic-job
Fix the procrastinate_defer_periodic_job SQL function
2 parents ad02649 + 8ee6603 commit a8a7a50

File tree

3 files changed

+81
-4
lines changed

3 files changed

+81
-4
lines changed
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 3.1.2 on 2020-10-05 10:50
2+
3+
from django.db import migrations
4+
5+
import procrastinate.contrib.django
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
("procrastinate", "0012_add_locks_to_periodic_defer"),
12+
]
13+
14+
operations = [
15+
procrastinate.contrib.django.RunProcrastinateFile(
16+
filename="delta_0.15.2_001_fix_procrastinate_defer_periodic_job.sql",
17+
),
18+
]
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
DROP FUNCTION IF EXISTS procrastinate_defer_periodic_job;
2+
CREATE FUNCTION procrastinate_defer_periodic_job(
3+
_queue_name character varying,
4+
_lock character varying,
5+
_queueing_lock character varying,
6+
_task_name character varying,
7+
_defer_timestamp bigint
8+
) RETURNS bigint
9+
LANGUAGE plpgsql
10+
AS $$
11+
DECLARE
12+
_job_id bigint;
13+
_defer_id bigint;
14+
BEGIN
15+
16+
INSERT
17+
INTO procrastinate_periodic_defers (task_name, queue_name, defer_timestamp)
18+
VALUES (_task_name, _queue_name, _defer_timestamp)
19+
ON CONFLICT DO NOTHING
20+
RETURNING id into _defer_id;
21+
22+
IF _defer_id IS NULL THEN
23+
RETURN NULL;
24+
END IF;
25+
26+
UPDATE procrastinate_periodic_defers
27+
SET job_id = procrastinate_defer_job(
28+
_queue_name,
29+
_task_name,
30+
_lock,
31+
_queueing_lock,
32+
('{"timestamp": ' || _defer_timestamp || '}')::jsonb,
33+
NULL
34+
)
35+
WHERE id = _defer_id
36+
RETURNING job_id INTO _job_id;
37+
38+
DELETE
39+
FROM procrastinate_periodic_defers
40+
USING (
41+
SELECT id
42+
FROM procrastinate_periodic_defers
43+
WHERE procrastinate_periodic_defers.task_name = _task_name
44+
AND procrastinate_periodic_defers.queue_name = _queue_name
45+
AND procrastinate_periodic_defers.defer_timestamp < _defer_timestamp
46+
ORDER BY id
47+
FOR UPDATE
48+
) to_delete
49+
WHERE procrastinate_periodic_defers.id = to_delete.id;
50+
51+
RETURN _job_id;
52+
END;
53+
$$;

procrastinate/sql/schema.sql

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,16 @@ BEGIN
124124

125125
DELETE
126126
FROM procrastinate_periodic_defers
127-
WHERE
128-
_job_id IS NOT NULL
129-
AND procrastinate_periodic_defers.task_name = _task_name
130-
AND procrastinate_periodic_defers.defer_timestamp < _defer_timestamp;
127+
USING (
128+
SELECT id
129+
FROM procrastinate_periodic_defers
130+
WHERE procrastinate_periodic_defers.task_name = _task_name
131+
AND procrastinate_periodic_defers.queue_name = _queue_name
132+
AND procrastinate_periodic_defers.defer_timestamp < _defer_timestamp
133+
ORDER BY id
134+
FOR UPDATE
135+
) to_delete
136+
WHERE procrastinate_periodic_defers.id = to_delete.id;
131137

132138
RETURN _job_id;
133139
END;

0 commit comments

Comments
 (0)
0