Comment 5 for bug 2019203

Revision history for this message
Danilo Egea Gondolfo (danilogondolfo) wrote :

The root cause appears to be this call sysconf(_SC_LEVEL1_DCACHE_LINESIZE);

https://github.com/mysql/mysql-server/blob/ea7087d885006918ad54458e7aad215b1650312c/sql/memory/aligned_atomic.h#L82

It returns 0 on armhf. In fact:

$ getconf -a | grep CACHE
LEVEL1_ICACHE_SIZE 0
LEVEL1_ICACHE_ASSOC 0
LEVEL1_ICACHE_LINESIZE 0
LEVEL1_DCACHE_SIZE 0
LEVEL1_DCACHE_ASSOC 0
LEVEL1_DCACHE_LINESIZE 0
LEVEL2_CACHE_SIZE 0
LEVEL2_CACHE_ASSOC 0
LEVEL2_CACHE_LINESIZE 0
LEVEL3_CACHE_SIZE 0
LEVEL3_CACHE_ASSOC 0
LEVEL3_CACHE_LINESIZE 0
LEVEL4_CACHE_SIZE 0
LEVEL4_CACHE_ASSOC 0
LEVEL4_CACHE_LINESIZE 0

Maybe the error checking in the next line should be "if (size <= 0) return 64;"?

This is the call chain

(gdb) bt
#0 memory::_cache_line_size () at ../../sql/memory/aligned_atomic.h:82
#1 memory::cache_line_size () at ../../sql/memory/aligned_atomic.h:102
#2 memory::_cacheline_for<std::atomic<long> > () at ../../sql/memory/aligned_atomic.h:116
#3 memory::minimum_cacheline_for<std::atomic<long> > () at ../../sql/memory/aligned_atomic.h:133
#4 memory::Aligned_atomic<long>::Aligned_atomic (this=0x308bd1c <delegates_init()::place_trans_mem+56>) at ../../sql/memory/aligned_atomic.h:309
#5 0x0176b764 in memory::Aligned_atomic<long>::Aligned_atomic (value=0, this=<optimized out>) at ../../sql/memory/aligned_atomic.h:315
#6 lock::Shared_spin_lock::Shared_spin_lock (this=<optimized out>) at ../../sql/locks/shared_spin_lock.h:170
#7 Delegate::Delegate (this=this@entry=0x308bce4 <delegates_init()::place_trans_mem>, key=0) at ../../sql/rpl_handler.cc:89
#8 0x0176b8a4 in Trans_delegate::Trans_delegate (this=0x308bce4 <delegates_init()::place_trans_mem>) at ../../sql/rpl_handler.h:285
#9 delegates_init () at ../../sql/rpl_handler.cc:363
#10 0x00ceb76c in init_server_components () at ../../sql/mysqld.cc:6211
#11 0x00cf03a4 in mysqld_main (argc=<optimized out>, argv=<optimized out>) at ../../sql/mysqld.cc:7832
#12 0xb653c7da in __libc_start_call_main (main=main@entry=0xca7c51 <main(int, char**)>, argc=argc@entry=3, argv=0xbefff604, argv@entry=0xb662e000) at ../sysdeps/nptl/libc_start_call_main.h:58
#13 0xb653c87e in __libc_start_main_impl (main=0xca7c51 <main(int, char**)>, argc=3, argv=0xb662e000, init=<optimized out>, fini=0x0, rtld_fini=0xb6fe5539 <_dl_fini>, stack_end=0xbefff604) at libc-start.c:360
#14 0x00cda0f8 in _start ()
(gdb) l
77 return line_size;
78 }
79
80 #elif defined(__linux__)
81 static inline size_t _cache_line_size() {
82 long size = sysconf(_SC_LEVEL1_DCACHE_LINESIZE);
83 if (size == -1) return 64;
84 #if defined(__s390x__)
85 // returns 0 on s390x RHEL 7.x
86 if (size == 0) {