• Marko Mäkelä's avatar
    MDEV-12103 Reduce the time of looking for MLOG_CHECKPOINT during crash recovery · ab8199f3
    Marko Mäkelä authored
    This fixes MySQL Bug#80788 in MariaDB 10.2.5.
    
    When I made the InnoDB crash recovery more robust by implementing
    WL#7142, I also introduced an extra redo log scan pass that can be
    shortened.
    
    This fix will slightly extend the InnoDB redo log format that I
    introduced in MySQL 5.7.9 by writing the start LSN of the MLOG_CHECKPOINT
    mini-transaction to the end of the log checkpoint page, so that recovery
    can jump straight to it without scanning all the preceding redo log.
    
    LOG_CHECKPOINT_END_LSN: At the end of the checkpoint page, the start LSN
    of the MLOG_CHECKPOINT mini-transaction. Previously, these bytes were
    written as 0.
    
    log_write_checkpoint_info(), log_group_checkpoint(): Add the parameter
    end_lsn for writing LOG_CHECKPOINT_END_LSN.
    
    log_checkpoint(): Remember the LSN at which the MLOG_CHECKPOINT
    mini-transaction is starting (or at which the redo log ends on
    shutdown).
    
    recv_init_crash_recovery(): Remove.
    
    recv_group_scan_log_recs(): Add the parameter checkpoint_lsn.
    
    recv_recovery_from_checkpoint_start(): Read LOG_CHECKPOINT_END_LSN
    and if it is set, start the first scan from it instead of the
    checkpoint LSN. Improve some messages and remove bogus assertions.
    
    recv_parse_log_recs(): Do not skip DBUG_PRINT("ib_log") for some
    file-level redo log records.
    
    recv_parse_or_apply_log_rec_body(): If we have not parsed all redo
    log between the checkpoint and the corresponding MLOG_CHECKPOINT
    record, defer the check for MLOG_FILE_DELETE or MLOG_FILE_NAME records
    to recv_init_crash_recovery_spaces().
    
    recv_init_crash_recovery_spaces(): Refuse recovery if
    MLOG_FILE_NAME or MLOG_FILE_DELETE records are missing.
    ab8199f3
log0log.h 28.2 KB