Skip to content

Commit f18f71e

Browse files
committed
fix InnoDB data race
srv_last_monitor_time: make all accesses relaxed atomical WARNING: ThreadSanitizer: data race (pid=29031) Write of size 8 at 0x0000039e48e0 by thread T15: #0 srv_monitor_thread storage/innobase/srv/srv0srv.cc:1699:24 (mysqld+0x21a254e) Previous write of size 8 at 0x0000039e48e0 by thread T14: #0 srv_refresh_innodb_monitor_stats() storage/innobase/srv/srv0srv.cc:1165:24 (mysqld+0x21a3124) #1 srv_error_monitor_thread storage/innobase/srv/srv0srv.cc:1836:3 (mysqld+0x21a2d40) Location is global 'srv_last_monitor_time' of size 8 at 0x0000039e48e0 (mysqld+0x0000039e48e0) Thread T15 (tid=29050, running) created by main thread at: #0 pthread_create /home/kevg/fun/cpp_projects/llvm_toolchain/llvm/projects/compiler-rt/lib/tsan/rtl/tsan_interceptors.cc:992 (mysqld+0xb90016) #1 os_thread_create_func(void* (*)(void*), void*, unsigned long*) storage/innobase/os/os0thread.cc:137:12 (mysqld+0x1f50025) #2 innobase_start_or_create_for_mysql() storage/innobase/srv/srv0start.cc:2583:46 (mysqld+0x21b50b7) #3 innobase_init(void*) storage/innobase/handler/ha_innodb.cc:4193:8 (mysqld+0x1a5e3d7) #4 ha_initialize_handlerton(st_plugin_int*) sql/handler.cc:522:31 (mysqld+0xc74d33) #5 plugin_initialize(st_mem_root*, st_plugin_int*, int*, char**, bool) sql/sql_plugin.cc:1447:9 (mysqld+0x1376d5d) #6 plugin_init(int*, char**, int) sql/sql_plugin.cc:1729:15 (mysqld+0x13761c0) #7 init_server_components() sql/mysqld.cc:5348:7 (mysqld+0xc0d0ff) #8 mysqld_main(int, char**) sql/mysqld.cc:5943:7 (mysqld+0xc06f9d) #9 main sql/main.cc:25:10 (mysqld+0xbff71b)
1 parent 147ec14 commit f18f71e

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

storage/innobase/srv/srv0srv.cc

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,7 +1162,8 @@ srv_refresh_innodb_monitor_stats(void)
11621162
{
11631163
mutex_enter(&srv_innodb_monitor_mutex);
11641164

1165-
srv_last_monitor_time = time(NULL);
1165+
my_atomic_store32_explicit(&srv_last_monitor_time, time(NULL),
1166+
MY_MEMORY_ORDER_RELAXED);
11661167

11671168
os_aio_refresh_stats();
11681169

@@ -1216,10 +1217,14 @@ srv_printf_innodb_monitor(
12161217
by zero if two users happen to call SHOW ENGINE INNODB STATUS at the
12171218
same time */
12181219

1219-
time_elapsed = difftime(current_time, srv_last_monitor_time)
1220+
time_elapsed =
1221+
difftime(current_time,
1222+
my_atomic_load32_explicit(&srv_last_monitor_time,
1223+
MY_MEMORY_ORDER_RELAXED))
12201224
+ 0.001;
12211225

1222-
srv_last_monitor_time = time(NULL);
1226+
my_atomic_store32_explicit(&srv_last_monitor_time, time(NULL),
1227+
MY_MEMORY_ORDER_RELAXED);
12231228

12241229
fputs("\n=====================================\n", file);
12251230

@@ -1696,7 +1701,8 @@ DECLARE_THREAD(srv_monitor_thread)(void*)
16961701
pfs_register_thread(srv_monitor_thread_key);
16971702
#endif /* UNIV_PFS_THREAD */
16981703

1699-
srv_last_monitor_time = ut_time();
1704+
my_atomic_store32_explicit(&srv_last_monitor_time, ut_time(),
1705+
MY_MEMORY_ORDER_RELAXED);
17001706
last_monitor_time = ut_time();
17011707
mutex_skipped = 0;
17021708
last_srv_print_monitor = srv_print_innodb_monitor;
@@ -1829,7 +1835,10 @@ DECLARE_THREAD(srv_error_monitor_thread)(void*)
18291835
old_lsn = new_lsn;
18301836
}
18311837

1832-
if (difftime(time(NULL), srv_last_monitor_time) > 60) {
1838+
if (difftime(time(NULL),
1839+
my_atomic_load32_explicit(&srv_last_monitor_time,
1840+
MY_MEMORY_ORDER_RELAXED))
1841+
> 60) {
18331842
/* We referesh InnoDB Monitor values so that averages are
18341843
printed from at most 60 last seconds */
18351844

0 commit comments

Comments
 (0)