• Marko Mäkelä's avatar
    MDEV-24302 follow-up: RESET MASTER hangs · 8c2e3259
    Marko Mäkelä authored
    As pointed out by Andrei Elkin, the previous fix did not fix one
    race condition that may have caused the observed hang.
    
    innodb_log_flush_request(): If we are enqueueing the very first
    request at the same time the log write is being completed,
    we must ensure that a near-concurrent call to log_flush_notify()
    will not result in a missed notification. We guarantee this by
    release-acquire operations on log_requests.start and
    log_sys.flushed_to_disk_lsn.
    
    log_flush_notify_and_unlock(): Cleanup: Always release the mutex.
    
    log_sys_t::get_flushed_lsn(): Use acquire memory order.
    
    log_sys_t::set_flushed_lsn(): Use release memory order.
    
    log_sys_t::set_lsn(): Use release memory order.
    
    log_sys_t::get_lsn(): Use relaxed memory order by default, and
    allow the caller to specify acquire memory order explicitly.
    Whenever the log_sys.mutex is being held or when log writes are
    prohibited during startup, we can use a relaxed load. Likewise,
    in some assertions where reading a stale value of log_sys.lsn
    should not matter, we can use a relaxed load.
    
    This will cause some additional instructions to be emitted on
    architectures that do not implement Total Store Ordering (TSO),
    such as POWER, ARM, and RISC-V Weak Memory Ordering (RVWMO).
    8c2e3259
srv0srv.cc 64.9 KB