diff options
-rw-r--r-- | include/zbxdb.h | 6 | ||||
-rw-r--r-- | src/libs/zbxdb/db.c | 57 | ||||
-rw-r--r-- | src/libs/zbxdbhigh/db.c | 46 | ||||
-rw-r--r-- | src/zabbix_server/server.c | 2 | ||||
-rw-r--r-- | src/zabbix_server/watchdog/watchdog.c | 17 |
5 files changed, 72 insertions, 56 deletions
diff --git a/include/zbxdb.h b/include/zbxdb.h index 1eb3831d..48bf1c2a 100644 --- a/include/zbxdb.h +++ b/include/zbxdb.h @@ -24,9 +24,9 @@ #include "config.h" #include "common.h" -#define ZBX_DB_OK 0 -#define ZBX_DB_FAIL 1 -#define ZBX_DB_DOWN 2 +#define ZBX_DB_OK (0) +#define ZBX_DB_FAIL (-1) +#define ZBX_DB_DOWN (-2) #ifdef HAVE_MYSQL # include "mysql.h" diff --git a/src/libs/zbxdb/db.c b/src/libs/zbxdb/db.c index 4d26e252..6e8afb01 100644 --- a/src/libs/zbxdb/db.c +++ b/src/libs/zbxdb/db.c @@ -88,7 +88,8 @@ int zbx_db_connect(char *host, char *user, char *password, char *dbname, char *d if( ! mysql_real_connect( &mysql, host, user, password, dbname, port, dbsocket,0 ) ) { - zabbix_log(LOG_LEVEL_ERR, "Failed to connect to database: Error: %s",mysql_error(&mysql) ); + zabbix_log(LOG_LEVEL_ERR, "Failed to connect to database: Error: %s [%d]", + mysql_error(&mysql), mysql_errno(&mysql)); ret = ZBX_DB_FAIL; } @@ -96,7 +97,8 @@ int zbx_db_connect(char *host, char *user, char *password, char *dbname, char *d { if( mysql_select_db( &mysql, dbname ) != 0 ) { - zabbix_log(LOG_LEVEL_ERR, "Failed to select database: Error: %s",mysql_error(&mysql) ); + zabbix_log(LOG_LEVEL_ERR, "Failed to select database: Error: %s [%d]", + mysql_error(&mysql), mysql_errno(&mysql)); ret = ZBX_DB_FAIL; } } @@ -105,16 +107,21 @@ int zbx_db_connect(char *host, char *user, char *password, char *dbname, char *d { if(mysql_autocommit(&mysql, 1) != 0) { - zabbix_log(LOG_LEVEL_ERR, "Failed to set autocommit to 1: Error: %s",mysql_error(&mysql)); + zabbix_log(LOG_LEVEL_ERR, "Failed to set autocommit to 1: Error: %s [%d]", + mysql_error(&mysql), mysql_errno(&mysql)); ret = ZBX_DB_FAIL; } } if(ZBX_DB_FAIL == ret) { - if(mysql_errno(&mysql) == CR_SERVER_GONE_ERROR) - { - ret = ZBX_DB_DOWN; + switch(mysql_errno(&mysql)) { + case CR_SERVER_GONE_ERROR: + case CR_CONNECTION_ERROR: + ret = ZBX_DB_DOWN; + break; + default: + break; } } @@ -322,7 +329,7 @@ void zbx_db_rollback(void) int zbx_db_vexecute(const char *fmt, va_list args) { char *sql = NULL; - int ret = SUCCEED; + int ret = ZBX_DB_OK; struct timeval tv; suseconds_t msec; @@ -341,14 +348,14 @@ int zbx_db_vexecute(const char *fmt, va_list args) zabbix_log( LOG_LEVEL_DEBUG, "Executing query:%s", sql); #ifdef HAVE_MYSQL - while(mysql_query(&mysql,sql) != 0) + if(mysql_query(&mysql,sql) != 0) { - zabbix_log( LOG_LEVEL_ERR, "Query::%s",sql); - zabbix_log(LOG_LEVEL_ERR, "Query failed:%s [%d]", mysql_error(&mysql), mysql_errno(&mysql) ); - zabbix_log( LOG_LEVEL_ERR, "Will retry in 1 second...",sql); - sleep(1); + ret = (mysql_errno(&mysql) == CR_SERVER_GONE_ERROR)?ZBX_DB_DOWN:ZBX_DB_FAIL; + } + else + { + ret = (int)mysql_affected_rows(&mysql); } - ret = (int)mysql_affected_rows(&mysql); #endif #ifdef HAVE_POSTGRESQL result = PQexec(conn,sql); @@ -357,7 +364,7 @@ int zbx_db_vexecute(const char *fmt, va_list args) { zabbix_log( LOG_LEVEL_ERR, "Query::%s",sql); zabbix_log(LOG_LEVEL_ERR, "Query failed:%s", "Result is NULL" ); - ret = FAIL; + ret = ZBX_DB_FAIL; } else if( PQresultStatus(result) != PGRES_COMMAND_OK) { @@ -365,18 +372,23 @@ int zbx_db_vexecute(const char *fmt, va_list args) zabbix_log(LOG_LEVEL_ERR, "Query failed:%s:%s", PQresStatus(PQresultStatus(result)), PQresultErrorMessage(result)); - ret = FAIL; + ret = ZBX_DB_FAIL; + } + + if(ret == ZBX_DB_OK) + { + ret = PQntuples(result); } PQclear(result); #endif #ifdef HAVE_ORACLE - if ( (ret = sqlo_exec(oracle, sql))<0 ) + if ((ret = sqlo_exec(oracle, sql))<0) { zabbix_log( LOG_LEVEL_ERR, "Query::%s",sql); zabbix_log(LOG_LEVEL_ERR, "Query failed:%s", sqlo_geterror(oracle) ); zbx_error("Query::%s.",sql); zbx_error("Query failed:%s.", sqlo_geterror(oracle) ); - ret = FAIL; + ret = ZBX_DB_FAIL; } #endif #ifdef HAVE_SQLITE3 @@ -406,7 +418,6 @@ lbl_exec: } #endif - gettimeofday(&tv, NULL); if((float)(tv.tv_usec-msec)/1000000 > 0.05) zabbix_log( LOG_LEVEL_WARNING, "Long query: %f sec, query %s", (float)(tv.tv_usec-msec)/1000000, sql ); @@ -562,14 +573,16 @@ DB_RESULT zbx_db_vselect(const char *fmt, va_list args) zabbix_log( LOG_LEVEL_DEBUG, "Executing query:%s", sql); #ifdef HAVE_MYSQL - while(mysql_query(&mysql,sql) != 0) + if(mysql_query(&mysql,sql) != 0) { zabbix_log( LOG_LEVEL_ERR, "Query::%s",sql); zabbix_log(LOG_LEVEL_ERR, "Query failed:%s [%d]", mysql_error(&mysql), mysql_errno(&mysql) ); - zabbix_log( LOG_LEVEL_ERR, "Will retry in 1 second"); - sleep(1); + result = (mysql_errno(&mysql) == CR_SERVER_GONE_ERROR)?(DB_RESULT)ZBX_DB_DOWN:(DB_RESULT)ZBX_DB_FAIL; + } + else + { + result = mysql_store_result(&mysql); } - result = mysql_store_result(&mysql); #endif #ifdef HAVE_POSTGRESQL result = zbx_malloc(sizeof(ZBX_PG_DB_RESULT)); diff --git a/src/libs/zbxdbhigh/db.c b/src/libs/zbxdbhigh/db.c index 34372805..f2e8735c 100644 --- a/src/libs/zbxdbhigh/db.c +++ b/src/libs/zbxdbhigh/db.c @@ -64,7 +64,11 @@ void DBconnect(int flag) { exit(FAIL); } - loop = 1; + else + { + zabbix_log(LOG_LEVEL_WARNING, "Database is down. Reconnecting in 10 seconds"); + sleep(10); + } break; default: exit(FAIL); @@ -160,13 +164,21 @@ void DBrollback(void) int DBexecute(const char *fmt, ...) { va_list args; - int ret; + int ret = ZBX_DB_DOWN; - va_start(args, fmt); - - ret = zbx_db_vexecute(fmt, args); - - va_end(args); + while(ret == ZBX_DB_DOWN) + { + va_start(args, fmt); + ret = zbx_db_vexecute(fmt, args); + va_end(args); + if( ret == ZBX_DB_DOWN) + { + zabbix_log(LOG_LEVEL_WARNING, "Database is down. Retrying in 10 seconds"); + sleep(10); + DBclose(); + DBconnect(ZBX_DB_CONNECT_NORMAL); + } + } return ret; } @@ -190,13 +202,21 @@ DB_ROW DBfetch(DB_RESULT result) DB_RESULT DBselect(const char *fmt, ...) { va_list args; - DB_RESULT result; - - va_start(args, fmt); - - result = zbx_db_vselect(fmt, args); + DB_RESULT result = (DB_RESULT)ZBX_DB_DOWN; - va_end(args); + while(result == (DB_RESULT)ZBX_DB_DOWN) + { + va_start(args, fmt); + result = zbx_db_vselect(fmt, args); + va_end(args); + if( result == (DB_RESULT)ZBX_DB_DOWN) + { + zabbix_log(LOG_LEVEL_WARNING, "Database is down. Retrying in 10 seconds"); + sleep(10); + DBclose(); + DBconnect(ZBX_DB_CONNECT_NORMAL); + } + } return result; } diff --git a/src/zabbix_server/server.c b/src/zabbix_server/server.c index e1ed0b3e..e3327163 100644 --- a/src/zabbix_server/server.c +++ b/src/zabbix_server/server.c @@ -550,7 +550,7 @@ int MAIN_ZABBIX_ENTRY(void) if(server_num == 0) { init_main_process(); - zabbix_log( LOG_LEVEL_WARNING, "server #%d started [Main. Watchdog.]",server_num); + zabbix_log( LOG_LEVEL_WARNING, "server #%d started [Watchdog]",server_num); main_watchdog_loop(); /* for(;;) zbx_sleep(3600);*/ } diff --git a/src/zabbix_server/watchdog/watchdog.c b/src/zabbix_server/watchdog/watchdog.c index 417c9fe6..e98c443d 100644 --- a/src/zabbix_server/watchdog/watchdog.c +++ b/src/zabbix_server/watchdog/watchdog.c @@ -19,24 +19,7 @@ #include "config.h" -#include <stdio.h> -#include <stdlib.h> -#include <unistd.h> -#include <sys/stat.h> - -#include <string.h> - - -/* Required for getpwuid */ -#include <pwd.h> - -#include <signal.h> -#include <errno.h> - -#include <time.h> - #include "cfg.h" -#include "pid.h" #include "db.h" #include "log.h" #include "zlog.h" |