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]