Skip to content

updateNurseryStats is racy

While working on !1603 (closed) I encountered the following race:

SUMMARY: ThreadSanitizer: data race rts/sm/Storage.c:1218 in updateNurseriesStats
==================
==================
WARNING: ThreadSanitizer: data race (pid=11536)
  Read of size 8 at 0x558000303948 by thread T9 (mutexes: write M15):
    #0 updateNurseriesStats rts/sm/Storage.c:1218 (ffi014+0x000000766262)
    #1 stat_startGC rts/Stats.c:315 (ffi014+0x00000073c804)
    #2 GarbageCollect rts/sm/GC.c:236 (ffi014+0x0000007569b7)
    #3 scheduleDoGC rts/Schedule.c:1806 (ffi014+0x000000735937)
    #4 schedule rts/Schedule.c:552 (ffi014+0x000000736b77)
    #5 scheduleWaitThread rts/Schedule.c:2549 (ffi014+0x0000007395dd)
    #6 rts_evalIO rts/RtsAPI.c:460 (ffi014+0x00000072d201)
    #7 zdmainzdMainzdMainzumkFunc <null> (ffi014+0x0000004140d5)
    #8 scheduleWaitThread rts/Schedule.c:2549 (ffi014+0x0000007395dd)
    #9 rts_evalStableIO rts/RtsAPI.c:511 (ffi014+0x00000072d446)
    #10 forkOS_createThreadWrapper rts/posix/OSThreads.c:224 (ffi014+0x000000769483)
    #11 <null> <null> (libtsan.so.0+0x000000028d5b)

  Previous write of size 8 at 0x558000303948 by main thread:
    #0 allocateMightFail rts/sm/Storage.c:961 (ffi014+0x000000764591)
    #1 allocate rts/sm/Storage.c:837 (ffi014+0x000000764b20)
    #2 createThread rts/Threads.c:83 (ffi014+0x00000074195a)
    #3 createStrictIOThread rts/RtsAPI.c:416 (ffi014+0x00000072cf5b)
    #4 rts_evalIO rts/RtsAPI.c:459 (ffi014+0x00000072d1f3)
    #5 zdmainzdMainzdMainzumkFunc <null> (ffi014+0x0000004140d5)
    #6 scheduleWaitThread rts/Schedule.c:2549 (ffi014+0x0000007395dd)
    #7 rts_evalLazyIO rts/RtsAPI.c:530 (ffi014+0x00000072d521)
    #8 hs_main rts/RtsMain.c:72 (ffi014+0x000000730ab5)
    #9 main <null> (ffi014+0x000000414232)

  Mutex M15 (0x0000009148e0) created at:
    #0 pthread_mutex_init <null> (libtsan.so.0+0x00000002c81e)
    #1 initMutex rts/posix/OSThreads.c:170 (ffi014+0x000000769697)
    #2 initStorage rts/sm/Storage.c:148 (ffi014+0x0000007638eb)
    #3 hs_init_ghc rts/RtsStartup.c:245 (ffi014+0x0000007318e0)
    #4 hs_main rts/RtsMain.c:57 (ffi014+0x000000730a8b)
    #5 main <null> (ffi014+0x000000414232)

  Thread T9 (tid=11697, running) created by main thread at:
    #0 pthread_create <null> (libtsan.so.0+0x00000002c010)
    #1 forkOS_createThread rts/posix/OSThreads.c:234 (ffi014+0x0000007697f3)
    #2 base_ControlziConcurrent_forkOS1_info <null> (ffi014+0x0000004169f2)
    #3 scheduleWaitThread rts/Schedule.c:2549 (ffi014+0x0000007395dd)
    #4 rts_evalLazyIO rts/RtsAPI.c:530 (ffi014+0x00000072d521)
    #5 hs_main rts/RtsMain.c:72 (ffi014+0x000000730ab5)
    #6 main <null> (ffi014+0x000000414232)

SUMMARY: ThreadSanitizer: data race rts/sm/Storage.c:1218 in updateNurseriesStats
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information