summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Kreen2009-04-21 19:57:03 +0000
committerMarko Kreen2009-04-21 19:57:03 +0000
commit9ed22aaafdbe692498d62887dcea202a71861295 (patch)
tree7f1fd6714f157d04b572a9eef8b96616f1ff5ce8
parent442c233239f0f860a8ef8cda19b04faec2a2f0be (diff)
sql/pgq: pgq.batch_retry()
For use by pgq_coop.
-rw-r--r--sql/pgq/expected/pgq_core.out6
-rw-r--r--sql/pgq/functions/pgq.batch_retry.sql49
-rw-r--r--sql/pgq/sql/pgq_core.sql2
-rw-r--r--sql/pgq/structure/func_public.sql1
4 files changed, 54 insertions, 4 deletions
diff --git a/sql/pgq/expected/pgq_core.out b/sql/pgq/expected/pgq_core.out
index 5397a552..15da99a3 100644
--- a/sql/pgq/expected/pgq_core.out
+++ b/sql/pgq/expected/pgq_core.out
@@ -218,10 +218,10 @@ select pgq.event_retry(3, 2, 0);
1
(1 row)
-select pgq.event_retry(3, 2, 0);
- event_retry
+select pgq.batch_retry(3, 0);
+ batch_retry
-------------
- 0
+ 2
(1 row)
select pgq.finish_batch(3);
diff --git a/sql/pgq/functions/pgq.batch_retry.sql b/sql/pgq/functions/pgq.batch_retry.sql
new file mode 100644
index 00000000..09bd67c9
--- /dev/null
+++ b/sql/pgq/functions/pgq.batch_retry.sql
@@ -0,0 +1,49 @@
+create or replace function pgq.batch_retry(
+ i_batch_id bigint,
+ i_retry_seconds integer)
+returns integer as $$
+-- ----------------------------------------------------------------------
+-- Function: pgq.batch_retry(2)
+--
+-- Put whole batch into retry queue, to be processed again later.
+--
+-- Parameters:
+-- i_batch_id - ID of active batch.
+-- i_retry_time - Time when the event should be put back into queue
+--
+-- Returns:
+-- nothing
+-- ----------------------------------------------------------------------
+declare
+ _retry timestamptz;
+ _cnt integer;
+ _s record;
+begin
+ _retry := current_timestamp + ((i_retry_seconds || ' seconds')::interval);
+
+ select * into _s from pgq.subscription where sub_batch = i_batch_id;
+ if not found then
+ raise exception 'batch_retry: batch % not found', i_batch_id;
+ end if;
+
+ insert into pgq.retry_queue (ev_retry_after, ev_queue,
+ ev_id, ev_time, ev_txid, ev_owner, ev_retry,
+ ev_type, ev_data, ev_extra1, ev_extra2,
+ ev_extra3, ev_extra4)
+ select distinct _retry, _s.sub_queue,
+ b.ev_id, b.ev_time, NULL::int8, _s.sub_id, coalesce(b.ev_retry, 0) + 1,
+ b.ev_type, b.ev_data, b.ev_extra1, b.ev_extra2,
+ b.ev_extra3, b.ev_extra4
+ from pgq.get_batch_events(i_batch_id) b
+ left join pgq.retry_queue rq
+ on (rq.ev_id = b.ev_id
+ and rq.ev_owner = _s.sub_id
+ and rq.ev_queue = _s.sub_queue)
+ where rq.ev_id is null;
+
+ GET DIAGNOSTICS _cnt = ROW_COUNT;
+ return _cnt;
+end;
+$$ language plpgsql security definer;
+
+
diff --git a/sql/pgq/sql/pgq_core.sql b/sql/pgq/sql/pgq_core.sql
index 3f714568..bf3f690e 100644
--- a/sql/pgq/sql/pgq_core.sql
+++ b/sql/pgq/sql/pgq_core.sql
@@ -55,7 +55,7 @@ close acurs;
end;
select pgq.event_retry(3, 2, 0);
-select pgq.event_retry(3, 2, 0);
+select pgq.batch_retry(3, 0);
select pgq.finish_batch(3);
select pgq.event_retry_raw('myqueue', 'consumer', now(), 666, now(), 0,
diff --git a/sql/pgq/structure/func_public.sql b/sql/pgq/structure/func_public.sql
index de8b132c..669d0722 100644
--- a/sql/pgq/structure/func_public.sql
+++ b/sql/pgq/structure/func_public.sql
@@ -22,6 +22,7 @@
\i functions/pgq.get_batch_events.sql
\i functions/pgq.get_batch_cursor.sql
\i functions/pgq.event_retry.sql
+\i functions/pgq.batch_retry.sql
\i functions/pgq.finish_batch.sql
-- Group: General info functions