diff options
author | Marko Kreen | 2009-04-21 19:57:03 +0000 |
---|---|---|
committer | Marko Kreen | 2009-04-21 19:57:03 +0000 |
commit | 9ed22aaafdbe692498d62887dcea202a71861295 (patch) | |
tree | 7f1fd6714f157d04b572a9eef8b96616f1ff5ce8 | |
parent | 442c233239f0f860a8ef8cda19b04faec2a2f0be (diff) |
sql/pgq: pgq.batch_retry()
For use by pgq_coop.
-rw-r--r-- | sql/pgq/expected/pgq_core.out | 6 | ||||
-rw-r--r-- | sql/pgq/functions/pgq.batch_retry.sql | 49 | ||||
-rw-r--r-- | sql/pgq/sql/pgq_core.sql | 2 | ||||
-rw-r--r-- | sql/pgq/structure/func_public.sql | 1 |
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 |