Tue Jun 29 06:00:31 PDT 2010
- Previous message: [Slony1-patches] log shipping patches
- Next message: [Slony1-patches] fix for bug #120
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Check the no_active column in the database when adding the
node structure in memory. This will allow slon to create
a remoteWorkerThread when a node is being added.
---
src/slon/local_listen.c | 6 +++---
src/slon/remote_worker.c | 8 +++++---
src/slon/runtime_config.c | 41 +++++++++++++++++++++++++++++++++++------
src/slon/slon.c | 4 ++--
src/slon/slon.h | 4 ++--
5 files changed, 47 insertions(+), 16 deletions(-)
diff --git a/src/slon/local_listen.c b/src/slon/local_listen.c
index e10efe7..8ea126b 100644
--- a/src/slon/local_listen.c
+++ b/src/slon/local_listen.c
@@ -229,7 +229,7 @@ localListenThread_main(/* @unused@ */ void *dummy)
no_comment = PQgetvalue(res, tupno, 7);
if (no_id != rtcfg_nodeid)
- rtcfg_storeNode(no_id, no_comment);
+ rtcfg_storeNode(no_id, no_comment,dbconn);
rtcfg_reloadListen(dbconn);
}
@@ -295,7 +295,7 @@ localListenThread_main(/* @unused@ */ void *dummy)
no_provider = (int)strtol(PQgetvalue(res, tupno, 7), NULL, 10);
no_comment = PQgetvalue(res, tupno, 8);
- rtcfg_storeNode(no_id, no_comment);
+ rtcfg_storeNode(no_id, no_comment,dbconn);
}
else if (strcmp(ev_type, "STORE_PATH") == 0)
{
@@ -313,7 +313,7 @@ localListenThread_main(/* @unused@ */ void *dummy)
pa_connretry = (int)strtol(PQgetvalue(res, tupno, 9), NULL, 10);
if (pa_client == rtcfg_nodeid)
- rtcfg_storePath(pa_server, pa_conninfo, pa_connretry);
+ rtcfg_storePath(pa_server, pa_conninfo, pa_connretry,dbconn);
rtcfg_reloadListen(dbconn);
}
diff --git a/src/slon/remote_worker.c b/src/slon/remote_worker.c
index a3d58e5..1761487 100644
--- a/src/slon/remote_worker.c
+++ b/src/slon/remote_worker.c
@@ -753,7 +753,7 @@ remoteWorkerThread_main(void *cdata)
char *no_comment = event->ev_data2;
if (no_id != rtcfg_nodeid)
- rtcfg_storeNode(no_id, no_comment);
+ rtcfg_storeNode(no_id, no_comment,local_dbconn);
slon_appendquery(&query1,
"select %s.storeNode_int(%d, '%q'); ",
@@ -831,12 +831,14 @@ remoteWorkerThread_main(void *cdata)
int no_provider = (int) strtol(event->ev_data2, NULL, 10);
char *no_comment = event->ev_data3;
- rtcfg_storeNode(no_id, no_comment);
slon_appendquery(&query1,
"select %s.cloneNodePrepare_int(%d, %d, '%q'); ",
rtcfg_namespace,
no_id, no_provider, no_comment);
+ query_execute(node,local_dbconn,&query1);
+ dstring_reset(&query1);
+ rtcfg_storeNode(no_id, no_comment,local_dbconn);
}
else if (strcmp(event->ev_type, "STORE_PATH") == 0)
{
@@ -846,7 +848,7 @@ remoteWorkerThread_main(void *cdata)
int pa_connretry = (int) strtol(event->ev_data4, NULL, 10);
if (pa_client == rtcfg_nodeid)
- rtcfg_storePath(pa_server, pa_conninfo, pa_connretry);
+ rtcfg_storePath(pa_server, pa_conninfo, pa_connretry,local_dbconn);
slon_appendquery(&query1,
"select %s.storePath_int(%d, %d, '%q', %d); ",
diff --git a/src/slon/runtime_config.c b/src/slon/runtime_config.c
index cfdb5c1..c046f97 100644
--- a/src/slon/runtime_config.c
+++ b/src/slon/runtime_config.c
@@ -104,9 +104,11 @@ rtcfg_unlock(void)
* ----------
*/
void
-rtcfg_storeNode(int no_id, char *no_comment)
+rtcfg_storeNode(int no_id, char *no_comment,PGconn * dbconn)
{
SlonNode *node;
+ SlonDString query;
+ PGresult *res;
rtcfg_lock();
@@ -134,6 +136,7 @@ rtcfg_storeNode(int no_id, char *no_comment)
"storeNode: no_id=%d no_comment='%s'\n",
no_id, no_comment);
+
node = (SlonNode *) malloc(sizeof(SlonNode));
if (node == NULL)
{
@@ -145,6 +148,35 @@ rtcfg_storeNode(int no_id, char *no_comment)
node->no_id = no_id;
node->no_active = false;
node->no_comment = strdup(no_comment);
+
+ if(dbconn != NULL)
+ {
+ /**
+ * Get the active status of the node from sl_node.
+ * dbconn can be NULL if the caller knows that
+ * no node entry exists yet.
+ */
+ dstring_init(&query);
+ slon_mkquery(&query,"select no_active from %s.sl_node where"
+ " no_id=%d",rtcfg_namespace,no_id);
+ res = PQexec(dbconn,dstring_data(&query));
+
+ if(PQresultStatus(res) != PGRES_TUPLES_OK)
+ {
+ slon_log(SLON_FATAL,"Cannot get no_active from sl_node - no_id=%d",
+ no_id);
+ PQclear(res);
+ dstring_free(&query);
+ slon_retry();
+ }
+ if(PQntuples(res) > 0)
+ {
+ node->no_active=(*PQgetvalue(res, 0, 0) == 't') ? 1 : 0;
+ }
+ PQclear(res);
+ dstring_free(&query);
+ }/*dbconn*/
+
pthread_mutex_init(&(node->message_lock), NULL);
pthread_cond_init(&(node->message_cond), NULL);
@@ -318,7 +350,7 @@ rtcfg_findNode(int no_id)
* ----------
*/
void
-rtcfg_storePath(int pa_server, char *pa_conninfo, int pa_connretry)
+rtcfg_storePath(int pa_server, char *pa_conninfo, int pa_connretry,PGconn * dbconn)
{
SlonNode *node;
@@ -332,7 +364,7 @@ rtcfg_storePath(int pa_server, char *pa_conninfo, int pa_connretry)
slon_log(SLON_WARN,
"storePath: unknown node ID %d - event pending\n", pa_server);
- rtcfg_storeNode(pa_server, "<event pending>");
+ rtcfg_storeNode(pa_server, "<event pending>",dbconn);
rtcfg_lock();
node = rtcfg_findNode(pa_server);
@@ -468,11 +500,9 @@ rtcfg_reloadListen(PGconn *db)
{
int li_origin = (int)strtol(PQgetvalue(res, i, 0), NULL, 10);
int li_provider = (int)strtol(PQgetvalue(res, i, 1), NULL, 10);
-
rtcfg_storeListen(li_origin, li_provider);
}
PQclear(res);
-
dstring_free(&query);
for (node = rtcfg_node_list_head; node; node = node->next)
@@ -915,7 +945,6 @@ rtcfg_startStopNodeThread(SlonNode * node)
int need_wakeup = false;
rtcfg_lock();
-
if (sched_get_status() == SCHED_STATUS_OK && node->no_active)
{
/*
diff --git a/src/slon/slon.c b/src/slon/slon.c
index 7d11126..61c6c39 100644
--- a/src/slon/slon.c
+++ b/src/slon/slon.c
@@ -532,7 +532,7 @@ SlonMain(void)
* Add a remote node
*/
slon_scanint64(PQgetvalue(res, i, 3), &last_event);
- rtcfg_storeNode(no_id, no_comment);
+ rtcfg_storeNode(no_id, no_comment,NULL);
rtcfg_setNodeLastEvent(no_id, last_event);
/*
@@ -567,7 +567,7 @@ SlonMain(void)
char *pa_conninfo = PQgetvalue(res, i, 1);
int pa_connretry = (int)strtol(PQgetvalue(res, i, 2), NULL, 10);
- rtcfg_storePath(pa_server, pa_conninfo, pa_connretry);
+ rtcfg_storePath(pa_server, pa_conninfo, pa_connretry,NULL);
}
PQclear(res);
diff --git a/src/slon/slon.h b/src/slon/slon.h
index b6e509a..b7f4323 100644
--- a/src/slon/slon.h
+++ b/src/slon/slon.h
@@ -428,7 +428,7 @@ extern pthread_cond_t slon_wait_listen_cond;
extern void rtcfg_lock(void);
extern void rtcfg_unlock(void);
-extern void rtcfg_storeNode(int no_id, char *no_comment);
+extern void rtcfg_storeNode(int no_id, char *no_comment,PGconn * dbconn);
extern void rtcfg_enableNode(int no_id);
extern void rtcfg_disableNode(int no_id);
extern SlonNode *rtcfg_findNode(int no_id);
@@ -436,7 +436,7 @@ extern int64 rtcfg_setNodeLastEvent(int no_id, int64 event_seq);
extern int64 rtcfg_getNodeLastEvent(int no_id);
extern void rtcfg_storePath(int pa_server, char *pa_conninfo,
- int pa_connretry);
+ int pa_connretry,PGconn * dbconn);
extern void rtcfg_dropPath(int pa_server);
extern void rtcfg_reloadListen(PGconn *db);
--
1.6.3.3
--------------050007080808000208000800--
- Previous message: [Slony1-patches] log shipping patches
- Next message: [Slony1-patches] fix for bug #120
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Slony1-patches mailing list