• Marko Mäkelä's avatar
    MDEV-20852 BtrBulk is unnecessarily holding dict_index_t::lock · fa32d28f
    Marko Mäkelä authored
    The BtrBulk class, which was introduced in MySQL 5.7, is by design
    the exclusive writer to an index. It is therefore unnecessary to
    acquire the dict_index_t::lock in that code.
    
    Holding the dict_index_t::lock would unnecessarily block other threads
    (SQL connections and the InnoDB purge threads) from buffering concurrent
    modifications to being-created secondary indexes.
    
    This fix is motivated by a change in MySQL 5.7.28:
    Bug #29008298 MYSQLD CRASHES ITSELF WHEN CREATING INDEX
    mysql/mysql-server@f9fb96c20f9d190f654e7aa2387255bf80fd6e45
    
    PageBulk::init(), PageBulk::latch(): Never acquire m_index->lock.
    
    PageBulk::storeExt(): Remove some pointer indirection, and improve
    a debug assertion that seems to prove that some code is redundant.
    
    BtrBulk::pageCommit(): Assert that m_index->lock is not being held.
    
    btr_blob_log_check_t: Do not acquire m_index->lock if
    m_op == BTR_STORE_INSERT_BULK. Add UNIV_UNLIKELY hints around
    that condition.
    
    btr_store_big_rec_extern_fields(): Allow index->lock not to be held
    while op == BTR_STORE_INSERT_BULK. Add UNIV_UNLIKELY hints around
    that condition.
    fa32d28f
btr0cur.cc 229 KB