Skip to content

Commit 2246b77

Browse files
authored
Merge pull request #400 from bazsi/filterx-performance-improvements
Filterx performance improvements
2 parents bbb2176 + 2c30b3f commit 2246b77

18 files changed

+355
-402
lines changed

lib/dnscache.c

+2-3
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ dns_cache_store(DNSCache *self, gboolean persistent, gint family, void *addr, co
161161
INIT_IV_LIST_HEAD(&entry->list);
162162
if (!persistent)
163163
{
164-
entry->resolved = iv_now.tv_sec;
164+
entry->resolved = get_cached_realtime_sec();
165165
iv_list_add(&entry->list, &self->cache_list);
166166
}
167167
else
@@ -304,8 +304,7 @@ dns_cache_lookup(DNSCache *self, gint family, void *addr, const gchar **hostname
304304
DNSCacheEntry *entry;
305305
time_t now;
306306

307-
iv_validate_now();
308-
now = iv_now.tv_sec;
307+
now = get_cached_realtime_sec();
309308
dns_cache_check_hosts(self, now);
310309

311310
dns_cache_fill_key(&key, family, addr);

lib/filterx/CMakeLists.txt

-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,6 @@ set(FILTERX_SOURCES
112112
filterx/func-vars.c
113113
filterx/object-datetime.c
114114
filterx/object-dict-interface.c
115-
filterx/object-extractor.c
116115
filterx/object-json-array.c
117116
filterx/object-json-object.c
118117
filterx/object-json.c

lib/filterx/Makefile.am

-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ filterx_sources = \
114114
lib/filterx/func-vars.c \
115115
lib/filterx/object-datetime.c \
116116
lib/filterx/object-dict-interface.c \
117-
lib/filterx/object-extractor.c \
118117
lib/filterx/object-json-array.c \
119118
lib/filterx/object-json-object.c \
120119
lib/filterx/object-json.c \

lib/filterx/expr-compound.c

+8-4
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,19 @@ _eval_expr(FilterXExpr *expr, FilterXObject **result)
8484
static gboolean
8585
_eval_exprs(FilterXCompoundExpr *self, FilterXObject **result)
8686
{
87+
FilterXEvalContext *context = filterx_eval_get_context();
88+
8789
*result = NULL;
88-
for (gint i = 0; i < self->exprs->len; i++)
90+
gint len = self->exprs->len;
91+
for (gint i = 0; i < len; i++)
8992
{
9093
filterx_object_unref(*result);
91-
FilterXEvalContext *context = filterx_eval_get_context();
9294

9395
if (G_UNLIKELY(context->eval_control_modifier == FXC_DROP || context->eval_control_modifier == FXC_DONE))
94-
/* code flow modifier detected, short circuiting */
95-
return TRUE;
96+
{
97+
/* code flow modifier detected, short circuiting */
98+
return TRUE;
99+
}
96100

97101
FilterXExpr *expr = g_ptr_array_index(self->exprs, i);
98102
if (!_eval_expr(expr, result))

lib/filterx/filterx-eval.c

-31
Original file line numberDiff line numberDiff line change
@@ -118,37 +118,6 @@ filterx_format_last_error_location(void)
118118
return filterx_error_format_location(&context->error);
119119
}
120120

121-
122-
/*
123-
* This is not a real weakref implementation as we will never get rid off
124-
* weak references until the very end of a scope. If this wasn't the case
125-
* we would have to:
126-
* 1) run a proper GC
127-
* 2) notify weak references once the object is detroyed
128-
*
129-
* None of that exists now and I doubt ever will (but never say never).
130-
* Right now a weak ref is destroyed as a part of the scope finalization
131-
* process at which point circular references will be broken so the rest can
132-
* go too.
133-
*/
134-
void
135-
filterx_eval_store_weak_ref(FilterXObject *object)
136-
{
137-
/* Frozen objects do not need weak refs. */
138-
if (object && filterx_object_is_frozen(object))
139-
return;
140-
141-
FilterXEvalContext *context = filterx_eval_get_context();
142-
143-
if (object && !object->weak_referenced)
144-
{
145-
/* avoid putting object to the list multiple times */
146-
object->weak_referenced = TRUE;
147-
g_assert(context->weak_refs);
148-
g_ptr_array_add(context->weak_refs, filterx_object_ref(object));
149-
}
150-
}
151-
152121
FilterXEvalResult
153122
filterx_eval_exec(FilterXEvalContext *context, FilterXExpr *expr, LogMessage *msg)
154123
{

lib/filterx/filterx-eval.h

+30-2
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,6 @@ EVTTAG *filterx_format_last_error_location(void);
6969
void filterx_eval_clear_errors(void);
7070
EVTTAG *filterx_format_eval_result(FilterXEvalResult result);
7171

72-
void filterx_eval_store_weak_ref(FilterXObject *object);
73-
7472
void filterx_eval_init_context(FilterXEvalContext *context, FilterXEvalContext *previous_context);
7573
void filterx_eval_deinit_context(FilterXEvalContext *context);
7674

@@ -95,4 +93,34 @@ filterx_eval_prepare_for_fork(FilterXEvalContext *context, LogMessage **pmsg, co
9593
filterx_scope_write_protect(context->scope);
9694
}
9795

96+
/*
97+
* This is not a real weakref implementation as we will never get rid off
98+
* weak references until the very end of a scope. If this wasn't the case
99+
* we would have to:
100+
* 1) run a proper GC
101+
* 2) notify weak references once the object is detroyed
102+
*
103+
* None of that exists now and I doubt ever will (but never say never).
104+
* Right now a weak ref is destroyed as a part of the scope finalization
105+
* process at which point circular references will be broken so the rest can
106+
* go too.
107+
*/
108+
static inline void
109+
filterx_eval_store_weak_ref(FilterXObject *object)
110+
{
111+
/* Frozen objects do not need weak refs. */
112+
if (object && filterx_object_is_frozen(object))
113+
return;
114+
115+
if (object && !object->weak_referenced)
116+
{
117+
FilterXEvalContext *context = filterx_eval_get_context();
118+
/* avoid putting object to the list multiple times */
119+
object->weak_referenced = TRUE;
120+
g_assert(context->weak_refs);
121+
g_ptr_array_add(context->weak_refs, filterx_object_ref(object));
122+
}
123+
}
124+
125+
98126
#endif

lib/filterx/filterx-expr.c

+10-4
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,20 @@
3232
void
3333
filterx_expr_set_location_with_text(FilterXExpr *self, CfgLexer *lexer, CFG_LTYPE *lloc, const gchar *text)
3434
{
35-
self->lloc = *lloc;
35+
if (!self->lloc)
36+
self->lloc = g_new0(CFG_LTYPE, 1);
37+
*self->lloc = *lloc;
38+
3639
if (debug_flag)
3740
self->expr_text = g_strdup(text);
3841
}
3942

4043
void
4144
filterx_expr_set_location(FilterXExpr *self, CfgLexer *lexer, CFG_LTYPE *lloc)
4245
{
43-
self->lloc = *lloc;
46+
if (!self->lloc)
47+
self->lloc = g_new0(CFG_LTYPE, 1);
48+
*self->lloc = *lloc;
4449
if (debug_flag)
4550
{
4651
GString *res = g_string_sized_new(0);
@@ -52,9 +57,9 @@ filterx_expr_set_location(FilterXExpr *self, CfgLexer *lexer, CFG_LTYPE *lloc)
5257
EVTTAG *
5358
filterx_expr_format_location_tag(FilterXExpr *self)
5459
{
55-
if (self)
60+
if (self && self->lloc)
5661
return evt_tag_printf("expr", "%s:%d:%d|\t%s",
57-
self->lloc.name, self->lloc.first_line, self->lloc.first_column,
62+
self->lloc->name, self->lloc->first_line, self->lloc->first_column,
5863
self->expr_text ? : "n/a");
5964
else
6065
return evt_tag_str("expr", "n/a");
@@ -74,6 +79,7 @@ filterx_expr_deinit_method(FilterXExpr *self, GlobalConfig *cfg)
7479
void
7580
filterx_expr_free_method(FilterXExpr *self)
7681
{
82+
g_free(self->lloc);
7783
g_free(self->expr_text);
7884
}
7985

lib/filterx/filterx-expr.h

+7-9
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,14 @@
3131

3232
struct _FilterXExpr
3333
{
34-
/* not thread-safe */
35-
guint32 ref_cnt;
36-
const gchar *type;
37-
guint32 ignore_falsy_result:1, suppress_from_trace:1;
38-
3934
StatsCounterItem *eval_count;
40-
4135
/* evaluate expression */
4236
FilterXObject *(*eval)(FilterXExpr *self);
37+
38+
/* not thread-safe */
39+
guint32 ref_cnt;
40+
guint32 ignore_falsy_result:1, suppress_from_trace:1, inited:1;
41+
4342
/* not to be used except for FilterXMessageRef, replace any cached values
4443
* with the unmarshaled version */
4544
void (*_update_repr)(FilterXExpr *self, FilterXObject *new_repr);
@@ -56,9 +55,8 @@ struct _FilterXExpr
5655
void (*deinit)(FilterXExpr *self, GlobalConfig *cfg);
5756
void (*free_fn)(FilterXExpr *self);
5857

59-
gboolean inited;
60-
61-
CFG_LTYPE lloc;
58+
const gchar *type;
59+
CFG_LTYPE *lloc;
6260
gchar *expr_text;
6361
};
6462

lib/filterx/filterx-object.c

-39
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,6 @@ filterx_type_init(FilterXType *type)
9191
msg_error("Reregistering filterx type", evt_tag_str("name", type->name));
9292
}
9393

94-
#define FILTERX_OBJECT_MAGIC_BIAS G_MAXINT32
95-
9694
void
9795
filterx_object_free_method(FilterXObject *self)
9896
{
@@ -125,12 +123,6 @@ filterx_object_freeze(FilterXObject *self)
125123
return TRUE;
126124
}
127125

128-
gboolean
129-
filterx_object_is_frozen(FilterXObject *self)
130-
{
131-
return g_atomic_counter_get(&self->ref_cnt) == FILTERX_OBJECT_MAGIC_BIAS;
132-
}
133-
134126
void
135127
filterx_object_unfreeze_and_free(FilterXObject *self)
136128
{
@@ -139,37 +131,6 @@ filterx_object_unfreeze_and_free(FilterXObject *self)
139131
filterx_object_unref(self);
140132
}
141133

142-
FilterXObject *
143-
filterx_object_ref(FilterXObject *self)
144-
{
145-
if (!self)
146-
return NULL;
147-
148-
if (filterx_object_is_frozen(self))
149-
return self;
150-
151-
g_atomic_counter_inc(&self->ref_cnt);
152-
153-
return self;
154-
}
155-
156-
void
157-
filterx_object_unref(FilterXObject *self)
158-
{
159-
if (!self)
160-
return;
161-
162-
if (filterx_object_is_frozen(self))
163-
return;
164-
165-
g_assert(g_atomic_counter_get(&self->ref_cnt) > 0);
166-
if (g_atomic_counter_dec_and_test(&self->ref_cnt))
167-
{
168-
self->type->free_fn(self);
169-
g_free(self);
170-
}
171-
}
172-
173134
FilterXType FILTERX_TYPE_NAME(object) =
174135
{
175136
.super_type = NULL,

lib/filterx/filterx-object.h

+39-3
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ void _filterx_type_init_methods(FilterXType *type);
7474
__VA_ARGS__ \
7575
}
7676

77+
#define FILTERX_OBJECT_MAGIC_BIAS G_MAXINT32
78+
7779

7880
FILTERX_DECLARE_TYPE(object);
7981

@@ -100,14 +102,48 @@ FilterXObject *filterx_object_getattr_string(FilterXObject *self, const gchar *a
100102
gboolean filterx_object_setattr_string(FilterXObject *self, const gchar *attr_name, FilterXObject **new_value);
101103

102104
FilterXObject *filterx_object_new(FilterXType *type);
103-
FilterXObject *filterx_object_ref(FilterXObject *self);
104-
void filterx_object_unref(FilterXObject *self);
105105
gboolean filterx_object_freeze(FilterXObject *self);
106-
gboolean filterx_object_is_frozen(FilterXObject *self);
107106
void filterx_object_unfreeze_and_free(FilterXObject *self);
108107
void filterx_object_init_instance(FilterXObject *self, FilterXType *type);
109108
void filterx_object_free_method(FilterXObject *self);
110109

110+
static inline gboolean
111+
filterx_object_is_frozen(FilterXObject *self)
112+
{
113+
return g_atomic_counter_get(&self->ref_cnt) == FILTERX_OBJECT_MAGIC_BIAS;
114+
}
115+
116+
static inline FilterXObject *
117+
filterx_object_ref(FilterXObject *self)
118+
{
119+
if (!self)
120+
return NULL;
121+
122+
if (filterx_object_is_frozen(self))
123+
return self;
124+
125+
g_atomic_counter_inc(&self->ref_cnt);
126+
127+
return self;
128+
}
129+
130+
static inline void
131+
filterx_object_unref(FilterXObject *self)
132+
{
133+
if (!self)
134+
return;
135+
136+
if (filterx_object_is_frozen(self))
137+
return;
138+
139+
g_assert(g_atomic_counter_get(&self->ref_cnt) > 0);
140+
if (g_atomic_counter_dec_and_test(&self->ref_cnt))
141+
{
142+
self->type->free_fn(self);
143+
g_free(self);
144+
}
145+
}
146+
111147
static inline void
112148
filterx_object_make_readonly(FilterXObject *self)
113149
{

lib/filterx/filterx-variable.c

-52
Original file line numberDiff line numberDiff line change
@@ -25,58 +25,6 @@
2525

2626
#include "filterx-variable.h"
2727

28-
#define FILTERX_HANDLE_FLOATING_BIT (1UL << 31)
29-
30-
gboolean
31-
filterx_variable_handle_is_floating(FilterXVariableHandle handle)
32-
{
33-
return !!(handle & FILTERX_HANDLE_FLOATING_BIT);
34-
}
35-
36-
gboolean
37-
filterx_variable_is_floating(FilterXVariable *v)
38-
{
39-
return filterx_variable_handle_is_floating(v->handle);
40-
}
41-
42-
NVHandle
43-
filterx_variable_get_nv_handle(FilterXVariable *v)
44-
{
45-
return v->handle & ~FILTERX_HANDLE_FLOATING_BIT;
46-
}
47-
48-
const gchar *
49-
filterx_variable_get_name(FilterXVariable *v, gssize *len)
50-
{
51-
return log_msg_get_handle_name(filterx_variable_get_nv_handle(v), len);
52-
}
53-
54-
FilterXObject *
55-
filterx_variable_get_value(FilterXVariable *v)
56-
{
57-
return filterx_object_ref(v->value);
58-
}
59-
60-
void
61-
filterx_variable_set_value(FilterXVariable *v, FilterXObject *new_value)
62-
{
63-
filterx_object_unref(v->value);
64-
v->value = filterx_object_ref(new_value);
65-
v->assigned = TRUE;
66-
}
67-
68-
void
69-
filterx_variable_unset_value(FilterXVariable *v)
70-
{
71-
filterx_variable_set_value(v, NULL);
72-
}
73-
74-
gboolean
75-
filterx_variable_is_set(FilterXVariable *v)
76-
{
77-
return v->value != NULL;
78-
}
79-
8028
FilterXVariableHandle
8129
filterx_map_varname_to_handle(const gchar *name, FilterXVariableType type)
8230
{

0 commit comments

Comments
 (0)