summaryrefslogtreecommitdiffstats
path: root/src/libs/zbxdbhigh/db.c
diff options
context:
space:
mode:
authoralex <alex@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2007-10-12 14:40:45 +0000
committeralex <alex@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2007-10-12 14:40:45 +0000
commitf1fcf4a2103bdc1beb9e348ea982ed7650527c8f (patch)
tree383faf9748ea44451eb20432b5f6211727682c12 /src/libs/zbxdbhigh/db.c
parentcc3ab52e16eb4c908f69f23b159293df6bac3f23 (diff)
downloadzabbix-f1fcf4a2103bdc1beb9e348ea982ed7650527c8f.tar.gz
zabbix-f1fcf4a2103bdc1beb9e348ea982ed7650527c8f.tar.xz
zabbix-f1fcf4a2103bdc1beb9e348ea982ed7650527c8f.zip
- [ZBX-30,ZBX-47] better dependencies (Alexei)
[svn merge -r4862:4868 svn://svn.zabbix.com/branches/1.4] git-svn-id: svn://svn.zabbix.com/trunk@4869 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'src/libs/zbxdbhigh/db.c')
-rw-r--r--src/libs/zbxdbhigh/db.c112
1 files changed, 109 insertions, 3 deletions
diff --git a/src/libs/zbxdbhigh/db.c b/src/libs/zbxdbhigh/db.c
index e65450e7..4e239544 100644
--- a/src/libs/zbxdbhigh/db.c
+++ b/src/libs/zbxdbhigh/db.c
@@ -442,6 +442,97 @@ int DBadd_service_alarm(zbx_uint64_t serviceid,int status,int clock)
return SUCCEED;
}
+/******************************************************************************
+ * *
+ * Function: trigger_dependent_rec *
+ * *
+ * Purpose: check if status depends on triggers having status TRUE *
+ * *
+ * Parameters: triggerid - trigger ID *
+ * *
+ * Return value: SUCCEED - it does depend, FAIL - otherwise *
+ * *
+ * *
+ * Author: Alexei Vladishev *
+ * *
+ * Comments: Recursive function! *
+ * *
+ ******************************************************************************/
+static int trigger_dependent_rec(zbx_uint64_t triggerid, int *level)
+{
+ int ret = FAIL;
+ DB_RESULT result;
+ DB_ROW row;
+
+ zbx_uint64_t triggerid_tmp;
+ int value_tmp;
+
+ zabbix_log( LOG_LEVEL_DEBUG, "In trigger_dependent_rec(triggerid:" ZBX_FS_UI64 ",level:%d)",
+ triggerid,
+ *level);
+
+ (*level)++;
+
+ if(*level > 32)
+ {
+ zabbix_log( LOG_LEVEL_CRIT, "Recursive trigger dependency detected! Please fix. Triggerid:" ZBX_FS_UI64,
+ triggerid);
+ return ret;
+ }
+
+ result = DBselect("select t.triggerid, t.value from trigger_depends d,triggers t where d.triggerid_down=" ZBX_FS_UI64 " and d.triggerid_up=t.triggerid",
+ triggerid);
+ while((row=DBfetch(result)))
+ {
+ ZBX_STR2UINT64(triggerid_tmp, row[0]);
+ value_tmp = atoi(row[1]);
+ if(TRIGGER_VALUE_TRUE == value_tmp || trigger_dependent_rec(triggerid_tmp, level) == SUCCEED)
+ {
+ zabbix_log( LOG_LEVEL_DEBUG, "This trigger depends on " ZBX_FS_UI64 ". Will not apply actions",
+ triggerid_tmp);
+ ret = SUCCEED;
+ break;
+ }
+ }
+ DBfree_result(result);
+
+ zabbix_log( LOG_LEVEL_DEBUG, "End of trigger_dependent_rec(ret:%s)",
+ SUCCEED==ret?"SUCCEED":"FAIL");
+
+ return ret;
+}
+
+/******************************************************************************
+ * *
+ * Function: trigger_dependent *
+ * *
+ * Purpose: check if status depends on triggers having status TRUE *
+ * *
+ * Parameters: triggerid - trigger ID *
+ * *
+ * Return value: SUCCEED - it does depend, FAIL - not such triggers *
+ * *
+ * Author: Alexei Vladishev *
+ * *
+ * Comments: *
+ * *
+ ******************************************************************************/
+static int trigger_dependent(zbx_uint64_t triggerid)
+{
+ int ret;
+ int level = 0;
+
+ zabbix_log( LOG_LEVEL_DEBUG, "In trigger_dependent(triggerid:" ZBX_FS_UI64 ")",
+ triggerid);
+
+ ret = trigger_dependent_rec(triggerid, &level);
+
+ zabbix_log( LOG_LEVEL_DEBUG, "End of trigger_dependent(ret:%s)",
+ SUCCEED==ret?"SUCCEED":"FAIL");
+
+ return ret;
+}
+
int DBupdate_trigger_value(DB_TRIGGER *trigger, int new_value, int now, char *reason)
{
int ret = SUCCEED;
@@ -467,10 +558,11 @@ int DBupdate_trigger_value(DB_TRIGGER *trigger, int new_value, int now, char *re
reason);
}
- /* New trigger value differs from current one */
- if(trigger->value != new_value)
- {
+ /* New trigger value differs from current one AND ...*/
+ /* ... Do not update status if there are dependencies with status TRUE*/
+ if(trigger->value != new_value && trigger_dependent(trigger->triggerid) == FAIL)
+ {
get_latest_event_status(trigger->triggerid, &event_prev_status, &event_last_status);
zabbix_log(LOG_LEVEL_DEBUG,"tr value [%d] event_prev_value [%d] event_last_status [%d] new_value [%d]",
@@ -538,17 +630,31 @@ int DBupdate_trigger_value(DB_TRIGGER *trigger, int new_value, int now, char *re
}
else
{
+ ret = FAIL;
zabbix_log(LOG_LEVEL_WARNING,"Event processed not OK");
}
}
+ else
+ {
+ ret = FAIL;
+ }
}
else
{
+ ret = FAIL;
+ }
+
+ if( FAIL == ret)
+ {
zabbix_log(LOG_LEVEL_DEBUG,"Event not added for triggerid [" ZBX_FS_UI64 "]",
trigger->triggerid);
ret = FAIL;
}
}
+ else
+ {
+ ret = FAIL;
+ }
zabbix_log(LOG_LEVEL_DEBUG,"End update_trigger_value()");
return ret;
}