From 0466144c87e5c8bf1e64c23156ce7d989d579498 Mon Sep 17 00:00:00 2001 From: martinko Date: Tue, 5 Aug 2014 14:16:41 +0200 Subject: [PATCH] pgq: clean up pgq.consumer when consumer is unregistered The goal is to leave no "garbage" that accumulates over time. --- sql/pgq/functions/pgq.register_consumer.sql | 5 +++-- sql/pgq/functions/pgq.unregister_consumer.sql | 12 +++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/sql/pgq/functions/pgq.register_consumer.sql b/sql/pgq/functions/pgq.register_consumer.sql index 55b38ead..9f42d9bc 100644 --- a/sql/pgq/functions/pgq.register_consumer.sql +++ b/sql/pgq/functions/pgq.register_consumer.sql @@ -55,7 +55,7 @@ returns integer as $$ declare tmp text; last_tick bigint; - x_queue_id integer; + x_queue_id integer; x_consumer_id integer; queue integer; sub record; @@ -68,7 +68,8 @@ begin -- get consumer and create if new select co_id into x_consumer_id from pgq.consumer - where co_name = x_consumer_name; + where co_name = x_consumer_name + for update; if not found then insert into pgq.consumer (co_name) values (x_consumer_name); x_consumer_id := currval('pgq.consumer_co_id_seq'); diff --git a/sql/pgq/functions/pgq.unregister_consumer.sql b/sql/pgq/functions/pgq.unregister_consumer.sql index d495c88e..eeb2524f 100644 --- a/sql/pgq/functions/pgq.unregister_consumer.sql +++ b/sql/pgq/functions/pgq.unregister_consumer.sql @@ -6,8 +6,8 @@ returns integer as $$ -- ---------------------------------------------------------------------- -- Function: pgq.unregister_consumer(2) -- --- Unsubscriber consumer from the queue. Also consumer's --- retry events are deleted. +-- Unsubscribe consumer from the queue. +-- Also consumer's retry events are deleted. -- -- Parameters: -- x_queue_name - Name of the queue @@ -36,7 +36,7 @@ begin and s.sub_consumer = c.co_id and q.queue_name = x_queue_name and c.co_name = x_consumer_name - for update of s; + for update of s, c; if not found then return 0; end if; @@ -51,7 +51,6 @@ begin delete from pgq.subscription where sub_id = x_sub_id and sub_consumer = _consumer_id; - return 1; else -- delete main consumer (including possible subconsumers) @@ -63,7 +62,10 @@ begin -- this will drop subconsumers too delete from pgq.subscription where sub_id = x_sub_id; - + + delete from pgq.consumer + where co_id = _consumer_id; + return _sub_id_cnt; end if; -- 2.39.5