diff options
author | Andris Zeila <andris.zeila@zabbix.com> | 2022-10-24 20:00:49 +0300 |
---|---|---|
committer | Dmitrijs Goloscapovs <dmitrijs.goloscapovs@zabbix.com> | 2022-11-07 18:36:16 +0300 |
commit | a91873c4ddd80f5015bc8e0448495b8a885c25c7 (patch) | |
tree | 994ed276d89a1cf14fefa6d796759c9c3092bd64 | |
parent | ba4fe7e0a98b4765d984d839ab14a6a258b50a74 (diff) |
........S. [ZBX-21616] added more optimizations to LLD filter processing
(cherry picked from commit 97429f6c1938fcf5b6708286fa28eebc183b5ceb)
(cherry picked from commit 24a6aedbef5b711eb59741977fe265bfa777ecf2)
-rw-r--r-- | src/zabbix_server/lld/lld.c | 89 |
1 files changed, 43 insertions, 46 deletions
diff --git a/src/zabbix_server/lld/lld.c b/src/zabbix_server/lld/lld.c index 230e019ba3e..ec4da66886d 100644 --- a/src/zabbix_server/lld/lld.c +++ b/src/zabbix_server/lld/lld.c @@ -243,6 +243,8 @@ static int filter_condition_match(const struct zbx_json_parse *jp_row, const zbx *result = (CONDITION_OPERATOR_NOT_REGEXP == condition->op ? 1 : 0); break; default: + *info = zbx_strdcatf(*info, "Cannot accurately apply filter: invalid regular " + "expression \"%s\".\n", condition->regexp); ret = FAIL; } } @@ -289,9 +291,8 @@ static int filter_evaluate_and_or_andor(const lld_filter_t *filter, const struct double result; char *lastmacro = NULL; lld_condition_t *condition; - char *ops[] = {NULL, "and", "or"}, error[256], value[16], id[ZBX_MAX_UINT64_LEN + 2], *p, - *expression = NULL, *errmsg = NULL; - size_t expression_alloc = 0, expression_offset = 0, id_len, value_len; + char *ops[] = {NULL, "and", "or"}, error[256], *expression = NULL, *errmsg = NULL; + size_t expression_alloc = 0, expression_offset = 0; zbx_vector_ptr_t errmsgs; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __func__); @@ -302,63 +303,56 @@ static int filter_evaluate_and_or_andor(const lld_filter_t *filter, const struct { condition = (lld_condition_t *)filter->conditions.values[i]; - if (CONDITION_EVAL_TYPE_AND_OR == filter->evaltype) - { - if (NULL == lastmacro) - { - zbx_chrcpy_alloc(&expression, &expression_alloc, &expression_offset, '('); - } - else if (0 != strcmp(lastmacro, condition->macro)) - { - zbx_strcpy_alloc(&expression, &expression_alloc, &expression_offset, ") and "); - } - else - zbx_strcpy_alloc(&expression, &expression_alloc, &expression_offset, " or "); - - lastmacro = condition->macro; - } - else if (0 != i) + switch (filter->evaltype) { - zbx_chrcpy_alloc(&expression, &expression_alloc, &expression_offset, ' '); - zbx_strcpy_alloc(&expression, &expression_alloc, &expression_offset, ops[filter->evaltype]); - zbx_chrcpy_alloc(&expression, &expression_alloc, &expression_offset, ' '); - } - - zbx_snprintf_alloc(&expression, &expression_alloc, &expression_offset, "{" ZBX_FS_UI64 "}", - condition->id); - - if (filter->conditions.values_num == i + 1) - { - if (CONDITION_EVAL_TYPE_AND_OR == filter->evaltype) - zbx_chrcpy_alloc(&expression, &expression_alloc, &expression_offset, ')'); + case CONDITION_EVAL_TYPE_AND_OR: + if (NULL == lastmacro) + { + zbx_chrcpy_alloc(&expression, &expression_alloc, &expression_offset, '('); + } + else if (0 != strcmp(lastmacro, condition->macro)) + { + zbx_strcpy_alloc(&expression, &expression_alloc, &expression_offset, ") and "); + } + else + zbx_strcpy_alloc(&expression, &expression_alloc, &expression_offset, " or "); - expression_offset++; + lastmacro = condition->macro; + break; + case CONDITION_EVAL_TYPE_AND: + case CONDITION_EVAL_TYPE_OR: + if (0 != i) + { + zbx_chrcpy_alloc(&expression, &expression_alloc, &expression_offset, ' '); + zbx_strcpy_alloc(&expression, &expression_alloc, &expression_offset, + ops[filter->evaltype]); + zbx_chrcpy_alloc(&expression, &expression_alloc, &expression_offset, ' '); + } + break; + default: + *info = zbx_strdcatf(*info, "Cannot accurately apply filter: invalid condition " + "type \"%d\".\n", filter->evaltype); + goto out; } if (SUCCEED == (ret = filter_condition_match(jp_row, lld_macro_paths, condition, &res, &errmsg))) { - zbx_snprintf(value, sizeof(value), "%d", res); + zbx_snprintf_alloc(&expression, &expression_alloc, &expression_offset, "%d", res); } else { - zbx_snprintf(value, sizeof(value), ZBX_UNKNOWN_STR "%d", error_num++); + zbx_snprintf_alloc(&expression, &expression_alloc, &expression_offset, ZBX_UNKNOWN_STR "%d", + error_num++); zbx_vector_ptr_append(&errmsgs, errmsg); errmsg = NULL; } - zbx_snprintf(id, sizeof(id), "{" ZBX_FS_UI64 "}", condition->id); - - value_len = strlen(value); - id_len = strlen(id); - - for (p = strstr(expression, id); NULL != p; p = strstr(p, id)) + if (filter->conditions.values_num == i + 1) { - size_t id_pos = p - expression; - - zbx_replace_mem_dyn(&expression, &expression_alloc, &expression_offset, id_pos, id_len, - value, value_len); + if (CONDITION_EVAL_TYPE_AND_OR == filter->evaltype) + zbx_chrcpy_alloc(&expression, &expression_alloc, &expression_offset, ')'); - p = expression + id_pos + value_len - id_len; + expression_offset++; } } @@ -371,7 +365,7 @@ static int filter_evaluate_and_or_andor(const lld_filter_t *filter, const struct *info = zbx_strdcat(*info, error); ret = FAIL; } - +out: zbx_free(expression); zbx_vector_ptr_clear_ext(&errmsgs, zbx_ptr_free); zbx_vector_ptr_destroy(&errmsgs); @@ -484,6 +478,9 @@ static int filter_evaluate_expression(const lld_filter_t *filter, const struct z static int filter_evaluate(const lld_filter_t *filter, const struct zbx_json_parse *jp_row, const zbx_vector_ptr_t *lld_macro_paths, char **info) { + if (0 == filter->conditions.values_num) + return SUCCEED; + switch (filter->evaltype) { case CONDITION_EVAL_TYPE_AND_OR: |