summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarko Kreen2009-03-18 09:07:31 +0000
committerMarko Kreen2009-03-18 10:00:24 +0000
commitab675c1bed6f8a3d8a2e0b1007f9f0adeace926d (patch)
tree9d90a29fb67b4bdd6248d4f76d16679a339716af
parentc4bed901fa88246c6b066f6a67db95785f0085e5 (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.sql4
-rw-r--r--sql/pgq/functions/pgq.event_retry_raw.sql7
-rw-r--r--sql/pgq/functions/pgq.maint_retry_events.sql5
-rw-r--r--sql/pgq/functions/pgq.unregister_consumer.sql9
-rw-r--r--sql/pgq/structure/tables.sql17
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;