]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Add most data_stack_grow event fields before checking if event is wanted
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 22 Sep 2021 09:14:08 +0000 (12:14 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 22 Sep 2021 11:11:23 +0000 (11:11 +0000)
This allows using e.g. "event=data_stack_grow and alloc_size > 32768" as
an event filter.

src/lib/data-stack.c

index 70de38f3965c07e61c4682101cc5617fb8b16d73..1f68583ab28380df2b261a33405b58e75103142f 100644 (file)
@@ -405,12 +405,6 @@ static void data_stack_send_grow_event(size_t last_alloc_size)
        if (event_datastack == NULL)
                event_datastack = event_create(NULL);
        event_set_name(event_datastack, "data_stack_grow");
-       if (!event_want_debug(event_datastack))
-               return;
-
-       const char *backtrace;
-       if (backtrace_get(&backtrace) == 0)
-               event_add_str(event_datastack, "backtrace", backtrace);
        event_add_int(event_datastack, "alloc_size", data_stack_get_alloc_size());
        event_add_int(event_datastack, "used_size", data_stack_get_used_size());
        event_add_int(event_datastack, "last_alloc_size", last_alloc_size);
@@ -423,6 +417,20 @@ static void data_stack_send_grow_event(size_t last_alloc_size)
 #endif
        event_add_str(event_datastack, "frame_marker", current_frame->marker);
 
+       /* It's possible that the data stack gets grown and shrunk rapidly.
+          Try to avoid doing expensive work if the event isn't even used for
+          anything. Note that at this point all the event fields must be
+          set already that might potentially be used by the filters. */
+       if (!event_want_debug(event_datastack))
+               return;
+
+       /* Getting backtrace is potentially inefficient, so do it after
+          checking if the event is wanted. Note that this prevents using the
+          backtrace field in event field comparisons. */
+       const char *backtrace;
+       if (backtrace_get(&backtrace) == 0)
+               event_add_str(event_datastack, "backtrace", backtrace);
+
        string_t *str = t_str_new(128);
        str_printfa(str, "total_used=%zu, total_alloc=%zu, last_alloc_size=%zu",
                    data_stack_get_used_size(),