Tue Sep 25 11:33:41 PDT 2007
- Previous message: [Slony1-commit] slony1-engine/tests/testmergeset README gen_ddl_slonik.sh gen_ddl_sql.sh gen_weak_user.sh generate_dml.sh init_add_tables.ik init_cluster.ik init_create_set.ik init_data.sql init_schema.sql init_subscribe_set.ik schema.diff settings.ik
- Next message: [Slony1-commit] slony1-engine RELEASE
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Update of /home/cvsd/slony1/slony1-engine/src/backend In directory main.slony.info:/tmp/cvs-serv20468 Modified Files: Tag: REL_1_2_STABLE slony1_funcs.sql Log Message: Backport automatic listen path generator from CVS HEAD... Tests done thus far: - I added a "testlistenpath" test to the set of tests, which is working fine - JP Fletcher did some testing of cases where he saw things break, and this change addressed those cases Index: slony1_funcs.sql =================================================================== RCS file: /home/cvsd/slony1/slony1-engine/src/backend/slony1_funcs.sql,v retrieving revision 1.98.2.23 retrieving revision 1.98.2.24 diff -C2 -d -r1.98.2.23 -r1.98.2.24 *** slony1_funcs.sql 13 Sep 2007 14:20:29 -0000 1.98.2.23 --- slony1_funcs.sql 25 Sep 2007 18:33:38 -0000 1.98.2.24 *************** *** 5138,5173 **** as ' declare ! v_receiver record ; ! v_provider record ; ! v_origin record ; ! v_reachable int4[] ; begin -- First remove the entire configuration delete from @NAMESPACE at .sl_listen; ! -- Loop over every possible pair of receiver and provider ! for v_receiver in select no_id from @NAMESPACE at .sl_node loop ! for v_provider in select pa_server as no_id from @NAMESPACE at .sl_path where pa_client = v_receiver.no_id loop ! -- Find all nodes that v_provider.no_id can receiver events from without using v_receiver.no_id ! for v_origin in select * from @NAMESPACE at .ReachableFromNode(v_provider.no_id, array[v_receiver.no_id]) as r(no_id) loop ! -- If v_receiver.no_id subscribes a set from v_provider.no_id, events have to travel the same ! -- path as the data. Ignore possible sl_listen that would break that rule. ! perform 1 from @NAMESPACE at .sl_subscribe ! join @NAMESPACE at .sl_set on sl_set.set_id = sl_subscribe.sub_set ! where ! sub_receiver = v_receiver.no_id and ! sub_provider != v_provider.no_id and ! set_origin = v_origin.no_id ; ! if not found then ! insert into @NAMESPACE at .sl_listen (li_receiver, li_provider, li_origin) ! values (v_receiver.no_id, v_provider.no_id, v_origin.no_id) ; ! end if ; ! end loop ; - end loop ; end loop ; --- 5138,5219 ---- as ' declare ! v_row record; begin -- First remove the entire configuration delete from @NAMESPACE at .sl_listen; ! -- Second populate the sl_listen configuration with a full ! -- network of all possible paths. ! insert into @NAMESPACE at .sl_listen ! (li_origin, li_provider, li_receiver) ! select pa_server, pa_server, pa_client from @NAMESPACE at .sl_path; ! while true loop ! insert into @NAMESPACE at .sl_listen ! (li_origin, li_provider, li_receiver) ! select distinct li_origin, pa_server, pa_client ! from @NAMESPACE at .sl_listen, @NAMESPACE at .sl_path ! where li_receiver = pa_server ! and li_origin <> pa_client ! except ! select li_origin, li_provider, li_receiver ! from @NAMESPACE at .sl_listen; ! if not found then ! exit; ! end if; ! end loop; ! -- We now replace specific event-origin,receiver combinations ! -- with a configuration that tries to avoid events arriving at ! -- a node before the data provider actually has the data ready. + -- Loop over every possible pair of receiver and event origin + for v_row in select N1.no_id as receiver, N2.no_id as origin + from @NAMESPACE at .sl_node as N1, @NAMESPACE at .sl_node as N2 + where N1.no_id <> N2.no_id + loop + -- 1st choice: + -- If we use the event origin as a data provider for any + -- set that originates on that very node, we are a direct + -- subscriber to that origin and listen there only. + if exists (select true from @NAMESPACE at .sl_set, @NAMESPACE at .sl_subscribe + where set_origin = v_row.origin + and sub_set = set_id + and sub_provider = v_row.origin + and sub_receiver = v_row.receiver + and sub_active) + then + delete from @NAMESPACE at .sl_listen + where li_origin = v_row.origin + and li_receiver = v_row.receiver; + insert into @NAMESPACE at .sl_listen (li_origin, li_provider, li_receiver) + values (v_row.origin, v_row.origin, v_row.receiver); + continue; + end if; ! -- 2nd choice: ! -- If we are subscribed to any set originating on this ! -- event origin, we want to listen on all data providers ! -- we use for this origin. We are a cascaded subscriber ! -- for sets from this node. ! if exists (select true from @NAMESPACE at .sl_set, @NAMESPACE at .sl_subscribe ! where set_origin = v_row.origin ! and sub_set = set_id ! and sub_receiver = v_row.receiver ! and sub_active) ! then ! delete from @NAMESPACE at .sl_listen ! where li_origin = v_row.origin ! and li_receiver = v_row.receiver; ! insert into @NAMESPACE at .sl_listen (li_origin, li_provider, li_receiver) ! select distinct set_origin, sub_provider, v_row.receiver ! from @NAMESPACE at .sl_set, @NAMESPACE at .sl_subscribe ! where set_origin = v_row.origin ! and sub_set = set_id ! and sub_receiver = v_row.receiver ! and sub_active; ! continue; ! end if; end loop ;
- Previous message: [Slony1-commit] slony1-engine/tests/testmergeset README gen_ddl_slonik.sh gen_ddl_sql.sh gen_weak_user.sh generate_dml.sh init_add_tables.ik init_cluster.ik init_create_set.ik init_data.sql init_schema.sql init_subscribe_set.ik schema.diff settings.ik
- Next message: [Slony1-commit] slony1-engine RELEASE
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Slony1-commit mailing list