bin: compile lttng-consumerd as a C++ Same as the previous commits, but change lttng-consumerd to be a C++ program. Function lttng_consumer_get_type is dlsym-ed by tests/regression/tools/notification/consumer_testpoints.c, so we have two choices: make the dlsym use the mangled name or make the function have a C linkage name. The latter is better, because the mangled name is implementation-defined, and therefore more fragile. Change-Id: I1986e38c193a935721e52c89426c89fd434ccd6b Signed-off-by: Simon Marchi <simon.marchi@efficios.com> Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Force usage of assert() condition when NDEBUG is defined Reuse the BT2 approach to force the usage of the assertion condition even when assert() are removed by the NDEBUG define. See `BT_USE_EXPR()` macro and documentation in Babeltrace commit[0]: commit 1778c2a4134647150b199b2b57130817144446b0 Author: Philippe Proulx <eeppeliteloop@gmail.com> Date: Tue Apr 21 11:15:42 2020 -0400 lib: assign a unique ID to each pre/postcond. and report it on failure 0: https://github.com/efficios/babeltrace/commit/1778c2a4134647150b199b2b57130817144446b0 Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com> Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com> Change-Id: I3844b6ae7e95952d90033898397ac936540b785c
Move to kernel style SPDX license identifiers The SPDX identifier is a legally binding shorthand, which can be used instead of the full boiler plate text. See https://spdx.org/ids-how for details. Signed-off-by: Michael Jeanson <mjeanson@efficios.com> Change-Id: I62e7038e191a061286abcef5550b58f5ee67149d Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Fix: getgrnam is not MT-Safe, use getgrnam_r Running the test suite under a Yocto musl build resulted in musl coredump due to double freeing. We get the following backtraces: 0 a_crash () at ./arch/x86_64/atomic_arch.h:108 1 unmap_chunk (self=<optimized out>) at src/malloc/malloc.c:515 2 free (p=<optimized out>) at src/malloc/malloc.c:526 3 0x00007f46d9dc3849 in __getgrent_a (f=f@entry=0x7f46d9d1f7e0, gr=gr@entry=0x7f46d9e24460 <gr>, line=line@entry=0x7f46d9e26058 <line>, size=size@entry=0x7f46d92db550, mem=mem@entry=0x7f46d9e26050 <mem>, nmem=nmem@entry=0x7f46d92db558, res=0x7f46d92db548) at src/passwd/getgrent_a.c:45 4 0x00007f46d9dc2e6b in __getgr_a (name=0x487242 "tracing", gid=gid@entry=0, gr=gr@entry=0x7f46d9e24460 <gr>, buf=buf@entry=0x7f46d9e26058 <line>, size=size@entry=0x7f46d92db550, mem=mem@entry=0x7f46d9e26050 <mem>, nmem=0x7f46d92db558, res=0x7f46d92db548) at src/passwd/getgr_a.c:30 5 0x00007f46d9dc3733 in getgrnam (name=<optimized out>) at src/passwd/getgrent.c:37 6 0x0000000000460b29 in utils_get_group_id (name=<optimized out>) at ../../../lttng-tools-2.10.6/src/common/utils.c:1241 7 0x000000000044ee69 in thread_manage_health (data=<optimized out>) at ../../../../lttng-tools-2.10.6/src/bin/lttng-sessiond/main.c:4115 8 0x00007f46d9de1541 in start (p=<optimized out>) at src/thread/pthread_create.c:195 9 0x00007f46d9dee661 in __clone () at src/thread/x86_64/clone.s:22 From another run: 0 a_crash () at ./arch/x86_64/atomic_arch.h:108 1 unmap_chunk (self=<optimized out>) at src/malloc/malloc.c:515 2 free (p=<optimized out>) at src/malloc/malloc.c:526 3 0x00007f5abc210849 in __getgrent_a (f=f@entry=0x7f5abc2733e0, gr=gr@entry=0x7f5abc271460 <gr>, line=line@entry=0x7f5abc273058 <line>, size=size@entry=0x7f5abaef5510, mem=mem@entry=0x7f5abc273050 <mem>, nmem=nmem@entry=0x7f5abaef5518, res=0x7f5abaef5508) at src/passwd/getgrent_a.c:45 4 0x00007f5abc20fe6b in __getgr_a (name=0x487242 "tracing", gid=gid@entry=0, gr=gr@entry=0x7f5abc271460 <gr>, buf=buf@entry=0x7f5abc273058 <line>, size=size@entry=0x7f5abaef5510, mem=mem@entry=0x7f5abc273050 <mem>, nmem=0x7f5abaef5518, res=0x7f5abaef5508) at src/passwd/getgr_a.c:30 5 0x00007f5abc210733 in getgrnam (name=<optimized out>) at src/passwd/getgrent.c:37 6 0x0000000000460b29 in utils_get_group_id (name=<optimized out>) at ../../../lttng-tools-2.10.6/src/common/utils.c:1241 7 0x000000000042dee4 in notification_channel_socket_create () at ../../../../lttng-tools-2.10.6/src/bin/lttng-sessiond/notification-thread.c:238 8 init_thread_state (state=0x7f5abaef5560, handle=0x7f5abbf9be40) at ../../../../lttng-tools-2.10.6/src/bin/lttng-sessiond/notification-thread.c:375 9 thread_notification (data=0x7f5abbf9be40) at ../../../../lttng-tools-2.10.6/src/bin/lttng-sessiond/notification-thread.c:495 10 0x00007f5abc22e541 in start (p=<optimized out>) at src/thread/pthread_create.c:195 11 0x00007f5abc23b661 in __clone () at src/thread/x86_64/clone.s:22 The problem was easily reproducible (~6 crash on ~300 runs). A prototype fix using mutex around the getgrnam yielded no crash in over 1000 runs. This patch yielded the same results as the prototype fix. Unfortunately we cannot rely on a mutex in liblttng-ctl since we cannot enforce the locking for the application using the lib. Use getgrnam_r instead. The previous implementation of utils_get_group_id returned the gid of the root group (0) on error/not found. lttng_check_tracing_group needs to know if an error/not found occured, returning the root group is not enough. We now return the gid via the passed parameter. The caller is responsible for either defaulting to the root group or propagating the error. We also do not want to warn when used in liblttng-ctl context. We might want to move the warning elsewhere in the future. For now, pass a bool if we need to warn or not. Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com> Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Fix: LPOLLHUP and LPOLLERR when there is still data in pipe/socket The event mask returned by poll/epoll is a bitwise mask made of all the events observed. On bidirectional sockets, there are cases where combinations of LPOLLHUP/LPOLLERR and LPOLLIN/LPOLLPRI can be raised at the same time. Currently the overall behavior in sessiond, consumerd and relayd is to handle LPOLLHUP or LPOLLERR immediately, whether or not there is still data to read in the socket. Unfortunately, this behavior may discard the last information made available on the pipe or socket. Audit all uses of LPOLLHUP and LPOLLERR on sockets on which we expect data to ensure that we deal with LPOLLIN or LPOLLPRI, and catch the hangup when read or recvmsg returns 0. Keep the LPOLLHUP and LPOLLERR handling, but only when LPOLLIN is not raised, just in case some unforeseen error happens when sending the reply. This is one correct case where we can handle LPOLLHUP and LPOLLERR directly without caring about LPOLLIN: sockets where we are expected to write and then read the reply (e.g. command sockets). It is then OK for a dedicated thread to watch for LPOLLHUP and LPOLLERR. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Fix: compat poll: add missing empty revents checks Poll returns the entire array, including entries that have no activity. We need to check them explicitly. Fixes #747 Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Fix: define _LGPL_SOURCE in C files Defining this in headers is a bad practice, since the header is not necessarily the first in the include list. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Fix: miscellaneous memory handling fixes Issues found with Valgrind: - Uninitialized memory sent through sendmsg, - Uninitialized realloc memory, - Erroneous pointer arithmetic in jul_list_events(), - Memory leaks in kernel_consumer_add_channel(), kernel_consumer_add_metadata(), - Memory leak (snapshot_destroy missing hash table cleanup), - Uninitialized poll/epoll memory on realloc. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: David Goulet <dgoulet@efficios.com>
Health check: implement health check query in sessiond and consumerd At this stage, tests/regression/tools/health/health_check queries sessiond and consumerd with the new API, however, the scripts using this program have not yet been changed, and are therefore expected to fail. Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>