summaryrefslogtreecommitdiffstats
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
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
-rw-r--r--ChangeLog1
-rw-r--r--frontends/php/include/triggers.inc.php53
-rw-r--r--frontends/php/tr_status.php7
-rw-r--r--frontends/php/triggers.php4
-rw-r--r--src/libs/zbxdbhigh/db.c112
-rw-r--r--src/zabbix_server/actions.c27
6 files changed, 167 insertions, 37 deletions
diff --git a/ChangeLog b/ChangeLog
index 40c8f85e..1e13e54a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -16,6 +16,7 @@ Changes for 1.5:
Changes for 1.4.3:
+ - [ZBX-30,ZBX-47] better dependencies (Alexei)
- [ZBX-48] fixed server crash if incorrect syntax of aggregate items is used (Alexei)
- [ZBX-95] fixed patch.sql to work with buggy PHPMyAdmin (Alexei)
- [ZBX-59] removed button "Switch Node" (Alexei)
diff --git a/frontends/php/include/triggers.inc.php b/frontends/php/include/triggers.inc.php
index 9ec4ae64..d9879044 100644
--- a/frontends/php/include/triggers.inc.php
+++ b/frontends/php/include/triggers.inc.php
@@ -1986,4 +1986,57 @@
return $ret;
}
+ /*
+ * Function: trigger_depenent_rec
+ *
+ * Description:
+ * check if trigger depends on other triggers having status TRUE
+ *
+ * Author:
+ * Alexei Vladishev
+ *
+ * Comments: Recursive function
+ *
+ */
+ function trigger_dependent_rec($triggerid,&$level)
+ {
+ $ret = FALSE;
+
+ $level++;
+
+ /* Check for recursive loop */
+ if($level > 32) return $ret;
+
+ $result = DBselect("select t.triggerid, t.value from trigger_depends d,triggers t where d.triggerid_down=$triggerid and d.triggerid_up=t.triggerid");
+ while($row = DBfetch($result))
+ {
+ $triggerid_tmp = $row["triggerid"];
+ $value_tmp = $row["value"];
+ if(TRIGGER_VALUE_TRUE == $value_tmp || trigger_dependent_rec($triggerid_tmp, $level))
+ {
+ $ret = TRUE;
+ break;
+ }
+ }
+
+ return $ret;
+ }
+
+ /*
+ * Function: trigger_depenent
+ *
+ * Description:
+ * check if trigger depends on other triggers having status TRUE
+ *
+ * Author:
+ * Alexei Vladishev
+ *
+ * Comments:
+ *
+ */
+ function trigger_dependent($triggerid)
+ {
+ $level = 0;
+ return trigger_dependent_rec($triggerid, $level);
+ }
?>
diff --git a/frontends/php/tr_status.php b/frontends/php/tr_status.php
index dbc26b65..ad0badf4 100644
--- a/frontends/php/tr_status.php
+++ b/frontends/php/tr_status.php
@@ -400,12 +400,7 @@ echo '<script type="text/javascript" src="js/blink.js"></script>';
while($row=DBfetch($result)){
// Check for dependencies
- $deps = DBfetch(DBselect("select count(*) as cnt from trigger_depends d, triggers t ".
- " where d.triggerid_down=".$row["triggerid"]." and d.triggerid_up=t.triggerid and t.value=1"));
-
- if($deps["cnt"]>0){
- continue;
- }
+ if(trigger_dependent($row["triggerid"])) continue;
$cond = '';
$ack_expire = ($config['ack_expire']*86400);
diff --git a/frontends/php/triggers.php b/frontends/php/triggers.php
index c6ce4195..8130e39e 100644
--- a/frontends/php/triggers.php
+++ b/frontends/php/triggers.php
@@ -438,9 +438,9 @@ include_once "include/page_header.php";
$deps = get_trigger_dependences_by_triggerid($row["triggerid"]);
if(count($deps) > 0)
{
- $description[] = BR.BR."<strong>".S_DEPENDS_ON."</strong>".SPACE.BR;
+ $description[] = BR.BR."<strong>".S_DEPENDS_ON.":</strong>".SPACE.BR;
foreach($deps as $val)
- $description[] = '['.$val.']'.expand_trigger_description($val).BR;
+ $description[] = expand_trigger_description($val).BR;
$description[] = BR;
}
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,