summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/zbxdb.h6
-rw-r--r--src/libs/zbxdb/db.c57
-rw-r--r--src/libs/zbxdbhigh/db.c46
-rw-r--r--src/zabbix_server/server.c2
-rw-r--r--src/zabbix_server/watchdog/watchdog.c17
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"