関数特性
言語: 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;