check_unconfirmed_log()

Slony-I 2.2.10 Documentation
Prev | Fast Backward | Chapter 8. Schema schemadoc | Fast Forward | Next

# 8.32. check_unconfirmed_log()

Function Properties

Language: PLPGSQL

Return Type: boolean

    declare
    	v_rc		bool = false;
    	v_error		bool = false;
    	v_origin	integer;
    	v_allconf	bigint;
    	v_allsnap	txid_snapshot;
    	v_count		bigint;
    begin
    	--
    	-- Loop over all nodes that are the origin of at least one set
    	--
    	for v_origin in select distinct set_origin as no_id
    			from sl_set loop
    		--
    		-- Per origin determine which is the highest event seqno
    		-- that is confirmed by all subscribers to any of the
    		-- origins sets.
    		--
    		select into v_allconf min(max_seqno) from (
    				select con_received, max(con_seqno) as max_seqno
    					from sl_confirm
    					where con_origin = v_origin
    					and con_received in (
    						select distinct sub_receiver
    							from sl_set as SET,
    								sl_subscribe as SUB
    							where SET.set_id = SUB.sub_set
    							and SET.set_origin = v_origin
    						)
    					group by con_received
    			) as maxconfirmed;
    		if not found then
    			raise NOTICE 'check_unconfirmed_log(): cannot determine highest ev_seqno for node % confirmed by all subscribers', v_origin;
    			v_error = true;
    			continue;
    		end if;

    		--
    		-- Get the txid snapshot that corresponds with that event
    		--
    		select into v_allsnap ev_snapshot
    			from sl_event
    			where ev_origin = v_origin
    			and ev_seqno = v_allconf;
    		if not found then
    			raise NOTICE 'check_unconfirmed_log(): cannot find event %,% in sl_event', v_origin, v_allconf;
    			v_error = true;
    			continue;
    		end if;

    		--
    		-- Count the number of log rows that appeard after that event.
    		--
    		select into v_count count(*) from (
    			select 1 from sl_log_1
    				where log_origin = v_origin
    				and log_txid >= "pg_catalog".txid_snapshot_xmax(v_allsnap)
    			union all
    			select 1 from sl_log_1
    				where log_origin = v_origin
    				and log_txid in (
    					select * from "pg_catalog".txid_snapshot_xip(v_allsnap)
    				)
    			union all
    			select 1 from sl_log_2
    				where log_origin = v_origin
    				and log_txid >= "pg_catalog".txid_snapshot_xmax(v_allsnap)
    			union all
    			select 1 from sl_log_2
    				where log_origin = v_origin
    				and log_txid in (
    					select * from "pg_catalog".txid_snapshot_xip(v_allsnap)
    				)
    		) as cnt;

    		if v_count > 0 then
    			raise NOTICE 'check_unconfirmed_log(): origin % has % log rows that have not propagated to all subscribers yet', v_origin, v_count;
    			v_rc = true;
    		end if;
    	end loop;

    	if v_error then
    		raise EXCEPTION 'check_unconfirmed_log(): aborting due to previous inconsistency';
    	end if;

    	return v_rc;
    end;

Prev | Home | Next
check_table_field_exists(p_field text, p_table text, p_namespace text) | Up | checkmoduleversion()