CVS User Account cvsuser
Wed Nov 10 18:16:00 PST 2004
Log Message:
-----------
Add in "draft" version of RebuildListenEntries() that generates
sl_listen entries automatically whenever sl_path and sl_subscribe
change

Modified Files:
--------------
    slony1-engine/src/backend:
        slony1_funcs.sql (r1.35 -> r1.36)

-------------- next part --------------
Index: slony1_funcs.sql
===================================================================
RCS file: /usr/local/cvsroot/slony1/slony1-engine/src/backend/slony1_funcs.sql,v
retrieving revision 1.35
retrieving revision 1.36
diff -Lsrc/backend/slony1_funcs.sql -Lsrc/backend/slony1_funcs.sql -u -w -r1.35 -r1.36
--- src/backend/slony1_funcs.sql
+++ src/backend/slony1_funcs.sql
@@ -705,6 +705,9 @@
 			set no_active = false
 			where no_id = p_no_id;
 
+	-- Rewrite sl_listen table
+	perform @NAMESPACE at .RebuildListenEntries();
+
 	return p_no_id;
 end;
 ' language plpgsql;
@@ -798,6 +801,9 @@
 	perform @NAMESPACE at .terminateNodeConnections(
 			''_ at CLUSTERNAME@_Node_'' || p_failed_node);
 
+-- Note that the following code should all become obsolete in the wake
+-- of the availability of RebuildListenEntries()...
+
 	-- ----
 	-- Let every node that listens for something on the failed node
 	-- listen for that on the backup node instead.
@@ -910,6 +916,9 @@
 		end if;
 	end loop;
 
+	-- Rewrite sl_listen table
+	perform @NAMESPACE at .RebuildListenEntries();
+
 	-- ----
 	-- Make sure the node daemon will restart
 	-- ----
@@ -1042,6 +1051,9 @@
 				where set_id = p_set_id;
 	end if;
 
+	-- Rewrite sl_listen table
+	perform @NAMESPACE at .RebuildListenEntries();
+
 	-- ----
 	-- If we are a subscriber of the set ourself, change our
 	-- setsync status to reflect the new set origin.
@@ -1206,6 +1218,9 @@
 				(p_pa_server, p_pa_client, p_pa_conninfo, p_pa_connretry);
 	end if;
 
+	-- Rewrite sl_listen table
+	perform @NAMESPACE at .RebuildListenEntries();
+
 	return 0;
 end;
 ' language plpgsql;
@@ -1263,6 +1278,10 @@
 	-- Now drop the path and create the event
 	-- ----
 	perform @NAMESPACE at .dropPath_int(p_pa_server, p_pa_client);
+
+	-- Rewrite sl_listen table
+	perform @NAMESPACE at .RebuildListenEntries();
+
 	return  @NAMESPACE at .createEvent (''_ at CLUSTERNAME@'', ''DROP_PATH'',
 			p_pa_server, p_pa_client);
 end;
@@ -1302,8 +1321,14 @@
 			and pa_client = p_pa_client;
 
 	if found then
+		-- Rewrite sl_listen table
+		perform @NAMESPACE at .RebuildListenEntries();
+
 		return 1;
 	else
+		-- Rewrite sl_listen table
+		perform @NAMESPACE at .RebuildListenEntries();
+
 		return 0;
 	end if;
 end;
@@ -1938,6 +1963,9 @@
 			where sub_set = p_set_id
 			and sub_receiver = p_new_origin;
 
+	-- Regenerate sl_listen since we revised the subscriptions
+	perform @NAMESPACE at .RebuildListenEntries();
+
 	-- ----
 	-- If we are the new or old origin, we have to
 	-- put all the tables into altered state again.
@@ -2044,6 +2072,9 @@
 	delete from @NAMESPACE at .sl_set
 			where set_id = p_set_id;
 
+	-- Regenerate sl_listen since we revised the subscriptions
+	perform @NAMESPACE at .RebuildListenEntries();
+
 	return p_set_id;
 end;
 ' language plpgsql;
@@ -3710,6 +3741,9 @@
 				p_sub_provider, p_sub_receiver);
 	end if;
 
+	-- Rewrite sl_listen table
+	perform @NAMESPACE at .RebuildListenEntries();
+
 	return p_sub_set;
 end;
 ' language plpgsql;
@@ -3789,6 +3823,9 @@
 	-- ----
 	perform @NAMESPACE at .unsubscribeSet_int(p_sub_set, p_sub_receiver);
 
+	-- Rewrite sl_listen table
+	perform @NAMESPACE at .RebuildListenEntries();
+
 	-- ----
 	-- Create the UNSUBSCRIBE_SET event
 	-- ----
@@ -3829,6 +3866,9 @@
 			where sub_set = p_sub_set
 				and sub_receiver = p_sub_receiver;
 
+	-- Rewrite sl_listen table
+	perform @NAMESPACE at .RebuildListenEntries();
+
 	return p_sub_set;
 end;
 ' language plpgsql;
@@ -3897,6 +3937,9 @@
 				false, true);
 	end if;
 
+	-- Rewrite sl_listen table
+	perform @NAMESPACE at .RebuildListenEntries();
+
 	return p_sub_set;
 end;
 ' language plpgsql;
@@ -4436,6 +4479,63 @@
 the creation of the serial column. The return an attkind according to
 that.';
 
+
+-- ----------------------------------------------------------------------
+-- FUNCTION RebuildListenEntries (provider, receiver)
+--
+--	Revises sl_listen rules based on contents of sl_path and
+--              sl_subscribe
+-- ----------------------------------------------------------------------
+create or replace function @NAMESPACE at .RebuildListenEntries()
+returns int
+as '
+declare
+	v_row			record;
+	v_row2			record;
+	v_row3			record;
+	v_origin		int4;
+	v_receiver		int4;
+	v_done			boolean;
+
+begin
+	-- 0.  Drop out listens
+	delete from @NAMESPACE at .sl_listen;
+
+	-- 1.  Add listens pointed out by subscriptions - sl_listen
+	select @NAMESPACE at .storelisten(sub_provider, sub_provider, sub_receiver)
+		from @NAMESPACE at .sl_subscribe;
+
+	-- 2.  Add direct listens pointed out in sl_path
+	select @NAMESPACE at .storelisten(pa_server, pa_server, pa_client)
+		from @NAMESPACE at .sl_path path
+		where not exists (select true from @NAMESPACE at .sl_listen listen
+					where path.pa_server = listen.li_origin and
+					      path.pa_client = listen.li_reciever);
+
+	-- 3.  Iterate 'til we can't iterate no more...
+	--     Add in indirect listens based on what's in sl_listen and sl_path
+	v_done := ''f'';
+	while not v_done loop
+		select @NAMESPACE at .storelisten(li_origin,pa_server,pa_client)
+			from @NAMESPACE at .sl_path path, @NAMESPACE at .sl_listen listen
+			where
+				li_reciever = pa_server
+				and not exists (select true from @NAMESPACE at .sl_listen listen2
+					where listen2.li_origin = listen.origin and
+					      listen2.li_reciever = path.pa_client);
+
+		
+	end loop;
+end;
+' language plpgsql;
+
+comment on function @NAMESPACE at .RebuildListenEntries() is
+'RebuildListenEntries(p_provider, p_receiver)
+
+Invoked by various subscription and path modifying functions, this
+rewrites the sl_listen entries, adding in all the ones required to
+allow communications between nodes in the Slony-I cluster.';
+
 -- ----------------------------------------------------------------------
 -- FUNCTION tableHasSerialKey (tab_fqname)
 --


More information about the Slony1-commit mailing list