pgq: clean up pgq.consumer when consumer is unregistered
authormartinko <gamato@users.sf.net>
Tue, 5 Aug 2014 12:16:41 +0000 (14:16 +0200)
committermartinko <gamato@users.sf.net>
Tue, 5 Aug 2014 12:16:41 +0000 (14:16 +0200)
The goal is to leave no "garbage" that accumulates over time.

sql/pgq/functions/pgq.register_consumer.sql
sql/pgq/functions/pgq.unregister_consumer.sql

index 55b38eada30f1e53199ed35141848605eaba93b5..9f42d9bce34401e7c2a5ba249bada4125ee29887 100644 (file)
@@ -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');
index d495c88e4ebd4b2ee4acb5a128af55e3817a6c16..eeb2524fdb32f664ccfdc53eb1186186329b52b9 100644 (file)
@@ -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;