• Marko Mäkelä's avatar
    MDEV-12602 InnoDB: Failing assertion: space->n_pending_ops == 0 · b82c602d
    Marko Mäkelä authored
    This fixes a regression caused by MDEV-12428.
    When we introduced a variant of fil_space_acquire() that could
    increment space->n_pending_ops after space->stop_new_ops was set,
    the logic of fil_check_pending_operations() was broken.
    
    fil_space_t::n_pending_ios: A new field to track read or write
    access from the buffer pool routines immediately before a block
    write or after a block read in the file system.
    
    fil_space_acquire_for_io(), fil_space_release_for_io(): Similar
    to fil_space_acquire_silent() and fil_space_release(), but
    modify fil_space_t::n_pending_ios instead of fil_space_t::n_pending_ops.
    
    Adjust a number of places accordingly, and remove some redundant
    tablespace lookups.
    
    The following parts of this fix differ from the 10.2 version of this fix:
    
    buf_page_get_corrupt(): Add a tablespace parameter.
    
    In 10.2, we already had a two-phase process of freeing fil_space objects
    (first, fil_space_detach(), then release fil_system->mutex, and finally
    free the fil_space and fil_node objects).
    
    fil_space_free_and_mutex_exit(): Renamed from fil_space_free().
    Detach the tablespace from the fil_system cache, release the
    fil_system->mutex, and then wait for space->n_pending_ios to reach 0,
    to avoid accessing freed data in a concurrent thread.
    During the wait, future calls to fil_space_acquire_for_io() will
    not find this tablespace, and the count can only be decremented to 0,
    at which point it is safe to free the objects.
    
    fil_node_free_part1(), fil_node_free_part2(): Refactored from
    fil_node_free().
    b82c602d
fil0crypt.cc 71.7 KB