MDEV-21826 Recovery failure : loop of Read redo log up to LSN
- This issue is caused by MDEV-19176 (bba59abb039fee1a3ee72a25643ebb7a0b64f3c5). - Problem is that there is miscalculation of available memory during recovery if innodb_buffer_pool_instances > 1. - Ignore the buffer pool instance while calculating available_memory - Removed recv_n_pool_free_frames variable and use buf_pool_get_n_pages() instead.
This commit is contained in:
parent
6ecbb211c0
commit
09e8707d90
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1995, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2015, 2019, MariaDB Corporation.
|
Copyright (c) 2015, 2020, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
This program is free software; you can redistribute it and/or modify it under
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@ -925,8 +925,12 @@ buf_read_recv_pages(
|
|||||||
ulint count = 0;
|
ulint count = 0;
|
||||||
|
|
||||||
buf_pool = buf_pool_get(cur_page_id);
|
buf_pool = buf_pool_get(cur_page_id);
|
||||||
while (buf_pool->n_pend_reads >= recv_n_pool_free_frames / 2) {
|
ulint limit = 0;
|
||||||
|
for (ulint j = 0; j < buf_pool->n_chunks; j++) {
|
||||||
|
limit += buf_pool->chunks[j].size / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (buf_pool->n_pend_reads >= limit) {
|
||||||
os_aio_simulated_wake_handler_threads();
|
os_aio_simulated_wake_handler_threads();
|
||||||
os_thread_sleep(10000);
|
os_thread_sleep(10000);
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
|
|
||||||
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1997, 2016, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2017, 2019, MariaDB Corporation.
|
Copyright (c) 2017, 2020, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
This program is free software; you can redistribute it and/or modify it under
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@ -342,10 +342,4 @@ times! */
|
|||||||
roll-forward */
|
roll-forward */
|
||||||
#define RECV_SCAN_SIZE (4 * UNIV_PAGE_SIZE)
|
#define RECV_SCAN_SIZE (4 * UNIV_PAGE_SIZE)
|
||||||
|
|
||||||
/** This many frames must be left free in the buffer pool when we scan
|
|
||||||
the log and store the scanned log records in the buffer pool: we will
|
|
||||||
use these free frames to read in pages when we start applying the
|
|
||||||
log records to the database. */
|
|
||||||
extern ulint recv_n_pool_free_frames;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Copyright (c) 1997, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
Copyright (c) 1997, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
||||||
Copyright (c) 2012, Facebook Inc.
|
Copyright (c) 2012, Facebook Inc.
|
||||||
Copyright (c) 2013, 2019, MariaDB Corporation.
|
Copyright (c) 2013, 2020, MariaDB Corporation.
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify it under
|
This program is free software; you can redistribute it and/or modify it under
|
||||||
the terms of the GNU General Public License as published by the Free Software
|
the terms of the GNU General Public License as published by the Free Software
|
||||||
@ -103,14 +103,6 @@ static ulint recv_previous_parsed_rec_offset;
|
|||||||
/** The 'multi' flag of the previous parsed redo log record */
|
/** The 'multi' flag of the previous parsed redo log record */
|
||||||
static ulint recv_previous_parsed_rec_is_multi;
|
static ulint recv_previous_parsed_rec_is_multi;
|
||||||
|
|
||||||
/** This many frames must be left free in the buffer pool when we scan
|
|
||||||
the log and store the scanned log records in the buffer pool: we will
|
|
||||||
use these free frames to read in pages when we start applying the
|
|
||||||
log records to the database.
|
|
||||||
This is the default value. If the actual size of the buffer pool is
|
|
||||||
larger than 10 MB we'll set this value to 512. */
|
|
||||||
ulint recv_n_pool_free_frames;
|
|
||||||
|
|
||||||
/** The maximum lsn we see for a page during the recovery process. If this
|
/** The maximum lsn we see for a page during the recovery process. If this
|
||||||
is bigger than the lsn we are able to scan up to, that is an indication that
|
is bigger than the lsn we are able to scan up to, that is an indication that
|
||||||
the recovery failed and the database may be corrupt. */
|
the recovery failed and the database may be corrupt. */
|
||||||
@ -840,9 +832,6 @@ recv_sys_init()
|
|||||||
recv_sys->flush_end = os_event_create(0);
|
recv_sys->flush_end = os_event_create(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
recv_n_pool_free_frames =
|
|
||||||
buf_pool_get_n_pages() / 3;
|
|
||||||
|
|
||||||
recv_sys->buf = static_cast<byte*>(
|
recv_sys->buf = static_cast<byte*>(
|
||||||
ut_malloc_nokey(RECV_PARSING_BUF_SIZE));
|
ut_malloc_nokey(RECV_PARSING_BUF_SIZE));
|
||||||
|
|
||||||
@ -3456,9 +3445,8 @@ recv_group_scan_log_recs(
|
|||||||
lsn_t end_lsn;
|
lsn_t end_lsn;
|
||||||
store_t store_to_hash = recv_sys->mlog_checkpoint_lsn == 0
|
store_t store_to_hash = recv_sys->mlog_checkpoint_lsn == 0
|
||||||
? STORE_NO : (last_phase ? STORE_IF_EXISTS : STORE_YES);
|
? STORE_NO : (last_phase ? STORE_IF_EXISTS : STORE_YES);
|
||||||
ulint available_mem = UNIV_PAGE_SIZE
|
ulint available_mem = (buf_pool_get_n_pages() * 2 / 3)
|
||||||
* (buf_pool_get_n_pages()
|
<< srv_page_size_shift;
|
||||||
- (recv_n_pool_free_frames * srv_buf_pool_instances));
|
|
||||||
|
|
||||||
group->scanned_lsn = end_lsn = *contiguous_lsn = ut_uint64_align_down(
|
group->scanned_lsn = end_lsn = *contiguous_lsn = ut_uint64_align_down(
|
||||||
*contiguous_lsn, OS_FILE_LOG_BLOCK_SIZE);
|
*contiguous_lsn, OS_FILE_LOG_BLOCK_SIZE);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user