• sysprg's avatar
    MDEV-17262: mysql crashed on galera while node rejoined cluster (#895) · 26432e49
    sysprg authored
    This patch contains a fix for the MDEV-17262/17243 issues and
    new mtr test.
    
    These issues (MDEV-17262/17243) have two reasons:
    
    1) After an intermediate commit, a transaction loses its status
    of "transaction that registered in the MySQL for 2pc coordinator"
    (in the InnoDB) due to the fact that since version 10.2 the
    write_row() function (which located in the ha_innodb.cc) does
    not call trx_register_for_2pc(m_prebuilt->trx) during the processing
    of split transactions. It is necessary to restore this call inside
    the write_row() when an intermediate commit was made (for a split
    transaction).
    
    Similarly, we need to set the flag of the started transaction
    (m_prebuilt->sql_stat_start) after intermediate commit.
    
    The table->file->extra(HA_EXTRA_FAKE_START_STMT) called from the
    wsrep_load_data_split() function (which located in sql_load.cc)
    will also do this, but it will be too late. As a result, the call
    to the wsrep_append_keys() function from the InnoDB engine may be
    lost or function may be called with invalid transaction identifier.
    
    2) If a transaction with the LOAD DATA statement is divided into
    logical mini-transactions (of the 10K rows) and binlog is rotated,
    then in rare cases due to the wsrep handler re-registration at the
    boundary of the split, the last portion of data may be lost. Since
    splitting of the LOAD DATA into mini-transactions is technical,
    I believe that we should not allow these mini-transactions to fall
    into separate binlogs. Therefore, it is necessary to prohibit the
    rotation of binlog in the middle of processing LOAD DATA statement.
    
    https://jira.mariadb.org/browse/MDEV-17262 and
    https://jira.mariadb.org/browse/MDEV-17243
    26432e49
galera_load_data_ist.result 978 Bytes