pgpool2.git / summary / log / commit / refs
commit bf0bed7cf8c0eaa598ff0cd840f1f7a96ce5b578
Author: Yoshiyuki Asaba <y-asaba at pgfoundry.org>
Date: Tue Mar 11 02:54:13 2008 +0000
* Add '%M'format to obtain old master node ID into failover_command
and failback_command.
* When master node was down, killed all children process during
executing failover_command.
* Fixed SIGSEGV if backend0 was undefined.
doc/pgpool-en.html | 5 ++++-
doc/pgpool-ja.html | 5 ++++-
main.c | 35 +++++++++++++++++++++++++++++------
3 files changed, 37 insertions(+), 8 deletions(-)
diff --git a/doc/pgpool-en.html b/doc/pgpool-en.html
index 6fb90ef8f..9fdb05637 100644
--- a/doc/pgpool-en.html
+++ b/doc/pgpool-en.html
@@ -484,7 +484,8 @@ pgpool-II replaces special characters to backend information.
<tr><td>%p</td><td>Port number of a detached node.</td></tr>
<tr><td>%D</td><td>Database cluster directory of a detached node.
</td></tr>
-<tr><td>%m</td><td>Master node ID.</td></tr>
+<tr><td>%M</td><td>Old master node ID.</td></tr>
+<tr><td>%m</td><td>New master node ID.</td></tr>
<tr><td>%%</td><td>'%' character</td></tr>
</table>
</center>
@@ -505,6 +506,8 @@ pgpool-II replaces special characters to backend information.
<tr><td>%p</td><td>Port number of an attached node.</td></tr>
<tr><td>%D</td><td>Database cluster path of an attached node.
</td></tr>
+<tr><td>%M</td><td>Old master node</td></tr>
+<tr><td>%m</td><td>New master node</td></tr>
<tr><td>%%</td><td>'%' character</td></tr>
</table>
</center>
diff --git a/doc/pgpool-ja.html b/doc/pgpool-ja.html
index cc249c00e..fb47747fe 100644
--- a/doc/pgpool-ja.html
+++ b/doc/pgpool-ja.html
@@ -491,7 +491,8 @@ prefork$B$9$k(Bpgpool-II$B$N%5!<%P%W%m%;%9$N?t$G$9!%%G%U%)%k%HCM$O(B32$B$K$
<tr><td>%p</td><td>$B@Z$jN%$5$l$?%N!<%I$N%]!<%HHV9f(B</td></tr>
<tr><td>%D</td><td>$B@Z$jN%$5$l$?%N!<%I$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B
</td></tr>
-<tr><td>%m</td><td>$B%^%9%?!<$N%N!<%IHV9f(B</td></tr>
+<tr><td>%M</td><td>$B8E$$%^%9%?!<$N%N!<%IHV9f(B</td></tr>
+<tr><td>%m</td><td>$B?7$7$$%^%9%?!<$N%N!<%IHV9f(B</td></tr>
<tr><td>%%</td><td>'%'$BJ8;z(B</td></tr>
</table>
</center>
@@ -512,6 +513,8 @@ pgpool $B$,I,MW$J>pJs$KCV$-49$($F%3%^%s%I$r<B9T$7$^$9!#(B
<tr><td>%p</td><td>$BI|5"$7$?%N!<%I$N%]!<%HHV9f(B</td></tr>
<tr><td>%D</td><td>$BI|5"$7$?%N!<%I$N%G!<%?%Y!<%9%/%i%9%?%Q%9(B
</td></tr>
+<tr><td>%M</td><td>$B8E$$%^%9%?!<$N%N!<%IHV9f(B</td></tr>
+<tr><td>%m</td><td>$B?7$7$$%^%9%?!<$N%N!<%IHV9f(B</td></tr>
<tr><td>%%</td><td>'%'$BJ8;z(B</td></tr>
</table>
</center>
diff --git a/main.c b/main.c
index 9647c90c0..fe6d4458b 100644
--- a/main.c
+++ b/main.c
@@ -411,7 +411,7 @@ int main(int argc, char **argv)
/* initialize Req_info */
Req_info->kind = NODE_UP_REQUEST;
memset(Req_info->node_id, -1, sizeof(int) * MAX_NUM_BACKENDS);
- Req_info->master_node_id = 0;
+ Req_info->master_node_id = get_next_master_node();
Req_info->conn_counter = 0;
InRecovery = pool_shared_memory_create(sizeof(int));
@@ -1097,9 +1097,12 @@ static void failover(void)
int i;
int node_id;
int new_master;
+ int nodes[MAX_NUM_BACKENDS];
pool_debug("failover_handler called");
+ memset(nodes, 0, sizeof(int) * MAX_NUM_BACKENDS);
+
/*
* this could happen in a child process if a signal has been sent
* before resetting signal handler
@@ -1185,7 +1188,8 @@ static void failover(void)
BACKEND_INFO(Req_info->node_id[i]).backend_status = CON_DOWN; /* set down status */
- trigger_failover_command(Req_info->node_id[i], pool_config->failover_command);
+ /* save down node */
+ nodes[Req_info->node_id[i]] = 1;
cnt++;
}
}
@@ -1224,15 +1228,19 @@ static void failover(void)
BACKEND_INFO(node_id).backend_port);
}
+ /* exec failover_command */
+ for (i = 0; i < pool_config->backend_desc->num_backends; i++)
+ {
+ if (nodes[i])
+ trigger_failover_command(i, pool_config->failover_command);
+ }
+
pool_semaphore_unlock(REQUEST_INFO_SEM);
switching = 0;
kill(pcp_pid, SIGUSR2);
switching = 0;
return;
}
-
- pool_log("failover_handler: set new master node: %d", new_master);
- Req_info->master_node_id = new_master;
}
/* kill all children */
@@ -1246,6 +1254,16 @@ static void failover(void)
}
}
+ /* exec failover_command */
+ for (i = 0; i < pool_config->backend_desc->num_backends; i++)
+ {
+ if (nodes[i])
+ trigger_failover_command(i, pool_config->failover_command);
+ }
+
+ pool_log("failover_handler: set new master node: %d", new_master);
+ Req_info->master_node_id = new_master;
+
/* no need to wait since it will be done in reap_handler */
#ifdef NOT_USED
while (wait(NULL) > 0)
@@ -1774,11 +1792,16 @@ static int trigger_failover_command(int node, const char *command_line)
string_append_char(exec_cmd, info->backend_hostname);
break;
- case 'm': /* master node id */
+ case 'm': /* new master node id */
snprintf(port_buf, sizeof(port_buf), "%d", get_next_master_node());
string_append_char(exec_cmd, port_buf);
break;
+ case 'M': /* old master node id */
+ snprintf(port_buf, sizeof(port_buf), "%d", MASTER_NODE_ID);
+ string_append_char(exec_cmd, port_buf);
+ break;
+
case '%': /* escape */
string_append_char(exec_cmd, "%");
break;
[parent: ce378e0fc2e4]