pgq_node.drop_node: refuse to drop if node is our provider.
authorMarko Kreen <markokr@gmail.com>
Mon, 21 Nov 2011 10:14:04 +0000 (12:14 +0200)
committerMarko Kreen <markokr@gmail.com>
Mon, 21 Nov 2011 10:14:04 +0000 (12:14 +0200)
safety check, admin tool should have done change-provider
before dropping.

sql/pgq_node/functions/pgq_node.drop_node.sql

index a35707d5674f9a29438c05e174ecb1caf952e0b2..631e365ba87808415d7e56c2c94e790a169fc67c 100644 (file)
@@ -22,13 +22,20 @@ returns record as $$
 -- Return Codes:
 --      200 - Ok
 --      304 - No such queue
+--      406 - That is a provider
 ------------------------------------------------------------------------
 declare
     _is_local   boolean;
+    _is_prov    boolean;
 begin
-    select (node_name = i_node_name) into _is_local
-    from pgq_node.node_info
-      where queue_name = i_queue_name;
+    select (n.node_name = i_node_name),
+           (select s.provider_node = i_node_name
+              from pgq_node.local_state s
+              where s.queue_name = i_queue_name
+                and s.consumer_name = n.worker_name)
+        into _is_local, _is_prov
+        from pgq_node.node_info n
+        where n.queue_name = i_queue_name;
 
     if not found then
         select 304, 'No such queue: ' || i_queue_name into ret_code, ret_note;
@@ -53,6 +60,9 @@ begin
         delete from pgq_node.node_location
          where queue_name = i_queue_name
            and node_name <> i_node_name;
+    elsif _is_prov then
+        select 405, 'Cannot drop provider node: ' || i_node_name into ret_code, ret_note;
+        return;
     else
         perform pgq_node.unregister_subscriber(i_queue_name, i_node_name);
     end if;