関数特性
言語: PLPGSQL
戻り値: bigint
moveSet(set_id, new_origin) セット set_id に対するオリジンがノード new_origin に移動させられるように要求する MOVE_SET 事象の生成。declare
p_set_id alias for $1;
p_new_origin alias for $2;
v_local_node_id int4;
v_set_row record;
v_sub_row record;
v_sync_seqno int8;
v_lv_row record;
begin
-- ----
-- 中枢構成にロックの取得
-- ----
lock table sl_config_lock;
-- ----
-- セットにロックが掛けられ、このロックはかなり以前に
-- 掛けられたかの検査
-- ----
v_local_node_id := getLocalNodeId('_schemadoc');
select * into v_set_row from sl_set
where set_id = p_set_id
for update;
if not found then
raise exception 'Slony-I: set % not found', p_set_id;
end if;
if v_set_row.set_origin <> v_local_node_id then
raise exception 'Slony-I: set % does not originate on local node',
p_set_id;
end if;
if v_set_row.set_locked isnull then
raise exception 'Slony-I: set % is not locked', p_set_id;
end if;
if v_set_row.set_locked > getMinXid() then
raise exception 'Slony-I: cannot move set % yet, transactions < % are still in progress',
p_set_id, v_set_row.set_locked;
end if;
-- ----
-- セットのロックの解除
-- ----
perform unlockSet(p_set_id);
-- ----
-- new_origin はセットの有効な購読ノードかの検査
-- ----
select * into v_sub_row from sl_subscribe
where sub_set = p_set_id
and sub_receiver = p_new_origin;
if not found then
raise exception 'Slony-I: set % is not subscribed by node %',
p_set_id, p_new_origin;
end if;
if not v_sub_row.sub_active then
raise exception 'Slony-I: subsctiption of node % for set % is inactive',
p_new_origin, p_set_id;
end if;
-- ----
-- 全ての再構成
-- ----
perform moveSet_int(p_set_id, v_local_node_id,
p_new_origin);
perform RebuildListenEntries();
-- ----
-- この時点でセット内の全てのテーブルにアクセス排他ロックを保留します。
-- しかし、セットを新規オリジンノードに移動し、よって
-- 行っている createEvent() はシーケンスを記録しません。
-- ----
v_sync_seqno := createEvent('_schemadoc', 'SYNC');
insert into sl_seqlog
(seql_seqid, seql_origin, seql_ev_seqno, seql_last_value)
select seq_id, v_local_node_id, v_sync_seqno, seq_last_value
from sl_seqlastvalue
where seq_set = p_set_id;
-- ----
-- 最終的に実際の事象を生成します。
-- ----
return createEvent('_schemadoc', 'MOVE_SET',
p_set_id, v_local_node_id, p_new_origin);
end;