mirror of
				https://github.com/MariaDB/server.git
				synced 2025-10-31 02:46:29 +01:00 
			
		
		
		
	 fd101daa84
			
		
	
	
	fd101daa84
	
	
	
		
			
			mtr_t::is_block_dirtied(), mtr_t::memo_push(): Never set m_made_dirty
for pages of the temporary tablespace. Ever since
commit 5eb539555b
we never add those pages to buf_pool.flush_list.
mtr_t::commit(): Implement part of mtr_t::prepare_write() here,
and avoid acquiring log_sys.mutex if no log is written.
During IMPORT TABLESPACE fixup, we do not write log, but we must
add pages to buf_pool.flush_list and for that, be prepared
to acquire log_sys.flush_order_mutex.
mtr_t::do_write(): Replaces mtr_t::prepare_write().
		
	
			
		
			
				
	
	
		
			174 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*****************************************************************************
 | |
| 
 | |
| Copyright (c) 1995, 2014, Oracle and/or its affiliates. All Rights Reserved.
 | |
| Copyright (c) 2017, 2022, 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/mtr0mtr.ic
 | |
| Mini-transaction buffer
 | |
| 
 | |
| Created 11/26/1995 Heikki Tuuri
 | |
| *******************************************************/
 | |
| 
 | |
| #include "buf0buf.h"
 | |
| 
 | |
| /** Check if a mini-transaction is dirtying a clean page.
 | |
| @return true if the mtr is dirtying a clean page. */
 | |
| inline bool mtr_t::is_block_dirtied(const buf_block_t *block)
 | |
| {
 | |
|   ut_ad(block->page.state() == BUF_BLOCK_FILE_PAGE);
 | |
|   ut_ad(block->page.buf_fix_count());
 | |
|   return block->page.oldest_modification() <= 1 &&
 | |
|     block->page.id().space() < SRV_TMP_SPACE_ID;
 | |
| }
 | |
| 
 | |
| /**
 | |
| Pushes an object to an mtr memo stack. */
 | |
| void
 | |
| mtr_t::memo_push(void* object, mtr_memo_type_t type)
 | |
| {
 | |
| 	ut_ad(is_active());
 | |
| 	ut_ad(object != NULL);
 | |
| 	ut_ad(type >= MTR_MEMO_PAGE_S_FIX);
 | |
| 	ut_ad(type <= MTR_MEMO_SPACE_X_LOCK);
 | |
| 	ut_ad(ut_is_2pow(type));
 | |
| 
 | |
| 	/* If this mtr has x-fixed a clean page then we set
 | |
| 	the made_dirty flag. This tells us if we need to
 | |
| 	grab log_sys.flush_order_mutex at mtr_t::commit() so that we
 | |
| 	can insert the dirtied page into the flush list. */
 | |
| 
 | |
| 	if (!m_made_dirty
 | |
|             && (type == MTR_MEMO_PAGE_X_FIX || type == MTR_MEMO_PAGE_SX_FIX)) {
 | |
| 
 | |
| 		m_made_dirty = is_block_dirtied(
 | |
| 			reinterpret_cast<const buf_block_t*>(object));
 | |
| 	}
 | |
| 
 | |
| 	mtr_memo_slot_t* slot = m_memo.push<mtr_memo_slot_t*>(sizeof(*slot));
 | |
| 
 | |
| 	slot->type = type;
 | |
| 	slot->object = object;
 | |
| }
 | |
| 
 | |
| /**
 | |
| Releases the (index tree) s-latch stored in an mtr memo after a
 | |
| savepoint. */
 | |
| void
 | |
| mtr_t::release_s_latch_at_savepoint(
 | |
| 	ulint		savepoint,
 | |
| 	rw_lock_t*	lock)
 | |
| {
 | |
| 	ut_ad(is_active());
 | |
| 	ut_ad(m_memo.size() > savepoint);
 | |
| 
 | |
| 	mtr_memo_slot_t* slot = m_memo.at<mtr_memo_slot_t*>(savepoint);
 | |
| 
 | |
| 	ut_ad(slot->object == lock);
 | |
| 	ut_ad(slot->type == MTR_MEMO_S_LOCK);
 | |
| 
 | |
| 	rw_lock_s_unlock(lock);
 | |
| 
 | |
| 	slot->object = NULL;
 | |
| }
 | |
