diff options
Diffstat (limited to 'storage/innobase/log/log0recv.cc')
-rw-r--r-- | storage/innobase/log/log0recv.cc | 210 |
1 files changed, 90 insertions, 120 deletions
diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index f3a00e7b5e6..e48e185274a 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -717,7 +717,7 @@ loop: = (ulint) (source_offset / univ_page_size.physical()); fil_io(IORequestLogRead, true, - page_id_t(group->space_id, page_no), + page_id_t(SRV_LOG_SPACE_FIRST_ID, page_no), univ_page_size, (ulint) (source_offset % univ_page_size.physical()), len, buf, NULL); @@ -787,20 +787,13 @@ recv_synchronize_groups() const lsn_t start_lsn = ut_uint64_align_down(recovered_lsn, OS_FILE_LOG_BLOCK_SIZE); - log_group_read_log_seg(log_sys->buf, - UT_LIST_GET_FIRST(log_sys->log_groups), + log_group_read_log_seg(log_sys->buf, &log_sys->log, start_lsn, start_lsn + OS_FILE_LOG_BLOCK_SIZE); - ut_ad(UT_LIST_GET_LEN(log_sys->log_groups) == 1); + /* Update the fields in the group struct to correspond to + recovered_lsn */ - for (log_group_t* group = UT_LIST_GET_FIRST(log_sys->log_groups); - group; - group = UT_LIST_GET_NEXT(log_groups, group)) { - /* Update the fields in the group struct to correspond to - recovered_lsn */ - - log_group_set_fields(group, recovered_lsn); - } + log_group_set_fields(&log_sys->log, recovered_lsn); /* Copy the checkpoint info to the log; remember that we have incremented checkpoint_no by one, and the info will not be written @@ -831,17 +824,14 @@ recv_check_log_header_checksum( @return error code or DB_SUCCESS */ static MY_ATTRIBUTE((warn_unused_result)) dberr_t -recv_find_max_checkpoint_0( - log_group_t** max_group, - ulint* max_field) +recv_find_max_checkpoint_0(log_group_t** max_group, ulint* max_field) { - log_group_t* group = UT_LIST_GET_FIRST(log_sys->log_groups); + log_group_t* group = &log_sys->log; ib_uint64_t max_no = 0; ib_uint64_t checkpoint_no; byte* buf = log_sys->checkpoint_buf; ut_ad(group->format == 0); - ut_ad(UT_LIST_GET_NEXT(log_groups, group) == NULL); /** Offset of the first checkpoint checksum */ static const uint CHECKSUM_1 = 288; @@ -852,6 +842,8 @@ recv_find_max_checkpoint_0( /** Least significant bits of the checkpoint offset */ static const uint OFFSET_LOW32 = 16; + *max_group = NULL; + for (ulint field = LOG_CHECKPOINT_1; field <= LOG_CHECKPOINT_2; field += LOG_CHECKPOINT_2 - LOG_CHECKPOINT_1) { log_group_header_read(group, field); @@ -883,9 +875,8 @@ recv_find_max_checkpoint_0( } DBUG_PRINT("ib_log", - ("checkpoint " UINT64PF " at " LSN_PF - " found in group " ULINTPF, - checkpoint_no, group->lsn, group->id)); + ("checkpoint " UINT64PF " at " LSN_PF " found", + checkpoint_no, group->lsn)); if (checkpoint_no >= max_no) { *max_group = group; @@ -916,7 +907,7 @@ dberr_t recv_log_format_0_recover(lsn_t lsn) { log_mutex_enter(); - log_group_t* group = UT_LIST_GET_FIRST(log_sys->log_groups); + log_group_t* group = &log_sys->log; const lsn_t source_offset = log_group_calc_lsn_offset(lsn, group); log_mutex_exit(); @@ -932,7 +923,7 @@ recv_log_format_0_recover(lsn_t lsn) REFMAN "upgrading.html"; fil_io(IORequestLogRead, true, - page_id_t(group->space_id, page_no), + page_id_t(SRV_LOG_SPACE_FIRST_ID, page_no), univ_page_size, (ulint) ((source_offset & ~(OS_FILE_LOG_BLOCK_SIZE - 1)) % univ_page_size.physical()), @@ -968,14 +959,10 @@ recv_log_format_0_recover(lsn_t lsn) } /** Find the latest checkpoint in the log header. -@param[out] max_group log group, or NULL @param[out] max_field LOG_CHECKPOINT_1 or LOG_CHECKPOINT_2 @return error code or DB_SUCCESS */ -static MY_ATTRIBUTE((warn_unused_result)) dberr_t -recv_find_max_checkpoint( - log_group_t** max_group, - ulint* max_field) +recv_find_max_checkpoint(ulint* max_field) { log_group_t* group; ib_uint64_t max_no; @@ -983,101 +970,92 @@ recv_find_max_checkpoint( ulint field; byte* buf; - group = UT_LIST_GET_FIRST(log_sys->log_groups); + group = &log_sys->log; max_no = 0; - *max_group = NULL; *max_field = 0; buf = log_sys->checkpoint_buf; - while (group) { - group->state = LOG_GROUP_CORRUPTED; + group->state = LOG_GROUP_CORRUPTED; - log_group_header_read(group, 0); - /* Check the header page checksum. There was no - checksum in the first redo log format (version 0). */ - group->format = mach_read_from_4(buf + LOG_HEADER_FORMAT); - if (group->format != 0 - && !recv_check_log_header_checksum(buf)) { - ib::error() << "Invalid redo log header checksum."; - return(DB_CORRUPTION); - } + log_group_header_read(group, 0); + /* Check the header page checksum. There was no + checksum in the first redo log format (version 0). */ + group->format = mach_read_from_4(buf + LOG_HEADER_FORMAT); + if (group->format != 0 + && !recv_check_log_header_checksum(buf)) { + ib::error() << "Invalid redo log header checksum."; + return(DB_CORRUPTION); + } - switch (group->format) { - case 0: - return(recv_find_max_checkpoint_0( - max_group, max_field)); - case LOG_HEADER_FORMAT_CURRENT: - case LOG_HEADER_FORMAT_CURRENT | LOG_HEADER_FORMAT_ENCRYPTED: - break; - default: - /* Ensure that the string is NUL-terminated. */ - buf[LOG_HEADER_CREATOR_END] = 0; - ib::error() << "Unsupported redo log format." - " The redo log was created" - " with " << buf + LOG_HEADER_CREATOR << - ". Please follow the instructions at " - REFMAN "upgrading-downgrading.html"; - /* Do not issue a message about a possibility - to cleanly shut down the newer server version - and to remove the redo logs, because the - format of the system data structures may - radically change after MySQL 5.7. */ - return(DB_ERROR); - } + switch (group->format) { + case 0: + return(recv_find_max_checkpoint_0(&group, max_field)); + case LOG_HEADER_FORMAT_CURRENT: + case LOG_HEADER_FORMAT_CURRENT | LOG_HEADER_FORMAT_ENCRYPTED: + break; + default: + /* Ensure that the string is NUL-terminated. */ + buf[LOG_HEADER_CREATOR_END] = 0; + ib::error() << "Unsupported redo log format." + " The redo log was created" + " with " << buf + LOG_HEADER_CREATOR << + ". Please follow the instructions at " + REFMAN "upgrading-downgrading.html"; + /* Do not issue a message about a possibility + to cleanly shut down the newer server version + and to remove the redo logs, because the + format of the system data structures may + radically change after MySQL 5.7. */ + return(DB_ERROR); + } - for (field = LOG_CHECKPOINT_1; field <= LOG_CHECKPOINT_2; - field += LOG_CHECKPOINT_2 - LOG_CHECKPOINT_1) { + for (field = LOG_CHECKPOINT_1; field <= LOG_CHECKPOINT_2; + field += LOG_CHECKPOINT_2 - LOG_CHECKPOINT_1) { - log_group_header_read(group, field); + log_group_header_read(group, field); - const ulint crc32 = log_block_calc_checksum_crc32(buf); - const ulint cksum = log_block_get_checksum(buf); + const ulint crc32 = log_block_calc_checksum_crc32(buf); + const ulint cksum = log_block_get_checksum(buf); - if (crc32 != cksum) { - DBUG_PRINT("ib_log", - ("invalid checkpoint," - " group " ULINTPF " at " ULINTPF - ", checksum %x expected %x", - group->id, field, - (unsigned) cksum, - (unsigned) crc32)); - continue; - } + if (crc32 != cksum) { + DBUG_PRINT("ib_log", + ("invalid checkpoint," + " at " ULINTPF + ", checksum " ULINTPFx + " expected " ULINTPFx, + field, cksum, crc32)); + continue; + } - if (group->is_encrypted() - && !log_crypt_read_checkpoint_buf(buf)) { - ib::error() << "Reading checkpoint" - " encryption info failed."; - continue; - } + if (group->is_encrypted() + && !log_crypt_read_checkpoint_buf(buf)) { + ib::error() << "Reading checkpoint" + " encryption info failed."; + continue; + } + + group->state = LOG_GROUP_OK; - group->state = LOG_GROUP_OK; + group->lsn = mach_read_from_8( + buf + LOG_CHECKPOINT_LSN); + group->lsn_offset = mach_read_from_8( + buf + LOG_CHECKPOINT_OFFSET); + checkpoint_no = mach_read_from_8( + buf + LOG_CHECKPOINT_NO); - group->lsn = mach_read_from_8( - buf + LOG_CHECKPOINT_LSN); - group->lsn_offset = mach_read_from_8( - buf + LOG_CHECKPOINT_OFFSET); - checkpoint_no = mach_read_from_8( - buf + LOG_CHECKPOINT_NO); + DBUG_PRINT("ib_log", + ("checkpoint " UINT64PF " at " LSN_PF " found ", + checkpoint_no, group->lsn)); - DBUG_PRINT("ib_log", - ("checkpoint " UINT64PF " at " LSN_PF - " found in group " ULINTPF, - checkpoint_no, group->lsn, group->id)); - - if (checkpoint_no >= max_no) { - *max_group = group; - *max_field = field; - max_no = checkpoint_no; - } + if (checkpoint_no >= max_no) { + *max_field = field; + max_no = checkpoint_no; } - - group = UT_LIST_GET_NEXT(log_groups, group); } - if (*max_group == NULL) { + if (*max_field == 0) { /* Before 5.7.9, we could get here during database initialization if we created an ib_logfile0 file that was filled with zeroes, and were killed. After @@ -1798,8 +1776,7 @@ recv_recover_page(bool just_read_in, buf_block_t* block) while (recv) { end_lsn = recv->end_lsn; - ut_ad(end_lsn - <= UT_LIST_GET_FIRST(log_sys->log_groups)->scanned_lsn); + ut_ad(end_lsn <= log_sys->log.scanned_lsn); if (recv->len > RECV_DATA_BLOCK_SIZE) { /* We have to copy the record body to a separate @@ -2988,10 +2965,9 @@ recv_group_scan_log_recs( DBUG_RETURN(false); } - DBUG_PRINT("ib_log", ("%s " LSN_PF - " completed for log group " ULINTPF, + DBUG_PRINT("ib_log", ("%s " LSN_PF " completed", last_phase ? "rescan" : "scan", - group->scanned_lsn, group->id)); + group->scanned_lsn)); DBUG_RETURN(store_to_hash == STORE_NO); } @@ -3142,11 +3118,9 @@ recv_init_crash_recovery_spaces() of first system tablespace page @return error code or DB_SUCCESS */ dberr_t -recv_recovery_from_checkpoint_start( - lsn_t flush_lsn) +recv_recovery_from_checkpoint_start(lsn_t flush_lsn) { log_group_t* group; - log_group_t* max_cp_group; ulint max_cp_field; lsn_t checkpoint_lsn; bool rescan; @@ -3172,14 +3146,14 @@ recv_recovery_from_checkpoint_start( /* Look for the latest checkpoint from any of the log groups */ - err = recv_find_max_checkpoint(&max_cp_group, &max_cp_field); + err = recv_find_max_checkpoint(&max_cp_field); if (err != DB_SUCCESS) { log_mutex_exit(); return(err); } - log_group_header_read(max_cp_group, max_cp_field); + log_group_header_read(&log_sys->log, max_cp_field); buf = log_sys->checkpoint_buf; @@ -3194,8 +3168,7 @@ recv_recovery_from_checkpoint_start( ut_ad(RECV_SCAN_SIZE <= log_sys->buf_size); - ut_ad(UT_LIST_GET_LEN(log_sys->log_groups) == 1); - group = UT_LIST_GET_FIRST(log_sys->log_groups); + group = &log_sys->log; const lsn_t end_lsn = mach_read_from_8( buf + LOG_CHECKPOINT_END_LSN); @@ -3483,11 +3456,8 @@ recv_reset_logs( log_sys->lsn = ut_uint64_align_up(lsn, OS_FILE_LOG_BLOCK_SIZE); - for (log_group_t* group = UT_LIST_GET_FIRST(log_sys->log_groups); - group; group = UT_LIST_GET_NEXT(log_groups, group)) { - group->lsn = log_sys->lsn; - group->lsn_offset = LOG_FILE_HDR_SIZE; - } + log_sys->log.lsn = log_sys->lsn; + log_sys->log.lsn_offset = LOG_FILE_HDR_SIZE; log_sys->buf_next_to_write = 0; log_sys->write_lsn = log_sys->lsn; |