pgpool2.git / summary / log / commit / refs

commit    993c04284f422e335b8de46fd2ea76e5c1c83ae2
Author:   at.mitani <at.mitani@gmail.com>
Date:     Wed Jun 06 07:46:14 2012 +0000

    modified start watchdog without trusted server declare


pgpool.conf.sample | 4 ++++ pool_config.c | 35 +++++++++++++++++++++++++++++++++++ pool_config.h | 6 ++++-- pool_config.l | 32 ++++++++++++++++++++++++++++++++ pool_process_reporting.c | 10 ++++++++++ watchdog/watchdog.c | 22 ++++++++++++---------- watchdog/wd_ext.h | 1 + watchdog/wd_init.c | 3 ++- watchdog/wd_lifecheck.c | 43 ++++++++++++++++++++++++++++++++++++++++--- 9 files changed, 140 insertions(+), 16 deletions(-) diff --git a/pgpool.conf.sample b/pgpool.conf.sample index 0135f343d..47f942202 100644 --- a/pgpool.conf.sample +++ b/pgpool.conf.sample @@ -419,6 +419,8 @@ client_idle_limit_in_recovery = 0 #------------------------------------------------------------------------------ # WATCHDOG #------------------------------------------------------------------------------ +use_watchdog = on + # Activates watchdog trusted_servers = '' # trusted server list which are used # to confirm network connection @@ -439,6 +441,8 @@ if_down_cmd = 'ifconfig eth0:0 down' # shutdown delegate IP command wd_life_point = 3 # lifecheck retry times +wd_lifecheck_query = 'SELECT 1' + # lifecheck query to pgpool from watchdog # Other pgpool Connection Settings #other_pgpool_hostname0 = 'host0' diff --git a/pool_config.c b/pool_config.c index e88b53364..312274aaf 100644 --- a/pool_config.c +++ b/pool_config.c @@ -24,6 +24,7 @@ /* end standard C headers. */ /* flex integer type definitions */ + #ifndef FLEXINT_H #define FLEXINT_H @@ -1380,6 +1381,7 @@ static void yy_load_buffer_state (void) * such as during a yyrestart() or at EOF. */ static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) + { int oerrno = errno; @@ -1507,6 +1509,7 @@ static void yyensure_buffer_stack (void) (yy_buffer_stack_top) = 0; return; } + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ /* Increase the buffer to prepare for a possible push. */ @@ -1952,6 +1955,7 @@ int pool_init_config(void) /* * add for watchdog */ + pool_config->use_watchdog = 0; pool_config->trusted_servers = NULL; pool_config->delegate_IP = NULL; pool_config->wd_port = 9000; @@ -1962,6 +1966,7 @@ int pool_init_config(void) pool_config->if_up_cmd = "ifconfig eth0:0 inet $_IP_$ netmask 255.255.255.0"; pool_config->if_down_cmd = "ifconfig eth0:0 down"; pool_config->wd_life_point = 3; + pool_config->wd_lifecheck_query = "SELECT 1"; pool_config->memory_cache_enabled = 0; @@ -3657,6 +3662,18 @@ int pool_get_config(char *confpath, POOL_CONFIG_CONTEXT context) pool_config->other_wd->num_wd = slot+1; } } + else if (!strcmp(key, "use_watchdog") && CHECK_CONTEXT(INIT_CONFIG, context)) + { + int v = eval_logical(yytext); + + if (v < 0) + { + pool_error("pool_config: invalid value %s for %s", yytext, key); + fclose(fd); + return(-1); + } + pool_config->use_watchdog = v; + } else if (!strcmp(key, "trusted_servers") && CHECK_CONTEXT(INIT_CONFIG, context)) { char *str; @@ -3789,6 +3806,24 @@ int pool_get_config(char *confpath, POOL_CONFIG_CONTEXT context) } pool_config->wd_life_point = v; } + else if (!strcmp(key, "wd_lifecheck_query") && CHECK_CONTEXT(INIT_CONFIG, context)) + { + char *str; + + if (token != POOL_STRING && token != POOL_UNQUOTED_STRING && token != POOL_KEY) + { + PARSE_ERROR(); + fclose(fd); + return(-1); + } + str = extract_string(yytext, token); + if (str == NULL) + { + fclose(fd); + return(-1); + } + pool_config->wd_lifecheck_query = str; + } else if (!strcmp(key, "ssl") && CHECK_CONTEXT(INIT_CONFIG, context)) diff --git a/pool_config.h b/pool_config.h index e4a281c74..8bb53c0ab 100644 --- a/pool_config.h +++ b/pool_config.h @@ -217,8 +217,9 @@ typedef struct { /* * add for watchdog */ - int wd_port; /* watchdog port */ - WdDesc * other_wd; /* watchdog lists */ + int use_watchdog; /* if non 0, use watchdog */ + int wd_port; /* watchdog port */ + WdDesc * other_wd; /* watchdog lists */ char * trusted_servers; /* icmp reachable server list (A,B,C) */ char * delegate_IP; /* delegate IP address */ int wd_interval; /* lifecheck interval (sec) */ @@ -227,6 +228,7 @@ typedef struct { char * if_up_cmd; /* ifup command */ char * if_down_cmd; /* ifdown command */ int wd_life_point; /* life point (retry times at lifecheck) */ + char * wd_lifecheck_query; /* lifecheck query */ } POOL_CONFIG; typedef enum { diff --git a/pool_config.l b/pool_config.l index f039180d0..ad0abaa33 100644 --- a/pool_config.l +++ b/pool_config.l @@ -230,6 +230,7 @@ int pool_init_config(void) /* * add for watchdog */ + pool_config->use_watchdog = 0; pool_config->trusted_servers = NULL; pool_config->delegate_IP = NULL; pool_config->wd_port = 9000; @@ -240,6 +241,7 @@ int pool_init_config(void) pool_config->if_up_cmd = "ifconfig eth0:0 inet $_IP_$ netmask 255.255.255.0"; pool_config->if_down_cmd = "ifconfig eth0:0 down"; pool_config->wd_life_point = 3; + pool_config->wd_lifecheck_query = "SELECT 1"; pool_config->memory_cache_enabled = 0; @@ -1935,6 +1937,18 @@ int pool_get_config(char *confpath, POOL_CONFIG_CONTEXT context) pool_config->other_wd->num_wd = slot+1; } } + else if (!strcmp(key, "use_watchdog") && CHECK_CONTEXT(INIT_CONFIG, context)) + { + int v = eval_logical(yytext); + + if (v < 0) + { + pool_error("pool_config: invalid value %s for %s", yytext, key); + fclose(fd); + return(-1); + } + pool_config->use_watchdog = v; + } else if (!strcmp(key, "trusted_servers") && CHECK_CONTEXT(INIT_CONFIG, context)) { char *str; @@ -2067,6 +2081,24 @@ int pool_get_config(char *confpath, POOL_CONFIG_CONTEXT context) } pool_config->wd_life_point = v; } + else if (!strcmp(key, "wd_lifecheck_query") && CHECK_CONTEXT(INIT_CONFIG, context)) + { + char *str; + + if (token != POOL_STRING && token != POOL_UNQUOTED_STRING && token != POOL_KEY) + { + PARSE_ERROR(); + fclose(fd); + return(-1); + } + str = extract_string(yytext, token); + if (str == NULL) + { + fclose(fd); + return(-1); + } + pool_config->wd_lifecheck_query = str; + } else if (!strcmp(key, "ssl") && CHECK_CONTEXT(INIT_CONFIG, context)) diff --git a/pool_process_reporting.c b/pool_process_reporting.c index 0fe42f314..1ab61dc00 100644 --- a/pool_process_reporting.c +++ b/pool_process_reporting.c @@ -548,6 +548,11 @@ POOL_REPORT_CONFIG* get_config(int *nrows) /* * add for watchdog */ + strncpy(status[i].name, "use_watchdog", POOLCONFIG_MAXNAMELEN); + snprintf(status[i].value, POOLCONFIG_MAXVALLEN, "%d", pool_config->use_watchdog); + strncpy(status[i].desc, "non 0 if operating in use_watchdog", POOLCONFIG_MAXDESCLEN); + i++; + strncpy(status[i].name, "trusted_servers", POOLCONFIG_MAXNAMELEN); snprintf(status[i].value, POOLCONFIG_MAXVALLEN, "%s", pool_config->trusted_servers); strncpy(status[i].desc, "upper server list to observe connection", POOLCONFIG_MAXDESCLEN); @@ -593,6 +598,11 @@ POOL_REPORT_CONFIG* get_config(int *nrows) strncpy(status[i].desc, "retry times of life check", POOLCONFIG_MAXDESCLEN); i++; + strncpy(status[i].name, "wd_lifecheck_query", POOLCONFIG_MAXNAMELEN); + snprintf(status[i].value, POOLCONFIG_MAXVALLEN, "%s", pool_config->wd_lifecheck_query); + strncpy(status[i].desc, "lifecheck query to pgpool from watchdog", POOLCONFIG_MAXDESCLEN); + i++; + /* * end of watchdog */ diff --git a/watchdog/watchdog.c b/watchdog/watchdog.c index b7d0dc266..61c955a87 100644 --- a/watchdog/watchdog.c +++ b/watchdog/watchdog.c @@ -82,19 +82,11 @@ wd_check_config(void) { int status = WD_OK; if ((pool_config->other_wd->num_wd == 0) || - (pool_config->trusted_servers == NULL) || - (pool_config->delegate_IP == NULL)) + (pool_config->delegate_IP == NULL) || + (strlen(pool_config->delegate_IP) == 0)) { status = WD_NG; } - else - { - if ((strlen(pool_config->trusted_servers) == 0) || - (strlen(pool_config->delegate_IP) == 0)) - { - status = WD_NG; - } - } return status; } @@ -106,6 +98,10 @@ wd_main(int fork_wait_time) pid_t pgid = 0; pid_t pid = 0; + if (!pool_config->use_watchdog) + { + return WD_NG; + } /* check pool_config data */ status = wd_check_config(); if (status != WD_OK) @@ -149,6 +145,12 @@ wd_main(int fork_wait_time) sleep(fork_wait_time); } + /* wait until ready to go */ + while (WD_OK != is_wd_lifecheck_ready()) + { + sleep(pool_config->wd_interval * 10); + } + /* watchdog loop */ for (;;) { diff --git a/watchdog/wd_ext.h b/watchdog/wd_ext.h index e470b7b7e..9b1d74a0e 100644 --- a/watchdog/wd_ext.h +++ b/watchdog/wd_ext.h @@ -68,6 +68,7 @@ extern int wd_IP_up(void); extern int wd_IP_down(void); /* wd_lifecheck.c */ +extern int is_wd_lifecheck_ready(void); extern int wd_lifecheck(void); #endif /* WD_EXT_H */ diff --git a/watchdog/wd_init.c b/watchdog/wd_init.c index d40afe4b1..50ed1f9ff 100644 --- a/watchdog/wd_init.c +++ b/watchdog/wd_init.c @@ -70,7 +70,8 @@ wd_init(void) wd_add_wd_list(pool_config->other_wd); /* check upper connection */ - if (wd_is_upper_ok(pool_config->trusted_servers) != WD_OK) + if ((pool_config->trusted_servers != NULL) && + (wd_is_upper_ok(pool_config->trusted_servers) != WD_OK)) { pool_error("failed to connect trusted server"); return WD_NG; diff --git a/watchdog/wd_lifecheck.c b/watchdog/wd_lifecheck.c index 3afb24c30..ff7181694 100644 --- a/watchdog/wd_lifecheck.c +++ b/watchdog/wd_lifecheck.c @@ -37,11 +37,47 @@ #include "libpq-fe.h" +int is_wd_lifecheck_ready(void); int wd_lifecheck(void); static void * ping_pgpool(void * arg); static PGconn * create_conn(char * hostname, int port); static int pgpool_down(WdInfo * pool); +int +is_wd_lifecheck_ready(void) +{ + PGconn * conn = NULL; + PGresult * res = (PGresult *)NULL; + int status = WD_OK; + WdInfo * p = WD_List; + while (p->status != WD_END) + { + conn = create_conn(p->hostname, p->pgpool_port); + if (conn != NULL) + { + res = PQexec(conn, pool_config->wd_lifecheck_query ); + + status = PQresultStatus(res); + if (res != NULL) + { + PQclear(res); + } + if ((status == PGRES_NONFATAL_ERROR )|| + (status == PGRES_FATAL_ERROR )) + { + status = WD_NG; + } + PQfinish(conn); + } + else + { + status = WD_NG; + } + p ++; + } + return status; +} + int wd_lifecheck(void) { @@ -57,7 +93,8 @@ wd_lifecheck(void) gettimeofday(&tv, NULL); /* check upper connection */ - if (wd_is_upper_ok(pool_config->trusted_servers) != WD_OK) + if ((pool_config->trusted_servers != NULL) && + (wd_is_upper_ok(pool_config->trusted_servers) != WD_OK)) { pool_error("failed to connect trusted server"); /* This server connection may be downwd */ @@ -83,7 +120,7 @@ wd_lifecheck(void) cnt ++; if (cnt >= MAX_WATCHDOG_NUM) { - pool_error("trusted server num is out of range(%d)",cnt); + pool_error("pgpool num is out of range(%d)",cnt); break; } } @@ -152,7 +189,7 @@ ping_pgpool(void * arg) thread_arg = (WdPgpoolThreadArg *)arg; conn = thread_arg->conn; - res = PQexec(conn, "SELECT 1" ); + res = PQexec(conn, pool_config->wd_lifecheck_query ); status = PQresultStatus(res); if (res != NULL) [parent: 07bc0173ad43]