diff -uNrp zabbix-1.8.16.orig/include/db.h zabbix-1.8.16/include/db.h --- zabbix-1.8.16.orig/include/db.h 2013-01-16 23:10:08.000000000 +0900 +++ zabbix-1.8.16/include/db.h 2013-01-23 10:17:10.744825553 +0900 @@ -493,6 +493,13 @@ typedef struct } DB_ESCALATION; +typedef struct +{ + zbx_uint64_t triggerid; + int value; +} +uncommit_trigger_t; + #define DB_NODE "%s" #define DBnode_local(fieldid) DBnode(fieldid, CONFIG_NODEID) const char *DBnode(const char *fieldid, int nodeid); @@ -540,7 +547,7 @@ int DBremove_escalation(zbx_uint64_t esc void DBupdate_triggers_status_after_restart(); int DBget_trigger_update_sql(char **sql, int *sql_alloc, int *sql_offset, zbx_uint64_t triggerid, unsigned char type, int value, const char *error, int new_value, const char *new_error, int lastchange, - unsigned char *add_event); + unsigned char *add_event, uncommit_trigger_t *ut); int DBget_row_count(const char *table_name); int DBget_items_unsupported_count(); diff -uNrp zabbix-1.8.16.orig/src/libs/zbxdbcache/dbcache.c zabbix-1.8.16/src/libs/zbxdbcache/dbcache.c --- zabbix-1.8.16.orig/src/libs/zbxdbcache/dbcache.c 2013-01-16 23:10:09.000000000 +0900 +++ zabbix-1.8.16/src/libs/zbxdbcache/dbcache.c 2013-01-23 10:17:10.746896269 +0900 @@ -837,6 +837,7 @@ static void DCmass_update_triggers(ZBX_D int tr_alloc, tr_num = 0, events_num = 0; int sql_offset = 0, i; zbx_uint64_t itemid, triggerid; + uncommit_trigger_t *ut = NULL; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name); @@ -914,6 +915,8 @@ static void DCmass_update_triggers(ZBX_D if (0 == tr_num) goto clean; + ut = zbx_calloc(ut, tr_num + 1, sizeof(uncommit_trigger_t)); + sql_offset = 0; #ifdef HAVE_ORACLE zbx_snprintf_alloc(&sql, &sql_allocated, &sql_offset, 7, "begin\n"); @@ -925,7 +928,7 @@ static void DCmass_update_triggers(ZBX_D if (SUCCEED == DBget_trigger_update_sql(&sql, &sql_allocated, &sql_offset, tr_last->triggerid, tr_last->type, tr_last->value, tr_last->error, tr_last->new_value, tr_last->new_error, - tr_last->lastchange, &tr_last->add_event)) + tr_last->lastchange, &tr_last->add_event, ut)) { zbx_snprintf_alloc(&sql, &sql_allocated, &sql_offset, 3, ";\n"); @@ -964,6 +967,7 @@ static void DCmass_update_triggers(ZBX_D tr_last->lastchange, tr_last->new_value, 0, 0); } } + zbx_free(ut); clean: zbx_free(tr); exit: diff -uNrp zabbix-1.8.16.orig/src/libs/zbxdbhigh/db.c zabbix-1.8.16/src/libs/zbxdbhigh/db.c --- zabbix-1.8.16.orig/src/libs/zbxdbhigh/db.c 2013-01-16 23:10:10.000000000 +0900 +++ zabbix-1.8.16/src/libs/zbxdbhigh/db.c 2013-01-23 10:17:10.748026364 +0900 @@ -378,13 +378,15 @@ int DBadd_service_alarm(zbx_uint64_t ser * Comments: Recursive function! * * * ******************************************************************************/ -static int trigger_dependent_rec(zbx_uint64_t triggerid, int level) +static int trigger_dependent_rec(zbx_uint64_t triggerid, int level, uncommit_trigger_t *ut) { const char *__function_name = "trigger_dependent_rec"; int ret = FAIL; DB_RESULT result; DB_ROW row; unsigned char value; + int num; + int ut_value; zabbix_log(LOG_LEVEL_DEBUG, "In %s() triggerid:" ZBX_FS_UI64 " level:%d", __function_name, triggerid, level); @@ -407,7 +409,21 @@ static int trigger_dependent_rec(zbx_uin ZBX_STR2UINT64(triggerid, row[0]); value = (unsigned char)atoi(row[1]); - if (TRIGGER_VALUE_TRUE == value || SUCCEED == trigger_dependent_rec(triggerid, level + 1)) + ut_value = -1; + if (NULL != ut) + { + for (num = 0; 0 != ut[num].triggerid; num++) + { + if (ut[num].triggerid == triggerid) + { + ut_value = ut[num].value; + break; + } + } + } + + if (TRIGGER_VALUE_TRUE == value || SUCCEED == trigger_dependent_rec(triggerid, level + 1, ut) || + ((NULL != ut && -1 != ut_value) || NULL == ut)) { zabbix_log(LOG_LEVEL_DEBUG, "This trigger depends on " ZBX_FS_UI64 ". Will not apply actions", triggerid); @@ -435,14 +451,14 @@ exit: * Author: Alexei Vladishev * * * ******************************************************************************/ -static int trigger_dependent(zbx_uint64_t triggerid) +static int trigger_dependent(zbx_uint64_t triggerid, uncommit_trigger_t *ut) { const char *__function_name = "trigger_dependent"; int ret; zabbix_log(LOG_LEVEL_DEBUG, "In %s() triggerid:" ZBX_FS_UI64, __function_name, triggerid); - ret = trigger_dependent_rec(triggerid, 0); + ret = trigger_dependent_rec(triggerid, 0, ut); zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __function_name, zbx_result_string(ret)); @@ -468,11 +484,12 @@ static int trigger_dependent(zbx_uint64_ ******************************************************************************/ int DBget_trigger_update_sql(char **sql, int *sql_alloc, int *sql_offset, zbx_uint64_t triggerid, unsigned char type, int value, const char *error, int new_value, const char *new_error, int lastchange, - unsigned char *add_event) + unsigned char *add_event, uncommit_trigger_t *ut) { const char *__function_name = "DBget_trigger_update_sql"; char *new_error_esc; int generate_event, ret = FAIL; + int num; zabbix_log(LOG_LEVEL_DEBUG, "In %s() triggerid:" ZBX_FS_UI64 " old:%d new:%d now:%d", __function_name, triggerid, value, new_value, lastchange); @@ -485,7 +502,7 @@ int DBget_trigger_update_sql(char **sql, if (0 != generate_event) { - if (SUCCEED != trigger_dependent(triggerid)) + if (SUCCEED != trigger_dependent(triggerid, ut)) { if (NULL == *sql) { @@ -496,7 +513,15 @@ int DBget_trigger_update_sql(char **sql, zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 42, "update triggers set lastchange=%d", lastchange); if (value != new_value) + { zbx_snprintf_alloc(sql, sql_alloc, sql_offset, 18, ",value=%d", new_value); + if (NULL != ut) + { + for (num = 0; 0 != ut[num].triggerid; num++) {}; + ut[num].triggerid = triggerid; + ut[num].value = new_value; + } + } if (NULL == new_error) { @@ -520,7 +545,7 @@ int DBget_trigger_update_sql(char **sql, } else if (new_value == TRIGGER_VALUE_UNKNOWN && 0 != strcmp(error, new_error)) { - if (SUCCEED != trigger_dependent(triggerid)) + if (SUCCEED != trigger_dependent(triggerid, ut)) { if (NULL == *sql) { @@ -674,7 +699,7 @@ void DBupdate_triggers_status_after_rest if (SUCCEED == DBget_trigger_update_sql(&sql, &sql_alloc, &sql_offset, triggerid, trigger_type, trigger_value, trigger_error, TRIGGER_VALUE_UNKNOWN, "Zabbix was restarted.", - min_nextcheck, &add_event)) + min_nextcheck, &add_event, NULL)) { zbx_snprintf_alloc(&sql, &sql_alloc, &sql_offset, 3, ";\n"); diff -uNrp zabbix-1.8.16.orig/src/zabbix_server/poller/poller.c zabbix-1.8.16/src/zabbix_server/poller/poller.c --- zabbix-1.8.16.orig/src/zabbix_server/poller/poller.c 2013-01-16 23:10:09.000000000 +0900 +++ zabbix-1.8.16/src/zabbix_server/poller/poller.c 2013-01-23 10:17:10.749018164 +0900 @@ -297,7 +297,7 @@ static void update_triggers_status_to_un if (SUCCEED == DBget_trigger_update_sql(&sql, &sql_alloc, &sql_offset, tr_last->triggerid, tr_last->type, tr_last->value, tr_last->error, tr_last->new_value, reason, - tr_last->lastchange, &tr_last->add_event)) + tr_last->lastchange, &tr_last->add_event, NULL)) { zbx_snprintf_alloc(&sql, &sql_alloc, &sql_offset, 3, ";\n"); diff -uNrp zabbix-1.8.16.orig/src/zabbix_server/timer/timer.c zabbix-1.8.16/src/zabbix_server/timer/timer.c --- zabbix-1.8.16.orig/src/zabbix_server/timer/timer.c 2013-01-16 23:10:09.000000000 +0900 +++ zabbix-1.8.16/src/zabbix_server/timer/timer.c 2013-01-23 10:17:10.750026860 +0900 @@ -54,6 +54,7 @@ static void process_time_functions() int tr_alloc = 0, tr_num = 0, events_num = 0; char *sql = NULL; int sql_alloc = 16 * ZBX_KIBIBYTE, sql_offset = 0, i; + uncommit_trigger_t *ut = NULL; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name); @@ -108,13 +109,15 @@ static void process_time_functions() zbx_snprintf_alloc(&sql, &sql_alloc, &sql_offset, 7, "begin\n"); #endif + ut = zbx_calloc(ut, tr_num + 1, sizeof(uncommit_trigger_t)); + for (i = 0; i < tr_num; i++) { tr_last = &tr[i]; if (SUCCEED == DBget_trigger_update_sql(&sql, &sql_alloc, &sql_offset, tr_last->triggerid, tr_last->type, tr_last->value, tr_last->error, tr_last->new_value, tr_last->new_error, - tr_last->lastchange, &tr_last->add_event)) + tr_last->lastchange, &tr_last->add_event, ut)) { zbx_snprintf_alloc(&sql, &sql_alloc, &sql_offset, 3, ";\n"); @@ -128,6 +131,7 @@ static void process_time_functions() zbx_free(tr_last->new_error); zbx_free(tr_last->expression); } + zbx_free(ut); #ifdef HAVE_ORACLE zbx_snprintf_alloc(&sql, &sql_alloc, &sql_offset, 6, "end;\n");