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]