1.71. rebuildlistenentriesone( integer, integer )

関数特性

言語: PLPGSQL

戻り値: integer

RebuildListenEntriesOne(p_origin, p_receiver) Rebuilding of sl_listen entries for one origin, receiver pair.

declare
	p_origin		alias for $1;
	p_receiver		alias for $2;
	v_row			record;
begin
	-- 1. レシーバがオリジンからどんなセットでも購読されるのであれば
	--    同一のプロバイダ(複数可)上を監視します。
	for v_row in select distinct sub_provider
			from sl_subscribe, sl_set,
				sl_path
			where sub_set = set_id
			and set_origin = p_origin
			and sub_receiver = p_receiver
			and sub_provider = pa_server
			and sub_receiver = pa_client
	loop
		perform storeListen_int(p_origin, 
				v_row.sub_provider, p_receiver);
	end loop;
	if found then
		return 1;
	end if;

	-- 2. もしレシーバがプロバイダに直接経路を所有していれば
	--    それを使います。
	if exists (select true
			from sl_path
			where pa_server = p_origin
			and pa_client = p_receiver)
	then
		perform storeListen_int(p_origin, p_origin, p_receiver);
		return 1;
	end if;

	-- 3. レシーバに対するプロバイダもしくは、プロバイダとしてレシーバを使用している
	--    全てのノードを監視します(通常の購読ルートに従って
	--    ください)。
	for v_row in select distinct provider from (
			select sub_provider as provider
					from sl_subscribe
					where sub_receiver = p_receiver
			union
			select sub_receiver as provider
					from sl_subscribe
					where sub_provider = p_receiver
					and exists (select true from sl_path
								where pa_server = sub_receiver
								and pa_client = sub_provider)
			) as S
	loop
		perform storeListen_int(p_origin,
				v_row.provider, p_receiver);
	end loop;
	if found then
		return 1;
	end if;

	-- 4. もしも全てが失敗であれば、つまり正しい経路が私たちを導いてくれる購読が存在しない場合
	--    プロバイダとして経路を所有している全てのノードを使用します。
	--    この事は通常クラスタが構築されたか、もしくは新規ノードが追加された場合のみ起こります。
	--    この知恵の無い単純な処理(ブルートフォース)代替システムはもし全くもって可能であれば、
	--    事象の伝播を保証します。
	for v_row in select pa_server as provider
			from sl_path
			where pa_client = p_receiver
	loop
		perform storeListen_int(p_origin, 
				v_row.provider, p_receiver);
	end loop;
	if found then
		return 1;
	end if;

	return 0;
end;