From e17e1ef68c20c8704d59aa9122079e92d8ab6af1 Mon Sep 17 00:00:00 2001 From: Steve Singer Date: Thu, 17 Oct 2013 17:21:36 -0400 Subject: [PATCH] bug 322 allow CLONE PREPARE processing to deal with an earlier STORE PATH If a node sees a STORE PATH event before it sees the CLONE PREPARE that creates a node involved in that path then the CLONE PREPARE event was failing because the node was already in sl_node. Check for the existance for rows and update them instead --- src/backend/slony1_funcs.sql | 30 +++++++++++++++++++++++++----- src/slon/remote_worker.c | 4 ++-- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/src/backend/slony1_funcs.sql b/src/backend/slony1_funcs.sql index 589786e..7588f00 100644 --- a/src/backend/slony1_funcs.sql +++ b/src/backend/slony1_funcs.sql @@ -1526,24 +1526,44 @@ comment on function @NAMESPACE@.cloneNodePrepare(p_no_id int4, p_no_provider int create or replace function @NAMESPACE@.cloneNodePrepare_int (p_no_id int4, p_no_provider int4, p_no_comment text) returns int4 as $$ +declare + v_dummy int4; begin - insert into @NAMESPACE@.sl_node + select 1 into v_dummy from @NAMESPACE@.sl_node where + no_id = p_no_id; + if not found then + insert into @NAMESPACE@.sl_node (no_id, no_active, no_comment,no_failed) select p_no_id, no_active, p_no_comment,no_failed from @NAMESPACE@.sl_node where no_id = p_no_provider; - - insert into @NAMESPACE@.sl_path + else + update @NAMESPACE@.sl_node set + no_active= np.no_active + ,no_comment=np.no_comment + ,no_failed=np.no_failed + from @NAMESPACE@.sl_node np + where np.no_id=p_no_provider + and sl_node.no_id=p_no_id; + end if; + select 1 into v_dummy from @NAMESPACE@.sl_path where + pa_server=p_no_provider and pa_client=p_no_id; + if not found then + insert into @NAMESPACE@.sl_path (pa_server, pa_client, pa_conninfo, pa_connretry) select pa_server, p_no_id, '', pa_connretry from @NAMESPACE@.sl_path where pa_client = p_no_provider; - insert into @NAMESPACE@.sl_path + end if; + select 1 into v_dummy from @NAMESPACE@.sl_path where + pa_server=p_no_id and pa_client=p_no_provider; + if not found then + insert into @NAMESPACE@.sl_path (pa_server, pa_client, pa_conninfo, pa_connretry) select p_no_id, pa_client, '', pa_connretry from @NAMESPACE@.sl_path where pa_server = p_no_provider; - + end if; insert into @NAMESPACE@.sl_subscribe (sub_set, sub_provider, sub_receiver, sub_forward, sub_active) select sub_set, sub_provider, p_no_id, sub_forward, sub_active diff --git a/src/slon/remote_worker.c b/src/slon/remote_worker.c index 6f9abba..78ceb62 100644 --- a/src/slon/remote_worker.c +++ b/src/slon/remote_worker.c @@ -831,8 +831,8 @@ remoteWorkerThread_main(void *cdata) if (PQresultStatus(res) != PGRES_TUPLES_OK) { slon_log(SLON_ERROR, "remoteWorkerThread_%d error querying " - "last confirmed id for node %d in CLONE NODE\n", - node->no_id, no_id); + "last confirmed id for node %d in CLONE NODE:%s\n", + node->no_id, no_id,PQerrorMessage(local_dbconn)); slon_retry(); } if (PQntuples(res) != 0) -- 1.7.10.4