mirror of
https://github.com/MariaDB/server.git
synced 2026-05-15 19:37:16 +02:00
The flushing of the InnoDB temporary tablespace is unnecessarily tied to the write-ahead redo logging and redo log checkpoints, which must be tied to the page writes of persistent tablespaces. Let us simply omit any pages of temporary tables from buf_pool.flush_list. In this way, log checkpoints will never incur any 'collateral damage' of writing out unmodified changes for temporary tables. After this change, pages of the temporary tablespace can only be written out by buf_flush_lists(n_pages,0) as part of LRU eviction. Hopefully, most of the time, that code will never be executed, and instead, the temporary pages will be evicted by buf_release_freed_page() without ever being written back to the temporary tablespace file. This should improve the efficiency of the checkpoint flushing and the buf_flush_page_cleaner thread. Reviewed by: Vladislav Vaintroub
77 lines
2.8 KiB
Text
77 lines
2.8 KiB
Text
/*****************************************************************************
|
|
|
|
Copyright (c) 1995, 2015, Oracle and/or its affiliates. All Rights Reserved.
|
|
Copyright (c) 2019, 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
|
|
Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along with
|
|
this program; if not, write to the Free Software Foundation, Inc.,
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
|
|
|
|
*****************************************************************************/
|
|
|
|
/**************************************************//**
|
|
@file include/buf0flu.ic
|
|
The database buffer pool flush algorithm
|
|
|
|
Created 11/5/1995 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
#include "assume_aligned.h"
|
|
#include "buf0buf.h"
|
|
#include "mtr0mtr.h"
|
|
#include "srv0srv.h"
|
|
#include "fsp0types.h"
|
|
|
|
/********************************************************************//**
|
|
Inserts a modified block into the flush list. */
|
|
void
|
|
buf_flush_insert_into_flush_list(
|
|
/*=============================*/
|
|
buf_block_t* block, /*!< in/out: block which is modified */
|
|
lsn_t lsn); /*!< in: oldest modification */
|
|
|
|
/********************************************************************//**
|
|
This function should be called at a mini-transaction commit, if a page was
|
|
modified in it. Puts the block to the list of modified blocks, if it is not
|
|
already in it. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_flush_note_modification(
|
|
/*========================*/
|
|
buf_block_t* block, /*!< in: block which is modified */
|
|
lsn_t start_lsn, /*!< in: start lsn of the mtr that
|
|
modified this block */
|
|
lsn_t end_lsn) /*!< in: end lsn of the mtr that
|
|
modified this block */
|
|
{
|
|
ut_ad(!srv_read_only_mode
|
|
|| fsp_is_system_temporary(block->page.id().space()));
|
|
ut_ad(block->page.state() == BUF_BLOCK_FILE_PAGE);
|
|
ut_ad(block->page.buf_fix_count());
|
|
ut_ad(mach_read_from_8(block->frame + FIL_PAGE_LSN) <= end_lsn);
|
|
mach_write_to_8(block->frame + FIL_PAGE_LSN, end_lsn);
|
|
if (UNIV_LIKELY_NULL(block->page.zip.data)) {
|
|
memcpy_aligned<8>(FIL_PAGE_LSN + block->page.zip.data,
|
|
FIL_PAGE_LSN + block->frame, 8);
|
|
}
|
|
|
|
const lsn_t oldest_modification = block->page.oldest_modification();
|
|
|
|
if (oldest_modification) {
|
|
ut_ad(oldest_modification <= start_lsn);
|
|
} else if (!fsp_is_system_temporary(block->page.id().space())) {
|
|
buf_flush_insert_into_flush_list(block, start_lsn);
|
|
} else {
|
|
block->page.set_temp_modified();
|
|
}
|
|
|
|
srv_stats.buf_pool_write_requests.inc();
|
|
}
|