1.64.  failoverset_int( integer, integer, integer )

Propriétés de la fonction
Langage: PLPGSQL
Type du code retour: integer

Termine la bascule pour un ensemble.

declare
        p_failed_node           alias for $1;
        p_backup_node           alias for $2;
        p_set_id                        alias for $3;
        v_row                           record;
        v_last_sync                     int8;
begin
        -- ----
        -- Grab the central configuration lock
        -- ----
        lock table sl_config_lock;

        -- ----
        -- Change the origin of the set now to the backup node.
        -- On the backup node this includes changing all the
        -- trigger and protection stuff
        -- ----
        if p_backup_node = getLocalNodeId('_schemadoc') then
                for v_row in select * from sl_table
                                where tab_set = p_set_id
                loop
                        perform alterTableRestore(v_row.tab_id);
                end loop;

                delete from sl_setsync
                                where ssy_setid = p_set_id;
                delete from sl_subscribe
                                where sub_set = p_set_id
                                        and sub_receiver = p_backup_node;
                update sl_set
                                set set_origin = p_backup_node
                                where set_id = p_set_id;

                for v_row in select * from sl_table
                                where tab_set = p_set_id
                loop
                        perform alterTableForReplication(v_row.tab_id);
                end loop;
                insert into sl_event
                                (ev_origin, ev_seqno, ev_timestamp,
                                ev_minxid, ev_maxxid, ev_xip,
                                ev_type, ev_data1, ev_data2, ev_data3)
                                values
                                (p_backup_node, "pg_catalog".nextval('sl_event_seq'), CURRENT_TIMESTAMP,
                                '0', '0', '',
                                'ACCEPT_SET', p_set_id::text,
                                p_failed_node::text, p_backup_node::text);
        else
                delete from sl_subscribe
                                where sub_set = p_set_id
                                        and sub_receiver = p_backup_node;
                update sl_set
                                set set_origin = p_backup_node
                                where set_id = p_set_id;
        end if;

        -- Rewrite sl_listen table
        perform RebuildListenEntries();

        -- ----
        -- 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 = p_set_id
                                and sub_receiver = getLocalNodeId(
                                                '_schemadoc'))
        then
                delete from sl_setsync
                                where ssy_setid = p_set_id;

                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_minxid, ssy_maxxid, ssy_xip, ssy_action_list)
                                        select p_set_id, p_backup_node, v_last_sync,
                                        ev_minxid, ev_maxxid, ev_xip, 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_minxid, ssy_maxxid, ssy_xip, ssy_action_list)
                                        values (p_set_id, p_backup_node, '0',
                                        '0', '0', '', NULL);
                end if;
                                
        end if;

        return p_failed_node;
end;