summaryrefslogtreecommitdiffstats
path: root/src
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
parentcc3ab52e16eb4c908f69f23b159293df6bac3f23 (diff)
- [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')
-rw-r--r--src/libs/zbxdbhigh/db.c112
-rw-r--r--src/zabbix_server/actions.c27
2 files changed, 110 insertions, 29 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;
}
diff --git a/src/zabbix_server/actions.c b/src/zabbix_server/actions.c
index f16e20a8..13467dbb 100644
--- a/src/zabbix_server/actions.c
+++ b/src/zabbix_server/actions.c
@@ -741,7 +741,7 @@ void execute_operations(DB_EVENT *event, DB_ACTION *action)
* *
* Author: Alexei Vladishev *
* *
- * Comments: we check also trigger dependencies *
+ * Comments: dependencies are checked in a different place *
* *
******************************************************************************/
void process_actions(DB_EVENT *event)
@@ -755,31 +755,6 @@ void process_actions(DB_EVENT *event)
(event->source == EVENT_SOURCE_TRIGGERS)?"TRIGGERS":"DISCOVERY",
event->eventid);
-/* Do not react on any events if we depend on other trigger */
-/* if(TRIGGER_VALUE_TRUE == event->value)*/
-/* For events generated by triggers only */
- if(event->source == EVENT_SOURCE_TRIGGERS)
- {
- zabbix_log( LOG_LEVEL_DEBUG, "Check dependencies");
-
- result = DBselect("select count(*) from trigger_depends d,triggers t where d.triggerid_down=" ZBX_FS_UI64 " and d.triggerid_up=t.triggerid and t.value=%d",
- event->objectid,
- TRIGGER_VALUE_TRUE);
- row=DBfetch(result);
- if(row && DBis_null(row[0]) != SUCCEED)
- {
- if(atoi(row[0])>0)
- {
- zabbix_log( LOG_LEVEL_DEBUG, "Will not apply actions");
- DBfree_result(result);
- return;
- }
- }
- DBfree_result(result);
- }
-
- zabbix_log( LOG_LEVEL_DEBUG, "Processing actions");
-
result = DBselect("select actionid,evaltype,status,eventsource from actions where status=%d and eventsource=%d and" ZBX_COND_NODEID,
ACTION_STATUS_ACTIVE,
event->source,