diff options
author | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2020-03-18 14:55:22 +0530 |
---|---|---|
committer | Thirunarayanan Balathandayuthapani <thiru@mariadb.com> | 2020-03-18 15:25:28 +0530 |
commit | 09e8707d90a8a73887fd4f22b64df43ff4669556 (patch) | |
tree | 5f21e8c3599bb56c495fcbb5a14344f320938507 | |
parent | 6ecbb211c071e4ac62c0b8eaf773771b74d49a9c (diff) | |
download | mariadb-git-09e8707d90a8a73887fd4f22b64df43ff4669556.tar.gz |
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.
-rw-r--r-- | storage/innobase/buf/buf0rea.cc | 8 | ||||
-rw-r--r-- | storage/innobase/include/log0recv.h | 8 | ||||
-rw-r--r-- | storage/innobase/log/log0recv.cc | 18 |
3 files changed, 10 insertions, 24 deletions
diff --git a/storage/innobase/buf/buf0rea.cc b/storage/innobase/buf/buf0rea.cc index e25c0e853e4..43831dedb2c 100644 --- a/storage/innobase/buf/buf0rea.cc +++ b/storage/innobase/buf/buf0rea.cc @@ -1,7 +1,7 @@ /***************************************************************************** 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 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; 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_thread_sleep(10000); diff --git a/storage/innobase/include/log0recv.h b/storage/innobase/include/log0recv.h index d6da4cad9a9..068d7813c20 100644 --- a/storage/innobase/include/log0recv.h +++ b/storage/innobase/include/log0recv.h @@ -1,7 +1,7 @@ /***************************************************************************** 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 the terms of the GNU General Public License as published by the Free Software @@ -342,10 +342,4 @@ times! */ roll-forward */ #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 diff --git a/storage/innobase/log/log0recv.cc b/storage/innobase/log/log0recv.cc index 347953b5289..01f8e3636bc 100644 --- a/storage/innobase/log/log0recv.cc +++ b/storage/innobase/log/log0recv.cc @@ -2,7 +2,7 @@ Copyright (c) 1997, 2017, Oracle and/or its affiliates. All Rights Reserved. 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 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 */ 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 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. */ @@ -840,9 +832,6 @@ recv_sys_init() 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*>( ut_malloc_nokey(RECV_PARSING_BUF_SIZE)); @@ -3456,9 +3445,8 @@ recv_group_scan_log_recs( lsn_t end_lsn; store_t store_to_hash = recv_sys->mlog_checkpoint_lsn == 0 ? STORE_NO : (last_phase ? STORE_IF_EXISTS : STORE_YES); - ulint available_mem = UNIV_PAGE_SIZE - * (buf_pool_get_n_pages() - - (recv_n_pool_free_frames * srv_buf_pool_instances)); + ulint available_mem = (buf_pool_get_n_pages() * 2 / 3) + << srv_page_size_shift; group->scanned_lsn = end_lsn = *contiguous_lsn = ut_uint64_align_down( *contiguous_lsn, OS_FILE_LOG_BLOCK_SIZE); |