summaryrefslogtreecommitdiff
path: root/storage/innobase/log/log0recv.cc
diff options
context:
space:
mode:
Diffstat (limited to 'storage/innobase/log/log0recv.cc')
-rw-r--r--storage/innobase/log/log0recv.cc210
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;