1.27.  cleanupevent( )

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

Nettoie les anciennes données de sl_confirm, sl_event. Supprime tout sauf la dernière ligne par (origine, abonné), puis supprime tous les événements qui sont confirmés par tous les nœuds du clusyer jusqu'au dernier SYNC.

declare
        v_max_row       record;
        v_min_row       record;
        v_max_sync      int8;
begin
        -- ----
        -- First remove all but the oldest confirm row per origin,receiver pair
        -- ----
        delete from sl_confirm
                                where con_origin not in (select no_id from sl_node);
        delete from sl_confirm
                                where con_received not in (select no_id from sl_node);
        -- ----
        -- Next remove all but the oldest confirm row per origin,receiver pair.
        -- Ignore confirmations that are younger than 10 minutes. We currently
        -- have an not confirmed suspicion that a possibly lost transaction due
        -- to a server crash might have been visible to another session, and
        -- that this led to log data that is needed again got removed.
        -- ----
        for v_max_row in select con_origin, con_received, max(con_seqno) as con_seqno
                                from sl_confirm
                                where con_timestamp < (CURRENT_TIMESTAMP - '10 min'::interval)
                                group by con_origin, con_received
        loop
                delete from sl_confirm
                                where con_origin = v_max_row.con_origin
                                and con_received = v_max_row.con_received
                                and con_seqno < v_max_row.con_seqno;
        end loop;

        -- ----
        -- Then remove all events that are confirmed by all nodes in the
        -- whole cluster up to the last SYNC
        -- ----
        for v_min_row in select con_origin, min(con_seqno) as con_seqno
                                from sl_confirm
                                group by con_origin
        loop
                select coalesce(max(ev_seqno), 0) into v_max_sync
                                from sl_event
                                where ev_origin = v_min_row.con_origin
                                and ev_seqno <= v_min_row.con_seqno
                                and ev_type = 'SYNC';
                if v_max_sync > 0 then
                        delete from sl_event
                                        where ev_origin = v_min_row.con_origin
                                        and ev_seqno < v_max_sync;
                end if;
        end loop;

        -- ----
        -- If cluster has only one node, then remove all events up to
        -- the last SYNC - Bug #1538
        -- http://gborg.postgresql.org/project/slony1/bugs/bugupdate.php?1538
        -- ----

        select * into v_min_row from sl_node where
                        no_id <> getLocalNodeId('_schemadoc') limit 1;
        if not found then
                select ev_origin, ev_seqno into v_min_row from sl_event
                where ev_origin = getLocalNodeId('_schemadoc')
                order by ev_origin desc, ev_seqno desc limit 1;
                raise notice 'Slony-I: cleanupEvent(): Single node - deleting events < %', v_min_row.ev_seqno;
                        delete from sl_event
                        where
                                ev_origin = v_min_row.ev_origin and
                                ev_seqno < v_min_row.ev_seqno;

        end if;

        if exists (select * from "pg_catalog".pg_class c, "pg_catalog".pg_namespace n, "pg_catalog".pg_attribute a where c.relname = 'sl_seqlog' and n.oid = c.relnamespace and a.attrelid = c.oid and a.attname = 'oid') then
                execute 'alter table sl_seqlog set without oids;';
        end if;         
        -- ----
        -- Also remove stale entries from the nodelock table.
        -- ----
        perform cleanupNodelock();

        return 0;
end;