Slony-I 2.2.10 Documentation | ||||
---|---|---|---|---|
Prev | Fast Backward | Chapter 8. Schema schemadoc | Fast Forward | Next |
8.66. failoverset_int(p_last_seqno integer, p_backup_node integer, p_failed_node bigint)
Function Properties
Language: PLPGSQL
Return Type: integer
FUNCTION failoverSet_int (failed_node, backup_node, set_id, wait_seqno) Finish failover for one set.declare v_row record; v_last_sync int8; v_set int4; begin -- ---- -- Grab the central configuration lock -- ---- lock table sl_config_lock; SELECT max(ev_seqno) into v_last_sync FROM sl_event where ev_origin=p_failed_node; if v_last_sync > p_last_seqno then -- this node is ahead of the last sequence number from the -- failed node that the backup node has. -- this node must unsubscribe from all sets from the origin. for v_set in select set_id from sl_set where set_origin=p_failed_node loop raise warning 'Slony is dropping the subscription of set % found sync %s bigger than %s ' , v_set, v_last_sync::text, p_last_seqno::text; perform unsubscribeSet(v_set, getLocalNodeId('_schemadoc'), true); end loop; delete from sl_event where ev_origin=p_failed_node and ev_seqno > p_last_seqno; end if; -- ---- -- Change the origin of the set now to the backup node. -- On the backup node this includes changing all the -- trigger and protection stuff for v_set in select set_id from sl_set where set_origin=p_failed_node loop -- ---- if p_backup_node = getLocalNodeId('_schemadoc') then delete from sl_setsync where ssy_setid = v_set; delete from sl_subscribe where sub_set = v_set and sub_receiver = p_backup_node; update sl_set set set_origin = p_backup_node where set_id = v_set; update sl_subscribe set sub_provider=p_backup_node FROM sl_node receive_node where sub_set = v_set and sub_provider=p_failed_node and sub_receiver=receive_node.no_id and receive_node.no_failed=false; for v_row in select * from sl_table where tab_set = v_set order by tab_id loop perform alterTableConfigureTriggers(v_row.tab_id); end loop; else raise notice 'deleting from sl_subscribe all rows with receiver %', p_backup_node; delete from sl_subscribe where sub_set = v_set and sub_receiver = p_backup_node; update sl_subscribe set sub_provider=p_backup_node FROM sl_node receive_node where sub_set = v_set and sub_provider=p_failed_node and sub_provider=p_failed_node and sub_receiver=receive_node.no_id and receive_node.no_failed=false; update sl_set set set_origin = p_backup_node where set_id = v_set; -- ---- -- If we are a subscriber of the set ourself, change our -- setsync status to reflect the new set origin. -- ---- if exists (select true from sl_subscribe where sub_set = v_set and sub_receiver = getLocalNodeId( '_schemadoc')) then delete from sl_setsync where ssy_setid = v_set; select coalesce(max(ev_seqno), 0) into v_last_sync from sl_event where ev_origin = p_backup_node and ev_type = 'SYNC'; if v_last_sync > 0 then insert into sl_setsync (ssy_setid, ssy_origin, ssy_seqno, ssy_snapshot, ssy_action_list) select v_set, p_backup_node, v_last_sync, ev_snapshot, NULL from sl_event where ev_origin = p_backup_node and ev_seqno = v_last_sync; else insert into sl_setsync (ssy_setid, ssy_origin, ssy_seqno, ssy_snapshot, ssy_action_list) values (v_set, p_backup_node, '0', '1:1:', NULL); end if; end if; end if; end loop; --If there are any subscriptions with --the failed_node being the provider then --we want to redirect those subscriptions --to come from the backup node. -- -- The backup node should be a valid -- provider for all subscriptions served -- by the failed node. (otherwise it -- wouldn't be a allowable backup node). -- delete from sl_subscribe -- where sub_receiver=p_backup_node; update sl_subscribe set sub_provider=p_backup_node from sl_node where sub_provider=p_failed_node and sl_node.no_id=sub_receiver and sl_node.no_failed=false and sub_receiver<>p_backup_node; update sl_subscribe set sub_provider=(select set_origin from sl_set where set_id= sub_set) where sub_provider=p_failed_node and sub_receiver=p_backup_node; update sl_node set no_active=false WHERE no_id=p_failed_node; -- Rewrite sl_listen table perform RebuildListenEntries(); return p_failed_node; end;