Len Walter len.walter
Sun Jan 8 20:32:23 PST 2006
G'day ,

My environment is postgres 7.4.8 / Slony 1.1.0 / RHEL4ES on x86.

I've got a three-or-four month old slony cluster which currently has a
large sl_log_1 table:
db=# select count(*) from _slony.sl_log_1;
  count
---------
 1031377
(1 row)

I've run the step at http://cbbrowne.com/info/faq.html#AEN42511 and
deleted a few old entries from sl_confirm, then waited for the cleanup
thread to purge the log table, as well as running the task manually.

The FAQ says (in the same entry) "each cleanupEvent run .... is the
event in which old data is purged from sl_log_1 and sl_seqlog".
However, I've looked at the function as installed in the slony schema
and it doesn't do that, as far as I can tell. (attached below)

Can anyone give me a pointer to finding where this task does get run?

Thanks,
Len

db=# \df+ _slony.cleanupevent

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 "_slony".sl_confirm
                                where con_origin not in (select no_id
from "_slony".sl_node);
        delete from "_slony".sl_confirm
                                where con_received not in (select
no_id from "_slony".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 "_slony".sl_confirm
                                where con_timestamp <
(CURRENT_TIMESTAMP - '10 min'::interval)
                                group by con_origin, con_received
        loop
                delete from "_slony".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 "_slony".sl_confirm
                                group by con_origin
        loop
                select coalesce(max(ev_seqno), 0) into v_max_sync
                                from "_slony".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 "_slony".sl_event
                                        where ev_origin = v_min_row.con_origin
                                        and ev_seqno < v_max_sync;
                end if;
        end loop;

        return 0;
end;
 | cleaning old data out of sl_confirm, sl_event.  Removes all but the
last sl_confirm row per (origin,receiver), and then removes all events
that are confirmed by all nodes in the whole cluster up to the last
SYNC.
(1 row)



--
Len Walter len.walter at gmail.com http://crookedtimbre.net skype:len.walter



More information about the Slony1-general mailing list