• Marko Mäkelä's avatar
    MDEV-31354 SIGSEGV in log_sort_flush_list() in InnoDB crash recovery · 0d175968
    Marko Mäkelä authored
    log_sort_flush_list(): Wait for any pending page writes to cease
    before sorting the buf_pool.flush_list. Starting with
    commit 22b62eda (MDEV-25113),
    it is possible that some buf_page_t::oldest_modification_
    that we will be comparing in std::sort() will be updated from
    some value >2 to 1 while we are holding buf_pool.flush_list_mutex.
    
    To catch this type of trouble better in the future, we will clean
    garbage (pages that have been written out) from buf_pool.flush_list
    while constructing the array for sorting, and check with debug
    assertions that all blocks that we are copying from the array to the
    list will be dirty (requiring a writeback) while we sort and copy
    the array back to buf_pool.flush_list.
    
    This failure was observed by chance exactly once when running the test
    innodb.recovery_memory. It was never reproduced in the same form
    afterwards. Unrelated to this change, the test does occasionally
    reproduce a failure to start up InnoDB due to a corrupted page
    being read in recovery. The ticket MDEV-31791 was filed for that.
    
    Tested by: Matthias Leich
    0d175968
log0recv.cc 142 KB