Skip to content

Commit 89dd4a1

Browse files
authored
Merge pull request #468 from bazsi/filterx-scope-optimizations
Filterx scope optimizations
2 parents d743d48 + 097238e commit 89dd4a1

7 files changed

+286
-171
lines changed

lib/filterx/filterx-eval.c

+2-9
Original file line numberDiff line numberDiff line change
@@ -145,15 +145,9 @@ filterx_eval_exec(FilterXEvalContext *context, FilterXExpr *expr)
145145
}
146146

147147
void
148-
filterx_eval_init_context(FilterXEvalContext *context, FilterXEvalContext *previous_context, LogMessage *msg)
148+
filterx_eval_init_context(FilterXEvalContext *context, FilterXEvalContext *previous_context, FilterXScope *scope,
149+
LogMessage *msg)
149150
{
150-
FilterXScope *scope;
151-
152-
if (previous_context)
153-
scope = filterx_scope_ref(previous_context->scope);
154-
else
155-
scope = filterx_scope_new();
156-
filterx_scope_make_writable(&scope);
157151
filterx_scope_set_message(scope, msg);
158152

159153
memset(context, 0, sizeof(*context));
@@ -176,7 +170,6 @@ filterx_eval_deinit_context(FilterXEvalContext *context)
176170
{
177171
if (!context->previous_context)
178172
g_ptr_array_free(context->weak_refs, TRUE);
179-
filterx_scope_unref(context->scope);
180173
filterx_eval_set_context(context->previous_context);
181174
}
182175

lib/filterx/filterx-eval.h

+27-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,8 @@ EVTTAG *filterx_format_last_error_location(void);
7373
void filterx_eval_clear_errors(void);
7474
EVTTAG *filterx_format_eval_result(FilterXEvalResult result);
7575

76-
void filterx_eval_init_context(FilterXEvalContext *context, FilterXEvalContext *previous_context, LogMessage *msg);
76+
void filterx_eval_init_context(FilterXEvalContext *context, FilterXEvalContext *previous_context,
77+
FilterXScope *scope_storage, LogMessage *msg);
7778
void filterx_eval_deinit_context(FilterXEvalContext *context);
7879

7980
static inline void
@@ -126,5 +127,30 @@ filterx_eval_store_weak_ref(FilterXObject *object)
126127
}
127128
}
128129

130+
#define FILTERX_EVAL_BEGIN_CONTEXT(eval_context, previous_context) \
131+
do { \
132+
FilterXScope *scope = NULL; \
133+
gboolean local_scope = FALSE; \
134+
\
135+
if (previous_context) \
136+
scope = filterx_scope_reuse(previous_context->scope); \
137+
\
138+
if (!scope) \
139+
{ \
140+
gsize alloc_size = filterx_scope_get_alloc_size(); \
141+
scope = g_alloca(alloc_size); \
142+
filterx_scope_init_instance(scope, alloc_size, path_options->filterx_context ? path_options->filterx_context->scope : NULL); \
143+
local_scope = TRUE; \
144+
} \
145+
filterx_eval_init_context(&eval_context, path_options->filterx_context, scope, msg); \
146+
do
147+
148+
149+
#define FILTERX_EVAL_END_CONTEXT(eval_context) \
150+
while(0); \
151+
filterx_eval_deinit_context(&eval_context); \
152+
if (local_scope) \
153+
filterx_scope_clear(scope); \
154+
} while(0)
129155

130156
#endif

lib/filterx/filterx-pipe.c

+43-40
Original file line numberDiff line numberDiff line change
@@ -64,48 +64,51 @@ log_filterx_pipe_queue(LogPipe *s, LogMessage *msg, const LogPathOptions *path_o
6464
{
6565
LogFilterXPipe *self = (LogFilterXPipe *) s;
6666
FilterXEvalContext eval_context;
67-
LogPathOptions local_path_options;
68-
FilterXEvalResult eval_res;
69-
70-
path_options = log_path_options_chain(&local_path_options, path_options);
71-
filterx_eval_init_context(&eval_context, path_options->filterx_context, msg);
72-
73-
msg_trace(">>>>>> filterx rule evaluation begin",
74-
evt_tag_str("rule", self->name),
75-
log_pipe_location_tag(s),
76-
evt_tag_msg_reference(msg));
67+
FilterXEvalContext *previous_context = path_options->filterx_context;
7768

7869
NVTable *payload = nv_table_ref(msg->payload);
79-
eval_res = filterx_eval_exec(&eval_context, self->block);
80-
81-
msg_trace("<<<<<< filterx rule evaluation result",
82-
filterx_format_eval_result(eval_res),
83-
evt_tag_str("rule", self->name),
84-
log_pipe_location_tag(s),
85-
evt_tag_int("dirty", filterx_scope_is_dirty(eval_context.scope)),
86-
evt_tag_msg_reference(msg));
87-
88-
local_path_options.filterx_context = &eval_context;
89-
switch (eval_res)
90-
{
91-
case FXE_SUCCESS:
92-
log_pipe_forward_msg(s, msg, path_options);
93-
break;
94-
95-
case FXE_FAILURE:
96-
if (path_options->matched)
97-
(*path_options->matched) = FALSE;
98-
/* FALLTHROUGH */
99-
case FXE_DROP:
100-
log_msg_drop(msg, path_options, AT_PROCESSED);
101-
break;
102-
103-
default:
104-
g_assert_not_reached();
105-
break;
106-
}
107-
108-
filterx_eval_deinit_context(&eval_context);
70+
FILTERX_EVAL_BEGIN_CONTEXT(eval_context, previous_context)
71+
{
72+
FilterXEvalResult eval_res;
73+
LogPathOptions local_path_options;
74+
75+
path_options = log_path_options_chain(&local_path_options, path_options);
76+
77+
msg_trace(">>>>>> filterx rule evaluation begin",
78+
evt_tag_str("rule", self->name),
79+
log_pipe_location_tag(s),
80+
evt_tag_msg_reference(msg));
81+
82+
eval_res = filterx_eval_exec(&eval_context, self->block);
83+
84+
msg_trace("<<<<<< filterx rule evaluation result",
85+
filterx_format_eval_result(eval_res),
86+
evt_tag_str("rule", self->name),
87+
log_pipe_location_tag(s),
88+
evt_tag_int("dirty", filterx_scope_is_dirty(eval_context.scope)),
89+
evt_tag_msg_reference(msg));
90+
91+
local_path_options.filterx_context = &eval_context;
92+
switch (eval_res)
93+
{
94+
case FXE_SUCCESS:
95+
log_pipe_forward_msg(s, msg, path_options);
96+
break;
97+
98+
case FXE_FAILURE:
99+
if (path_options->matched)
100+
(*path_options->matched) = FALSE;
101+
/* FALLTHROUGH */
102+
case FXE_DROP:
103+
log_msg_drop(msg, path_options, AT_PROCESSED);
104+
break;
105+
106+
default:
107+
g_assert_not_reached();
108+
break;
109+
}
110+
}
111+
FILTERX_EVAL_END_CONTEXT(eval_context);
109112
nv_table_unref(payload);
110113
}
111114

0 commit comments

Comments
 (0)