diff options
| author | alex <alex@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2007-10-12 14:40:45 +0000 |
|---|---|---|
| committer | alex <alex@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2007-10-12 14:40:45 +0000 |
| commit | f1fcf4a2103bdc1beb9e348ea982ed7650527c8f (patch) | |
| tree | 383faf9748ea44451eb20432b5f6211727682c12 | |
| parent | cc3ab52e16eb4c908f69f23b159293df6bac3f23 (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-- | ChangeLog | 1 | ||||
| -rw-r--r-- | frontends/php/include/triggers.inc.php | 53 | ||||
| -rw-r--r-- | frontends/php/tr_status.php | 7 | ||||
| -rw-r--r-- | frontends/php/triggers.php | 4 | ||||
| -rw-r--r-- | src/libs/zbxdbhigh/db.c | 112 | ||||
| -rw-r--r-- | src/zabbix_server/actions.c | 27 |
6 files changed, 167 insertions, 37 deletions
@@ -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, |
