diff options
author | Marko Kreen | 2009-03-18 09:07:31 +0000 |
---|---|---|
committer | Marko Kreen | 2009-03-18 10:00:24 +0000 |
commit | ab675c1bed6f8a3d8a2e0b1007f9f0adeace926d (patch) | |
tree | 9d90a29fb67b4bdd6248d4f76d16679a339716af | |
parent | c4bed901fa88246c6b066f6a67db95785f0085e5 (diff) |
Preparation for pgq_coop: make sub_id non-unique.
To allow sharing retry events between coop consumers,
the simplest way is to make then share same sub_id.
So remove any assumptions from the code that
sub_id is unique.
This patch also fixes 2 long-standing bugs:
- pgq.retry_queue had double index
- pgq.subscription.batch_id did not had index
As both had only minor effect on performance, they went
unnoticed so long.
-rw-r--r-- | sql/pgq/functions/pgq.event_retry.sql | 4 | ||||
-rw-r--r-- | sql/pgq/functions/pgq.event_retry_raw.sql | 7 | ||||
-rw-r--r-- | sql/pgq/functions/pgq.maint_retry_events.sql | 5 | ||||
-rw-r--r-- | sql/pgq/functions/pgq.unregister_consumer.sql | 9 | ||||
-rw-r--r-- | sql/pgq/structure/tables.sql | 17 |
5 files changed, 25 insertions, 17 deletions
diff --git a/sql/pgq/functions/pgq.event_retry.sql b/sql/pgq/functions/pgq.event_retry.sql index 5b349b43..ee54d3a1 100644 --- a/sql/pgq/functions/pgq.event_retry.sql +++ b/sql/pgq/functions/pgq.event_retry.sql @@ -17,10 +17,10 @@ returns integer as $$ -- nothing -- ---------------------------------------------------------------------- begin - insert into pgq.retry_queue (ev_retry_after, + 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 x_retry_time, + select x_retry_time, sub_queue, ev_id, ev_time, NULL, sub_id, coalesce(ev_retry, 0) + 1, ev_type, ev_data, ev_extra1, ev_extra2, ev_extra3, ev_extra4 from pgq.get_batch_events(x_batch_id), diff --git a/sql/pgq/functions/pgq.event_retry_raw.sql b/sql/pgq/functions/pgq.event_retry_raw.sql index 3a2efb29..3a9bcd52 100644 --- a/sql/pgq/functions/pgq.event_retry_raw.sql +++ b/sql/pgq/functions/pgq.event_retry_raw.sql @@ -38,7 +38,7 @@ declare q record; id bigint; begin - select sub_id, queue_event_seq into q + select sub_id, queue_event_seq, sub_queue into q from pgq.consumer, pgq.queue, pgq.subscription where queue_name = x_queue and co_name = x_consumer @@ -53,10 +53,11 @@ begin id := nextval(q.queue_event_seq); end if; - insert into pgq.retry_queue (ev_retry_after, + insert into pgq.retry_queue (ev_retry_after, ev_queue, ev_id, ev_time, ev_owner, ev_retry, ev_type, ev_data, ev_extra1, ev_extra2, ev_extra3, ev_extra4) - values (x_retry_after, x_ev_id, x_ev_time, q.sub_id, x_ev_retry, + values (x_retry_after, q.sub_queue, + x_ev_id, x_ev_time, q.sub_id, x_ev_retry, x_ev_type, x_ev_data, x_ev_extra1, x_ev_extra2, x_ev_extra3, x_ev_extra4); diff --git a/sql/pgq/functions/pgq.maint_retry_events.sql b/sql/pgq/functions/pgq.maint_retry_events.sql index 8e4bfa4b..64110db9 100644 --- a/sql/pgq/functions/pgq.maint_retry_events.sql +++ b/sql/pgq/functions/pgq.maint_retry_events.sql @@ -20,10 +20,9 @@ begin select queue_name, ev_id, ev_time, ev_owner, ev_retry, ev_type, ev_data, ev_extra1, ev_extra2, ev_extra3, ev_extra4 - from pgq.retry_queue, pgq.queue, pgq.subscription + from pgq.retry_queue, pgq.queue where ev_retry_after <= current_timestamp - and sub_id = ev_owner - and queue_id = sub_queue + and queue_id = ev_queue order by ev_retry_after limit 10 loop diff --git a/sql/pgq/functions/pgq.unregister_consumer.sql b/sql/pgq/functions/pgq.unregister_consumer.sql index c97261d6..9356bcec 100644 --- a/sql/pgq/functions/pgq.unregister_consumer.sql +++ b/sql/pgq/functions/pgq.unregister_consumer.sql @@ -18,6 +18,7 @@ returns integer as $$ -- ---------------------------------------------------------------------- declare x_sub_id integer; + _sub_id_cnt integer; begin select sub_id into x_sub_id from pgq.subscription, pgq.consumer, pgq.queue @@ -29,6 +30,14 @@ begin raise exception 'consumer not registered on queue'; end if; + -- subconsumer-aware + select count(*) into _sub_id_cnt + from pgq.subscription + where sub_id = x_sub_id; + if _sub_id_cnt > 1 then + raise exception 'unregistered subconsumers detected'; + end if; + delete from pgq.retry_queue where ev_owner = x_sub_id; diff --git a/sql/pgq/structure/tables.sql b/sql/pgq/structure/tables.sql index 43d27287..02d2f0a4 100644 --- a/sql/pgq/structure/tables.sql +++ b/sql/pgq/structure/tables.sql @@ -147,15 +147,14 @@ create table pgq.subscription ( sub_batch bigint, sub_next_tick bigint, - constraint subscription_pkey primary key (sub_id), - constraint subscription_ukey unique (sub_queue, sub_consumer), + constraint subscription_pkey primary key (sub_queue, sub_consumer), + constraint subscription_batch_idx unique (sub_batch), constraint sub_queue_fkey foreign key (sub_queue) references pgq.queue (queue_id), constraint sub_consumer_fkey foreign key (sub_consumer) references pgq.consumer (co_id) ); - -- ---------------------------------------------------------------------- -- Table: pgq.event_template -- @@ -198,21 +197,22 @@ create table pgq.event_template ( -- -- Columns: -- ev_retry_after - time when it should be re-inserted to main queue +-- ev_queue - queue id, used to speed up event copy into queue -- * - same as pgq.event_template -- ---------------------------------------------------------------------- create table pgq.retry_queue ( ev_retry_after timestamptz not null, + ev_queue int4 not null, like pgq.event_template, constraint rq_pkey primary key (ev_owner, ev_id), - constraint rq_owner_fkey foreign key (ev_owner) - references pgq.subscription (sub_id) + constraint rq_queue_id_fkey foreign key (ev_queue) + references pgq.queue (queue_id) ); alter table pgq.retry_queue alter column ev_owner set not null; alter table pgq.retry_queue alter column ev_txid drop not null; create index rq_retry_idx on pgq.retry_queue (ev_retry_after); -create index rq_retry_owner_idx on pgq.retry_queue (ev_owner, ev_id); -- ---------------------------------------------------------------------- -- Table: pgq.failed_queue @@ -222,6 +222,7 @@ create index rq_retry_owner_idx on pgq.retry_queue (ev_owner, ev_id); -- Columns: -- ev_failed_reason - consumer's excuse for not processing -- ev_failed_time - when it was tagged failed +-- ev_queue - queue id -- * - same as pgq.event_template -- ---------------------------------------------------------------------- create table pgq.failed_queue ( @@ -231,9 +232,7 @@ create table pgq.failed_queue ( -- all event fields like pgq.event_template, - constraint fq_pkey primary key (ev_owner, ev_id), - constraint fq_owner_fkey foreign key (ev_owner) - references pgq.subscription (sub_id) + constraint fq_pkey primary key (ev_owner, ev_id) ); alter table pgq.failed_queue alter column ev_owner set not null; alter table pgq.failed_queue alter column ev_txid drop not null; |