関数特性
言語: PLPGSQL
戻り値: integer
FUNCTION failoverSet_int (failed_node, backup_node, set_id) 1 つのセットに対するフェイルオーバの終了declare
p_failed_node alias for $1;
p_backup_node alias for $2;
p_set_id alias for $3;
v_row record;
v_last_sync int8;
begin
-- ----
-- 中枢構成にロックの取得
-- ----
lock table sl_config_lock;
-- ----
-- 今セットのオリジンをバックアップノードに変更します。
-- バックアップノード上で、これには全てのトリガーと障害防止の
-- 諸々を含みます。
-- ----
if p_backup_node = getLocalNodeId('_schemadoc') then
for v_row in select * from sl_table
where tab_set = p_set_id
loop
perform alterTableRestore(v_row.tab_id);
end loop;
delete from sl_setsync
where ssy_setid = p_set_id;
delete from sl_subscribe
where sub_set = p_set_id
and sub_receiver = p_backup_node;
update sl_set
set set_origin = p_backup_node
where set_id = p_set_id;
for v_row in select * from sl_table
where tab_set = p_set_id
loop
perform alterTableForReplication(v_row.tab_id);
end loop;
else
delete from sl_subscribe
where sub_set = p_set_id
and sub_receiver = p_backup_node;
update sl_set
set set_origin = p_backup_node
where set_id = p_set_id;
end if;
-- sl_listen テーブルの書き換え
perform RebuildListenEntries();
-- ----
-- 自身がセットの購読ノードの場合、setsync ステータスを
-- 新規セットオリジンを反映するように変更します。
-- ----
if exists (select true from sl_subscribe
where sub_set = p_set_id
and sub_receiver = getLocalNodeId(
'_schemadoc'))
then
delete from sl_setsync
where ssy_setid = p_set_id;
select coalesce(max(ev_seqno), 0) into v_last_sync
from sl_event
where ev_origin = p_backup_node
and ev_type = 'SYNC';
if v_last_sync > 0 then
insert into sl_setsync
(ssy_setid, ssy_origin, ssy_seqno,
ssy_minxid, ssy_maxxid, ssy_xip, ssy_action_list)
select p_set_id, p_backup_node, v_last_sync,
ev_minxid, ev_maxxid, ev_xip, NULL
from sl_event
where ev_origin = p_backup_node
and ev_seqno = v_last_sync;
else
insert into sl_setsync
(ssy_setid, ssy_origin, ssy_seqno,
ssy_minxid, ssy_maxxid, ssy_xip, ssy_action_list)
values (p_set_id, p_backup_node, '0',
'0', '0', '', NULL);
end if;
end if;
return p_failed_node;
end;