• Marko Mäkelä's avatar
    MDEV-22867 Assertion instant.n_core_fields == n_core_fields failed · 43120009
    Marko Mäkelä authored
    This is a race condition where a table on which a 10.3-style
    instant ADD COLUMN is emptied during the execution of
    ALTER TABLE ... DROP COLUMN ..., DROP INDEX ..., ALGORITHM=NOCOPY.
    
    In commit 2c4844c9 the
    function instant_metadata_lock() would prevent this race condition.
    But, it would also hold a page latch on the leftmost leaf page of
    clustered index for the duration of a possible DROP INDEX operation.
    
    The race could be fixed by restoring the function
    instant_metadata_lock() that was removed in
    commit ea37b144
    but it would be more future-proof to prevent the
    dict_index_t::clear_instant_add() call from being issued at all.
    
    We at some point support DROP COLUMN ..., ADD INDEX ..., ALGORITHM=NOCOPY
    and that would spend a non-trivial amount of
    execution time in ha_innobase::inplace_alter(),
    making a server hang possible. Currently this is not supported
    and our added test case will notice when the support is introduced.
    
    dict_index_t::must_avoid_clear_instant_add(): Determine if
    a call to clear_instant_add() must be avoided.
    
    btr_discard_only_page_on_level(): Preserve the metadata record
    if must_avoid_clear_instant_add() holds.
    
    btr_cur_optimistic_delete_func(), btr_cur_pessimistic_delete():
    Do not remove the metadata record even if the table becomes empty
    but must_avoid_clear_instant_add() holds.
    
    btr_pcur_store_position(): Relax a debug assertion.
    
    This is joint work with Thirunarayanan Balathandayuthapani.
    43120009
btr0btr.cc 151 KB