Skip to content

Fix data race due concurrent write to event_debug_mode_too_late#1839

Merged
azat merged 2 commits intolibevent:masterfrom
sokurenko:fix-event_debug_mode_too-concurrent-write
Mar 21, 2026
Merged

Fix data race due concurrent write to event_debug_mode_too_late#1839
azat merged 2 commits intolibevent:masterfrom
sokurenko:fix-event_debug_mode_too-concurrent-write

Conversation

@sokurenko
Copy link
Copy Markdown
Contributor

@sokurenko sokurenko commented Mar 12, 2026

It's not unusual that event_debug_mode_too_late variable is set before starting any threads, or threads started one after another or even if started concurrently, it will still be set once so chance of concurrent read/write will be very minimal, suggest to fix at least concurrent write/write case so that there are no never ending data race due to concurrent write anymore in case of real world scenario for example creating event base before starting threads.

This suppression can be removed: race:event_debug_mode_too_late

=1174787==  Lock at 0x890A640 was first observed
==1174787==    at 0x4894560: pthread_mutex_init (in /usr/libexec/valgrind/vgpreload_helgrind-arm64-linux.so)
==1174787==    by 0x402D077: evthread_posix_lock_alloc (evthread_pthread.c:57)
==1174787==    by 0x48E4DEF: event_base_new_with_config (event.c:731)
==1174787==    by 0x48E5023: event_base_new (event.c:532)
==1174787==    by 0x5234AF: zbx_ipc_async_socket_open (ipcservice.c:1818)
==1174787==    by 0x674CCB: zbx_rtc_subscribe (rtc_client.c:382)
==1174787==    by 0x212B7B: zbx_dbconfig_thread (dbconfig_server.c:88)
==1174787==    by 0x4892B93: ??? (in /usr/libexec/valgrind/vgpreload_helgrind-arm64-linux.so)
==1174787==    by 0x573595B: start_thread (pthread_create.c:447)
==1174787==    by 0x579B8DB: thread_start (clone.S:79)
==1174787==  Address 0x890a640 is 0 bytes inside a block of size 48 alloc'd
==1174787==    at 0x48873E0: malloc (in /usr/libexec/valgrind/vgpreload_helgrind-arm64-linux.so)
==1174787==    by 0x402D057: evthread_posix_lock_alloc (evthread_pthread.c:52)
==1174787==    by 0x48E4DEF: event_base_new_with_config (event.c:731)
==1174787==    by 0x48E5023: event_base_new (event.c:532)
==1174787==    by 0x5234AF: zbx_ipc_async_socket_open (ipcservice.c:1818)
==1174787==    by 0x674CCB: zbx_rtc_subscribe (rtc_client.c:382)
==1174787==    by 0x212B7B: zbx_dbconfig_thread (dbconfig_server.c:88)
==1174787==    by 0x4892B93: ??? (in /usr/libexec/valgrind/vgpreload_helgrind-arm64-linux.so)
==1174787==    by 0x573595B: start_thread (pthread_create.c:447)
==1174787==    by 0x579B8DB: thread_start (clone.S:79)
==1174787==  Block was alloc'd by thread #2
==1174787== 
==1174787== Possible data race during write of size 4 at 0x4900824 by thread #1
==1174787== Locks held: 1, at address 0x89056D0
==1174787==    at 0x48DEF6C: event_debug_note_del_ (event.c:337)
==1174787==    by 0x48DEF6C: event_del_nolock_ (event.c:2967)
==1174787==    by 0x48DF19B: event_del_ (event.c:2871)
==1174787==    by 0x48DF19B: event_del (event.c:2880)
==1174787==    by 0x522F47: zbx_ipc_service_recv (ipcservice.c:1657)
==1174787==    by 0x21263B: zbx_supervisor_thread (supervisor.c:1029)
==1174787==    by 0x524077: zbx_thread_start (threads.c:121)
==1174787==    by 0x1E7903: start_processes (server.c:1877)
==1174787==    by 0x1E8903: server_startup (server.c:2146)
==1174787==    by 0x1E9E03: MAIN_ZABBIX_ENTRY (server.c:2665)
==1174787==    by 0x677E33: zbx_daemon_start (daemon.c:377)
==1174787==    by 0x1E6B5B: main (server.c:1480)
==1174787== 
==1174787== This conflicts with a previous write of size 4 by thread #2
==1174787== Locks held: 1, at address 0x890A640
==1174787==    at 0x48DEF6C: event_debug_note_del_ (event.c:337)
==1174787==    by 0x48DEF6C: event_del_nolock_ (event.c:2967)
==1174787==    by 0x48DF19B: event_del_ (event.c:2871)
==1174787==    by 0x48DF19B: event_del (event.c:2880)
==1174787==    by 0x523AB3: zbx_ipc_async_socket_flush (ipcservice.c:2017)
==1174787==    by 0x674E4F: zbx_rtc_subscribe (rtc_client.c:404)
==1174787==    by 0x212B7B: zbx_dbconfig_thread (dbconfig_server.c:88)
==1174787==    by 0x4892B93: ??? (in /usr/libexec/valgrind/vgpreload_helgrind-arm64-linux.so)
==1174787==    by 0x573595B: start_thread (pthread_create.c:447)
==1174787==    by 0x579B8DB: thread_start (clone.S:79)
==1174787==  Address 0x4900824 is 0 bytes inside data symbol "event_debug_mode_too_late"

Fixes: #777

@sokurenko sokurenko requested a review from azat March 20, 2026 11:13
@azat azat changed the title fixed data race due concurrent write to event_debug_mode_too_late Fix data race due concurrent write to event_debug_mode_too_late Mar 20, 2026
sokurenko and others added 2 commits March 20, 2026 13:39
Usual pattern is event_base_new() and only after
event_assign()/event_add(), this patch operates on
event_debug_mode_too_late under a full lock, but subsequent
event_assign()/event_add() (that also needs to check debug mode) checks
it w/o lock, but set with lock holding
@azat azat force-pushed the fix-event_debug_mode_too-concurrent-write branch from c6b1843 to 8414543 Compare March 20, 2026 12:42
@azat azat merged commit a738f69 into libevent:master Mar 21, 2026
33 of 75 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

event_debug_mode_too_late is thread unsafe

2 participants