prefailover(p_is_candidate integer, p_failed_node boolean)

8.81. prefailover(p_is_candidate integer, p_failed_node boolean)

Function Properties

Language: PLPGSQL

Return Type: integer

Prepare for a failover. This function is called on all candidate nodes. It blanks the paths to the failed node and then restart of all node daemons.

declare
	v_row				record;
	v_row2				record;
	v_n					int4;
begin
	-- ----
	-- Grab the central configuration lock
	-- ----
	lock table sl_config_lock;

	-- ----
	-- All consistency checks first

	if p_is_candidate then
	   -- ----
	   -- Check all sets originating on the failed node
	   -- ----
	   for v_row in select set_id
			from sl_set
			where set_origin = p_failed_node
		loop
				-- ----
				-- Check that the backup node is subscribed to all sets
				-- that originate on the failed node
				-- ----
				select into v_row2 sub_forward, sub_active
					   from sl_subscribe
					   where sub_set = v_row.set_id
					and sub_receiver = getLocalNodeId('_schemadoc');
				if not found then
				   raise exception 'Slony-I: cannot failover - node % is not subscribed to set %',
					getLocalNodeId('_schemadoc'), v_row.set_id;
				end if;

				-- ----
				-- Check that the subscription is active
				-- ----
				if not v_row2.sub_active then
				   raise exception 'Slony-I: cannot failover - subscription for set % is not active',
					v_row.set_id;
				end if;

				-- ----
				-- If there are other subscribers, the backup node needs to
				-- be a forwarder too.
				-- ----
				select into v_n count(*)
					   from sl_subscribe
					   where sub_set = v_row.set_id
					   and sub_receiver <> getLocalNodeId('_schemadoc');
				if v_n > 0 and not v_row2.sub_forward then
				raise exception 'Slony-I: cannot failover - node % is not a forwarder of set %',
					 getLocalNodeId('_schemadoc'), v_row.set_id;
				end if;
			end loop;
	end if;

	-- ----
	-- Terminate all connections of the failed node the hard way
	-- ----
	perform terminateNodeConnections(p_failed_node);

	update sl_path set pa_conninfo='<event pending>' WHERE
	   		  pa_server=p_failed_node;	
	notify "_schemadoc_Restart";
	-- ----
	-- That is it - so far.
	-- ----
	return p_failed_node;
end;