pgq_node.drop_node: cleanup
authorMarko Kreen <markokr@gmail.com>
Fri, 18 Nov 2011 14:32:42 +0000 (16:32 +0200)
committerMarko Kreen <markokr@gmail.com>
Fri, 18 Nov 2011 14:32:42 +0000 (16:32 +0200)
- dont catch errors from pgq_node.unregister_subscriber,
  pgq.unregister_consumer is now silent.

- use pgq_node.unregister_location() to drop location, that will also
  send event on root.

- delete all state on pgq_node.subscriber_info when local node is dropped

- call pgq_node.unregister_subscriber() only when non-local node is dropped

sql/pgq_node/functions/pgq_node.drop_node.sql

index 0069f2131bfc88b0982e969f23eabf194ebd4dc7..a35707d5674f9a29438c05e174ecb1caf952e0b2 100644 (file)
@@ -35,18 +35,11 @@ begin
         return;
     end if;
 
-    begin
-        perform pgq_node.unregister_subscriber(i_queue_name, i_node_name);
-    exception
-        when others then
-            null;
-    end;
-
-    delete from pgq_node.subscriber_info
-     where queue_name = i_queue_name
-        and subscriber_node = i_node_name;
-
+    -- drop local state
     if _is_local then
+        delete from pgq_node.subscriber_info
+         where queue_name = i_queue_name;
+
         delete from pgq_node.local_state
          where queue_name = i_queue_name;
 
@@ -57,14 +50,18 @@ begin
         perform pgq.drop_queue(queue_name, true)
            from pgq.queue where queue_name = i_queue_name;
 
-        delete from pgq_node.node_location
-         where queue_name = i_queue_name;
-    else
         delete from pgq_node.node_location
          where queue_name = i_queue_name
-            and node_name = i_node_name;
+           and node_name <> i_node_name;
+    else
+        perform pgq_node.unregister_subscriber(i_queue_name, i_node_name);
     end if;
 
+    -- let the unregister_location send event if needed
+    select f.ret_code, f.ret_note
+        from pgq_node.unregister_location(i_queue_name, i_node_name)
+        into ret_code, ret_note;
+
     select 200, 'Node dropped' into ret_code, ret_note;
     return;
 end;