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:
authorAndris Zeila <andris.zeila@zabbix.com>2022-10-24 20:00:49 +0300
committerDmitrijs Goloscapovs <dmitrijs.goloscapovs@zabbix.com>2022-11-07 18:36:16 +0300
commita91873c4ddd80f5015bc8e0448495b8a885c25c7 (patch)
tree994ed276d89a1cf14fefa6d796759c9c3092bd64
parentba4fe7e0a98b4765d984d839ab14a6a258b50a74 (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.c89
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: