Fix possible data-race StorageKafka with statistics_interval_ms>0

The problem here is that ignorelist did not work by some reason, if I
will look at the ignored functions it should not contain any TSan
interseption code, while it does:

    $ lldb-13 clickhouse
    (lldb) target create "clickhouse"
    disas -n rd_avg_rollover
    Current executable set to '/home/azat/ch/tmp/tsan-test/clickhouse' (x86_64).
    (lldb) disas -n rd_avg_rollover
    clickhouse`rd_kafka_stats_emit_avg:
    clickhouse[0x1cbf84a7] <+39>:  leaq   0x30(%r15), %r12
    clickhouse[0x1cbf84ab] <+43>:  movq   %r12, %rdi
    clickhouse[0x1cbf84ae] <+46>:  callq  0x1ccdad40                ; rdk_thread_mutex_lock at tinycthread.c:111
    clickhouse[0x1cbf84b3] <+51>:  leaq   0x58(%r15), %rdi
    clickhouse[0x1cbf84b7] <+55>:  callq  0x71b5390                 ; __tsan_read4
    clickhouse[0x1cbf84bc] <+60>:  cmpl   $0x0, 0x58(%r15)
    clickhouse[0x1cbf84c1] <+65>:  je     0x1cbf8595                ; <+277> [inlined] rd_avg_rollover + 238 at rdavg.h
    clickhouse[0x1cbf84c7] <+71>:  leaq   -0xc8(%rbp), %rdi
    clickhouse[0x1cbf84ce] <+78>:  xorl   %esi, %esi
    clickhouse[0x1cbf84d0] <+80>:  callq  0x1ccdac80                ; rdk_thread_mutex_init at tinycthread.c:62
    clickhouse[0x1cbf84d5] <+85>:  leaq   0x5c(%r15), %rdi
    clickhouse[0x1cbf84d9] <+89>:  callq  0x71b5390                 ; __tsan_read4

    (lldb) disas -n rd_avg_calc
    clickhouse`rd_kafka_broker_ops_io_serve:
    clickhouse[0x1cbdf086] <+1990>: leaq   0x5a4(%rbx), %rdi
    clickhouse[0x1cbdf08d] <+1997>: callq  0x71b5390                 ; __tsan_read4
    clickhouse[0x1cbdf092] <+2002>: cmpl   $0x0, 0x5a4(%rbx)
    clickhouse[0x1cbdf099] <+2009>: je     0x1cbdf12b                ; <+2155> [inlined] rd_kafka_broker_timeout_scan + 719 at rdkafka_broker.c

I guess the reason is that they had been inlined

So now rd_avg_calc() guarded with a mutex.

Refs: https://github.com/ClickHouse/librdkafka/pull/11
Fixes: https://github.com/ClickHouse/ClickHouse/issues/60939
Signed-off-by: Azat Khuzhin <a.khuzhin@semrush.com>
This commit is contained in:
Azat Khuzhin 2024-07-09 17:51:48 +02:00
parent 3319a5e6f8
commit 301ac5dab7
3 changed files with 3 additions and 4 deletions

2
contrib/librdkafka vendored

@ -1 +1 @@
Subproject commit 2d2aab6f5b79db1cfca15d7bf0dee75d00d82082 Subproject commit 39d4ed49ccf3406e2bf825d5d7b0903b5a290782

View File

@ -5,11 +5,9 @@
# #
# Caveats for generic entry "fun": # Caveats for generic entry "fun":
# - does not work for __attribute__((__always_inline__)) # - does not work for __attribute__((__always_inline__))
# - and may not work for functions that had been inlined
# - requires asterisk at the beginning *and* end for static functions # - requires asterisk at the beginning *and* end for static functions
# #
[thread] [thread]
# https://github.com/ClickHouse/ClickHouse/issues/55629 # https://github.com/ClickHouse/ClickHouse/issues/55629
fun:rd_kafka_broker_set_nodename fun:rd_kafka_broker_set_nodename
# https://github.com/ClickHouse/ClickHouse/issues/60443
fun:*rd_avg_calc*
fun:*rd_avg_rollover*

View File

@ -9,6 +9,7 @@
# #
# Caveats for generic entry "fun": # Caveats for generic entry "fun":
# - does not work for __attribute__((__always_inline__)) # - does not work for __attribute__((__always_inline__))
# - and may not work for functions that had been inlined
# - requires asterisk at the beginning *and* end for static functions # - requires asterisk at the beginning *and* end for static functions
# #
[undefined] [undefined]