Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitrijs Goloscapovs <dmitrijs.goloscapovs@zabbix.com>2022-10-24 14:38:31 +0300
committerDmitrijs Goloscapovs <dmitrijs.goloscapovs@zabbix.com>2022-11-07 18:36:10 +0300
commitba4fe7e0a98b4765d984d839ab14a6a258b50a74 (patch)
tree2e59048e1837c5f5299a71137594c5480efbb9c1
parent68b4b3a13056694c12ea8552238b14a1f456d296 (diff)
........S. [ZBX-21616] optimized
(cherry picked from commit 3f5ba2086d944f8dfdd3e7343ba876e49a0f7b77) (cherry picked from commit e3cc07d97b4e87bad658f215d7a6a7665dc94e6f)
-rw-r--r--src/zabbix_server/lld/lld.c33
1 files changed, 14 insertions, 19 deletions
diff --git a/src/zabbix_server/lld/lld.c b/src/zabbix_server/lld/lld.c
index 5e27c916cb9..230e019ba3e 100644
--- a/src/zabbix_server/lld/lld.c
+++ b/src/zabbix_server/lld/lld.c
@@ -290,11 +290,12 @@ static int filter_evaluate_and_or_andor(const lld_filter_t *filter, const struct
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, *eval_expr = NULL, *errmsg = NULL;
+ *expression = NULL, *errmsg = NULL;
size_t expression_alloc = 0, expression_offset = 0, id_len, value_len;
- size_t eval_expr_alloc = 0, eval_expr_offset = 0;
zbx_vector_ptr_t errmsgs;
+ zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __func__);
+
zbx_vector_ptr_create(&errmsgs);
for (i = 0; i < filter->conditions.values_num; i++)
@@ -325,19 +326,14 @@ static int filter_evaluate_and_or_andor(const lld_filter_t *filter, const struct
zbx_snprintf_alloc(&expression, &expression_alloc, &expression_offset, "{" ZBX_FS_UI64 "}",
condition->id);
- }
-
- if (CONDITION_EVAL_TYPE_AND_OR == filter->evaltype)
- zbx_chrcpy_alloc(&expression, &expression_alloc, &expression_offset, ')');
-
- zbx_strcpy_alloc(&eval_expr, &eval_expr_alloc, &eval_expr_offset, expression);
- /* include trailing zero */
- eval_expr_offset++;
+ if (filter->conditions.values_num == i + 1)
+ {
+ if (CONDITION_EVAL_TYPE_AND_OR == filter->evaltype)
+ zbx_chrcpy_alloc(&expression, &expression_alloc, &expression_offset, ')');
- for (i = 0; i < filter->conditions.values_num; i++)
- {
- condition = (lld_condition_t *)filter->conditions.values[i];
+ expression_offset++;
+ }
if (SUCCEED == (ret = filter_condition_match(jp_row, lld_macro_paths, condition, &res, &errmsg)))
{
@@ -355,18 +351,18 @@ static int filter_evaluate_and_or_andor(const lld_filter_t *filter, const struct
value_len = strlen(value);
id_len = strlen(id);
- for (p = strstr(eval_expr, id); NULL != p; p = strstr(p, id))
+ for (p = strstr(expression, id); NULL != p; p = strstr(p, id))
{
- size_t id_pos = p - eval_expr;
+ size_t id_pos = p - expression;
- zbx_replace_mem_dyn(&eval_expr, &eval_expr_alloc, &eval_expr_offset, id_pos, id_len,
+ zbx_replace_mem_dyn(&expression, &expression_alloc, &expression_offset, id_pos, id_len,
value, value_len);
- p = eval_expr + id_pos + value_len - id_len;
+ p = expression + id_pos + value_len - id_len;
}
}
- if (SUCCEED == zbx_evaluate(&result, eval_expr, error, sizeof(error), &errmsgs))
+ if (SUCCEED == zbx_evaluate(&result, expression, error, sizeof(error), &errmsgs))
{
ret = (SUCCEED != zbx_double_compare(result, 0) ? SUCCEED : FAIL);
}
@@ -377,7 +373,6 @@ static int filter_evaluate_and_or_andor(const lld_filter_t *filter, const struct
}
zbx_free(expression);
- zbx_free(eval_expr);
zbx_vector_ptr_clear_ext(&errmsgs, zbx_ptr_free);
zbx_vector_ptr_destroy(&errmsgs);