| 
 | |
| /**
 | |
| SX-latches the not yet latched block after a savepoint. */
 | |
| 
 | |
| void
 | |
| mtr_t::sx_latch_at_savepoint(
 | |
| 	ulint		savepoint,
 | |
| 	buf_block_t*	block)
 | |
| {
 | |
| 	ut_ad(is_active());
 | |
| 	ut_ad(m_memo.size() > savepoint);
 | |
| 
 | |
| 	ut_ad(!memo_contains_flagged(
 | |
| 			block,
 | |
| 			MTR_MEMO_PAGE_S_FIX
 | |
| 			| MTR_MEMO_PAGE_X_FIX
 | |
| 			| MTR_MEMO_PAGE_SX_FIX));
 | |
| 
 | |
| 	mtr_memo_slot_t* slot = m_memo.at<mtr_memo_slot_t*>(savepoint);
 | |
| 
 | |
| 	ut_ad(slot->object == block);
 | |
| 
 | |
| 	/* == RW_NO_LATCH */
 | |
| 	ut_a(slot->type == MTR_MEMO_BUF_FIX);
 | |
| 
 | |
| 	rw_lock_sx_lock(&block->lock);
 | |
| 
 | |
| 	if (!m_made_dirty) {
 | |
| 		m_made_dirty = is_block_dirtied(block);
 | |
| 	}
 | |
| 
 | |
| 	slot->type = MTR_MEMO_PAGE_SX_FIX;
 | |
| }
 | |
| 
 | |
| /**
 | |
| X-latches the not yet latched block after a savepoint. */
 | |
| 
 | |
| void
 | |
| mtr_t::x_latch_at_savepoint(
 | |
| 	ulint		savepoint,
 | |
| 	buf_block_t*	block)
 | |
| {
 | |
| 	ut_ad(is_active());
 | |
| 	ut_ad(m_memo.size() > savepoint);
 | |
| 
 | |
| 	ut_ad(!memo_contains_flagged(
 | |
| 			block,
 | |
| 			MTR_MEMO_PAGE_S_FIX
 | |
| 			| MTR_MEMO_PAGE_X_FIX
 | |
| 			| MTR_MEMO_PAGE_SX_FIX));
 | |
| 
 | |
| 	mtr_memo_slot_t* slot = m_memo.at<mtr_memo_slot_t*>(savepoint);
 | |
| 
 | |
| 	ut_ad(slot->object == block);
 | |
| 
 | |
| 	/* == RW_NO_LATCH */
 | |
| 	ut_a(slot->type == MTR_MEMO_BUF_FIX);
 | |
| 
 | |
| 	rw_lock_x_lock(&block->lock);
 | |
| 
 | |
| 	if (!m_made_dirty) {
 | |
| 		m_made_dirty = is_block_dirtied(block);
 | |
| 	}
 | |
| 
 | |
| 	slot->type = MTR_MEMO_PAGE_X_FIX;
 | |
| }
 | |
| 
 | |
| /**
 | |
| Releases the block in an mtr memo after a savepoint. */
 | |
| 
 | |
| void
 | |
| mtr_t::release_block_at_savepoint(
 | |
| 	ulint		savepoint,
 | |
| 	buf_block_t*	block)
 | |
| {
 | |
| 	ut_ad(is_active());
 | |
| 
 | |
| 	mtr_memo_slot_t* slot = m_memo.at<mtr_memo_slot_t*>(savepoint);
 | |
| 
 | |
| 	ut_a(slot->object == block);
 | |
| 
 | |
| 	buf_page_release_latch(block, slot->type);
 | |
| 
 | |
| 	reinterpret_cast<buf_block_t*>(block)->unfix();
 | |
| 
 | |
| 	slot->object = NULL;
 | |
| }
 |