MDEV-17491 micro optimize page_id_t #892

This commit is contained in:
Marko Mäkelä 2018-10-29 12:05:50 +02:00
commit a6ffeeeaa9
32 changed files with 196 additions and 316 deletions

View file

@ -1149,7 +1149,7 @@ btr_free_root_invalidate(
static MY_ATTRIBUTE((warn_unused_result)) static MY_ATTRIBUTE((warn_unused_result))
buf_block_t* buf_block_t*
btr_free_root_check( btr_free_root_check(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
index_id_t index_id, index_id_t index_id,
mtr_t* mtr) mtr_t* mtr)
@ -1421,7 +1421,7 @@ top_loop:
@param[in,out] mtr mini-transaction */ @param[in,out] mtr mini-transaction */
void void
btr_free_if_exists( btr_free_if_exists(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
index_id_t index_id, index_id_t index_id,
mtr_t* mtr) mtr_t* mtr)
@ -1445,7 +1445,7 @@ btr_free_if_exists(
@param[in] page_size page size */ @param[in] page_size page size */
void void
btr_free( btr_free(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size) const page_size_t& page_size)
{ {
mtr_t mtr; mtr_t mtr;

View file

@ -231,7 +231,7 @@ btr_rec_free_externally_stored_fields(
btr_latch_leaves_t btr_latch_leaves_t
btr_cur_latch_leaves( btr_cur_latch_leaves(
buf_block_t* block, buf_block_t* block,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ulint latch_mode, ulint latch_mode,
btr_cur_t* cursor, btr_cur_t* cursor,
@ -1684,7 +1684,7 @@ need_opposite_intention:
lock_intention = BTR_INTENTION_BOTH; lock_intention = BTR_INTENTION_BOTH;
page_id.reset(space, dict_index_get_page(index)); page_id = page_id_t(space, dict_index_get_page(index));
up_match = 0; up_match = 0;
low_match = 0; low_match = 0;
height = ULINT_UNDEFINED; height = ULINT_UNDEFINED;
@ -1900,7 +1900,7 @@ need_opposite_intention:
ulint idx = n_blocks ulint idx = n_blocks
- (leftmost_from_level - 1); - (leftmost_from_level - 1);
page_id.reset( page_id = page_id_t(
space, space,
tree_blocks[idx]->page.id.page_no()); tree_blocks[idx]->page.id.page_no());
@ -1935,7 +1935,7 @@ need_opposite_intention:
} }
/* Go to the child node */ /* Go to the child node */
page_id.reset( page_id = page_id_t(
space, space,
btr_node_ptr_get_child_page_no(node_ptr, offsets)); btr_node_ptr_get_child_page_no(node_ptr, offsets));

View file

@ -1304,7 +1304,7 @@ cleanup:
/** Drop possible adaptive hash index entries when a page is evicted /** Drop possible adaptive hash index entries when a page is evicted
from the buffer pool or freed in a file, or the index is being dropped. from the buffer pool or freed in a file, or the index is being dropped.
@param[in] page_id page id */ @param[in] page_id page id */
void btr_search_drop_page_hash_when_freed(const page_id_t& page_id) void btr_search_drop_page_hash_when_freed(const page_id_t page_id)
{ {
buf_block_t* block; buf_block_t* block;
mtr_t mtr; mtr_t mtr;

View file

@ -2280,7 +2280,8 @@ buf_page_realloc(
memset(block->frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID, 0xff, 4); memset(block->frame + FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID, 0xff, 4);
UNIV_MEM_INVALID(block->frame, UNIV_PAGE_SIZE); UNIV_MEM_INVALID(block->frame, UNIV_PAGE_SIZE);
buf_block_set_state(block, BUF_BLOCK_REMOVE_HASH); buf_block_set_state(block, BUF_BLOCK_REMOVE_HASH);
block->page.id.reset(ULINT32_UNDEFINED, ULINT32_UNDEFINED); block->page.id
= page_id_t(ULINT32_UNDEFINED, ULINT32_UNDEFINED);
/* Relocate buf_pool->flush_list. */ /* Relocate buf_pool->flush_list. */
if (block->page.oldest_modification) { if (block->page.oldest_modification) {
@ -3505,7 +3506,7 @@ hash_lock and reacquire it.
static static
buf_page_t* buf_page_t*
buf_pool_watch_set( buf_pool_watch_set(
const page_id_t& page_id, const page_id_t page_id,
rw_lock_t** hash_lock) rw_lock_t** hash_lock)
{ {
buf_page_t* bpage; buf_page_t* bpage;
@ -3583,7 +3584,7 @@ page_found:
buf_block_t::mutex or buf_pool->zip_mutex or both. */ buf_block_t::mutex or buf_pool->zip_mutex or both. */
bpage->state = BUF_BLOCK_ZIP_PAGE; bpage->state = BUF_BLOCK_ZIP_PAGE;
bpage->id.copy_from(page_id); bpage->id = page_id;
bpage->buf_fix_count = 1; bpage->buf_fix_count = 1;
ut_d(bpage->in_page_hash = TRUE); ut_d(bpage->in_page_hash = TRUE);
@ -3647,9 +3648,7 @@ buf_pool_watch_remove(
/** Stop watching if the page has been read in. /** Stop watching if the page has been read in.
buf_pool_watch_set(same_page_id) must have returned NULL before. buf_pool_watch_set(same_page_id) must have returned NULL before.
@param[in] page_id page id */ @param[in] page_id page id */
void void buf_pool_watch_unset(const page_id_t page_id)
buf_pool_watch_unset(
const page_id_t& page_id)
{ {
buf_page_t* bpage; buf_page_t* bpage;
buf_pool_t* buf_pool = buf_pool_get(page_id); buf_pool_t* buf_pool = buf_pool_get(page_id);
@ -3681,12 +3680,10 @@ buf_pool_watch_unset(
This may only be called after buf_pool_watch_set(same_page_id) This may only be called after buf_pool_watch_set(same_page_id)
has returned NULL and before invoking buf_pool_watch_unset(same_page_id). has returned NULL and before invoking buf_pool_watch_unset(same_page_id).
@param[in] page_id page id @param[in] page_id page id
@return FALSE if the given page was not read in, TRUE if it was */ @return false if the given page was not read in, true if it was */
ibool bool buf_pool_watch_occurred(const page_id_t page_id)
buf_pool_watch_occurred(
const page_id_t& page_id)
{ {
ibool ret; bool ret;
buf_page_t* bpage; buf_page_t* bpage;
buf_pool_t* buf_pool = buf_pool_get(page_id); buf_pool_t* buf_pool = buf_pool_get(page_id);
rw_lock_t* hash_lock = buf_page_hash_lock_get(buf_pool, page_id); rw_lock_t* hash_lock = buf_page_hash_lock_get(buf_pool, page_id);
@ -3756,9 +3753,7 @@ debug version to check that it is not accessed any more unless
reallocated. reallocated.
@param[in] page_id page id @param[in] page_id page id
@return control block if found in page hash table, otherwise NULL */ @return control block if found in page hash table, otherwise NULL */
buf_page_t* buf_page_t* buf_page_set_file_page_was_freed(const page_id_t page_id)
buf_page_set_file_page_was_freed(
const page_id_t& page_id)
{ {
buf_page_t* bpage; buf_page_t* bpage;
buf_pool_t* buf_pool = buf_pool_get(page_id); buf_pool_t* buf_pool = buf_pool_get(page_id);
@ -3786,9 +3781,7 @@ debug version to check that it is not accessed any more unless
reallocated. reallocated.
@param[in] page_id page id @param[in] page_id page id
@return control block if found in page hash table, otherwise NULL */ @return control block if found in page hash table, otherwise NULL */
buf_page_t* buf_page_t* buf_page_reset_file_page_was_freed(const page_id_t page_id)
buf_page_reset_file_page_was_freed(
const page_id_t& page_id)
{ {
buf_page_t* bpage; buf_page_t* bpage;
buf_pool_t* buf_pool = buf_pool_get(page_id); buf_pool_t* buf_pool = buf_pool_get(page_id);
@ -3810,12 +3803,8 @@ buf_page_reset_file_page_was_freed(
/** Attempts to discard the uncompressed frame of a compressed page. /** Attempts to discard the uncompressed frame of a compressed page.
The caller should not be holding any mutexes when this function is called. The caller should not be holding any mutexes when this function is called.
@param[in] page_id page id @param[in] page_id page id */
@return TRUE if successful, FALSE otherwise. */ static void buf_block_try_discard_uncompressed(const page_id_t page_id)
static
void
buf_block_try_discard_uncompressed(
const page_id_t& page_id)
{ {
buf_page_t* bpage; buf_page_t* bpage;
buf_pool_t* buf_pool = buf_pool_get(page_id); buf_pool_t* buf_pool = buf_pool_get(page_id);
@ -3849,7 +3838,7 @@ the same set of mutexes or latches.
@return pointer to the block */ @return pointer to the block */
buf_page_t* buf_page_t*
buf_page_get_zip( buf_page_get_zip(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size) const page_size_t& page_size)
{ {
buf_page_t* bpage; buf_page_t* bpage;
@ -4300,7 +4289,7 @@ BUF_PEEK_IF_IN_POOL, BUF_GET_NO_LATCH, or BUF_GET_IF_IN_POOL_OR_WATCH
@return pointer to the block or NULL */ @return pointer to the block or NULL */
buf_block_t* buf_block_t*
buf_page_get_gen( buf_page_get_gen(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ulint rw_latch, ulint rw_latch,
buf_block_t* guess, buf_block_t* guess,
@ -4375,7 +4364,7 @@ loop:
it may have been freed by buf_relocate(). */ it may have been freed by buf_relocate(). */
if (!buf_block_is_uncompressed(buf_pool, block) if (!buf_block_is_uncompressed(buf_pool, block)
|| !page_id.equals_to(block->page.id) || page_id != block->page.id
|| buf_block_get_state(block) != BUF_BLOCK_FILE_PAGE) { || buf_block_get_state(block) != BUF_BLOCK_FILE_PAGE) {
/* Our guess was bogus or things have changed /* Our guess was bogus or things have changed
@ -5206,7 +5195,7 @@ Suitable for using when holding the lock_sys_t::mutex.
@return pointer to a page or NULL */ @return pointer to a page or NULL */
buf_block_t* buf_block_t*
buf_page_try_get_func( buf_page_try_get_func(
const page_id_t& page_id, const page_id_t page_id,
const char* file, const char* file,
unsigned line, unsigned line,
mtr_t* mtr) mtr_t* mtr)
@ -5235,7 +5224,7 @@ buf_page_try_get_func(
#if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG #if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
ut_a(buf_block_get_state(block) == BUF_BLOCK_FILE_PAGE); ut_a(buf_block_get_state(block) == BUF_BLOCK_FILE_PAGE);
ut_a(page_id.equals_to(block->page.id)); ut_a(page_id == block->page.id);
#endif /* UNIV_DEBUG || UNIV_BUF_DEBUG */ #endif /* UNIV_DEBUG || UNIV_BUF_DEBUG */
buf_block_buf_fix_inc(block, file, line); buf_block_buf_fix_inc(block, file, line);
@ -5321,7 +5310,7 @@ static
void void
buf_page_init( buf_page_init(
buf_pool_t* buf_pool, buf_pool_t* buf_pool,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
buf_block_t* block) buf_block_t* block)
{ {
@ -5389,7 +5378,7 @@ buf_page_init(
ut_ad(!block->page.in_page_hash); ut_ad(!block->page.in_page_hash);
ut_d(block->page.in_page_hash = TRUE); ut_d(block->page.in_page_hash = TRUE);
block->page.id.copy_from(page_id); block->page.id = page_id;
block->page.size.copy_from(page_size); block->page.size.copy_from(page_size);
HASH_INSERT(buf_page_t, hash, buf_pool->page_hash, HASH_INSERT(buf_page_t, hash, buf_pool->page_hash,
@ -5419,7 +5408,7 @@ buf_page_t*
buf_page_init_for_read( buf_page_init_for_read(
dberr_t* err, dberr_t* err,
ulint mode, ulint mode,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
bool unzip) bool unzip)
{ {
@ -5588,7 +5577,7 @@ buf_page_init_for_read(
buf_page_init_low(bpage); buf_page_init_low(bpage);
bpage->state = BUF_BLOCK_ZIP_PAGE; bpage->state = BUF_BLOCK_ZIP_PAGE;
bpage->id.copy_from(page_id); bpage->id = page_id;
bpage->flush_observer = NULL; bpage->flush_observer = NULL;
ut_d(bpage->in_page_hash = FALSE); ut_d(bpage->in_page_hash = FALSE);
@ -5657,7 +5646,7 @@ FILE_PAGE (the other is buf_page_get_gen).
@return pointer to the block, page bufferfixed */ @return pointer to the block, page bufferfixed */
buf_block_t* buf_block_t*
buf_page_create( buf_page_create(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
mtr_t* mtr) mtr_t* mtr)
{ {
@ -7364,7 +7353,7 @@ buf_pool_check_no_pending_io(void)
std::ostream& std::ostream&
operator<<( operator<<(
std::ostream& out, std::ostream& out,
const page_id_t& page_id) const page_id_t page_id)
{ {
out << "[page id: space=" << page_id.m_space out << "[page id: space=" << page_id.m_space
<< ", page number=" << page_id.m_page_no << "]"; << ", page number=" << page_id.m_page_no << "]";

View file

@ -858,7 +858,7 @@ buf_dblwr_check_block(
but just happens to have wrongly set FIL_PAGE_TYPE, but just happens to have wrongly set FIL_PAGE_TYPE,
such pages should never be modified to without also such pages should never be modified to without also
adjusting the page type during page allocation or adjusting the page type during page allocation or
buf_flush_init_for_writing() or fil_page_reset_type(). */ buf_flush_init_for_writing() or fil_block_reset_type(). */
break; break;
case FIL_PAGE_TYPE_FSP_HDR: case FIL_PAGE_TYPE_FSP_HDR:
case FIL_PAGE_IBUF_BITMAP: case FIL_PAGE_IBUF_BITMAP:

View file

@ -1296,7 +1296,7 @@ buf_flush_page_try(
static static
bool bool
buf_flush_check_neighbor( buf_flush_check_neighbor(
const page_id_t& page_id, const page_id_t page_id,
buf_flush_t flush_type) buf_flush_t flush_type)
{ {
buf_page_t* bpage; buf_page_t* bpage;
@ -1346,7 +1346,7 @@ buf_flush_check_neighbor(
static static
ulint ulint
buf_flush_try_neighbors( buf_flush_try_neighbors(
const page_id_t& page_id, const page_id_t page_id,
buf_flush_t flush_type, buf_flush_t flush_type,
ulint n_flushed, ulint n_flushed,
ulint n_to_flush) ulint n_to_flush)

View file

@ -2161,7 +2161,8 @@ buf_LRU_block_free_hashed_page(
buf_page_mutex_enter(block); buf_page_mutex_enter(block);
if (buf_pool->flush_rbt == NULL) { if (buf_pool->flush_rbt == NULL) {
block->page.id.reset(ULINT32_UNDEFINED, ULINT32_UNDEFINED); block->page.id
= page_id_t(ULINT32_UNDEFINED, ULINT32_UNDEFINED);
} }
buf_block_set_state(block, BUF_BLOCK_MEMORY); buf_block_set_state(block, BUF_BLOCK_MEMORY);

View file

@ -117,7 +117,7 @@ buf_read_page_low(
bool sync, bool sync,
ulint type, ulint type,
ulint mode, ulint mode,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
bool unzip, bool unzip,
bool ignore_missing_space = false) bool ignore_missing_space = false)
@ -239,7 +239,7 @@ pages, it may happen that the page at the given page number does not
get read even if we return a positive value! */ get read even if we return a positive value! */
ulint ulint
buf_read_ahead_random( buf_read_ahead_random(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ibool inside_ibuf) ibool inside_ibuf)
{ {
@ -419,7 +419,7 @@ after decryption normal page checksum does not match.
@retval DB_TABLESPACE_DELETED if tablespace .ibd file is missing */ @retval DB_TABLESPACE_DELETED if tablespace .ibd file is missing */
dberr_t dberr_t
buf_read_page( buf_read_page(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size) const page_size_t& page_size)
{ {
ulint count; ulint count;
@ -457,7 +457,7 @@ released by the i/o-handler thread.
@param[in] sync true if synchronous aio is desired */ @param[in] sync true if synchronous aio is desired */
void void
buf_read_page_background( buf_read_page_background(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
bool sync) bool sync)
{ {
@ -529,7 +529,7 @@ which could result in a deadlock if the OS does not support asynchronous io.
@return number of page read requests issued */ @return number of page read requests issued */
ulint ulint
buf_read_ahead_linear( buf_read_ahead_linear(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ibool inside_ibuf) ibool inside_ibuf)
{ {

View file

@ -265,7 +265,7 @@ i/o on a tablespace which does not exist */
UNIV_INLINE UNIV_INLINE
dberr_t dberr_t
fil_read( fil_read(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ulint byte_offset, ulint byte_offset,
ulint len, ulint len,
@ -291,7 +291,7 @@ i/o on a tablespace which does not exist */
UNIV_INLINE UNIV_INLINE
dberr_t dberr_t
fil_write( fil_write(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ulint byte_offset, ulint byte_offset,
ulint len, ulint len,
@ -4988,7 +4988,7 @@ dberr_t
fil_io( fil_io(
const IORequest& type, const IORequest& type,
bool sync, bool sync,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ulint byte_offset, ulint byte_offset,
ulint len, ulint len,
@ -5564,27 +5564,6 @@ fil_page_set_type(
mach_write_to_2(page + FIL_PAGE_TYPE, type); mach_write_to_2(page + FIL_PAGE_TYPE, type);
} }
/** Reset the page type.
Data files created before MySQL 5.1 may contain garbage in FIL_PAGE_TYPE.
In MySQL 3.23.53, only undo log pages and index pages were tagged.
Any other pages were written with uninitialized bytes in FIL_PAGE_TYPE.
@param[in] page_id page number
@param[in,out] page page with invalid FIL_PAGE_TYPE
@param[in] type expected page type
@param[in,out] mtr mini-transaction */
void
fil_page_reset_type(
const page_id_t& page_id,
byte* page,
ulint type,
mtr_t* mtr)
{
ib::info()
<< "Resetting invalid page " << page_id << " type "
<< fil_page_get_type(page) << " to " << type << ".";
mlog_write_ulint(page + FIL_PAGE_TYPE, type, MLOG_2BYTES, mtr);
}
/****************************************************************//** /****************************************************************//**
Closes the tablespace memory cache. */ Closes the tablespace memory cache. */
void void

View file

@ -1062,6 +1062,22 @@ fsp_get_pages_to_extend_ibd(
return(size_increase); return(size_increase);
} }
/** Reset the page type.
Data files created before MySQL 5.1.48 may contain garbage in FIL_PAGE_TYPE.
In MySQL 3.23.53, only undo log pages and index pages were tagged.
Any other pages were written with uninitialized bytes in FIL_PAGE_TYPE.
@param[in] block block with invalid FIL_PAGE_TYPE
@param[in] type expected page type
@param[in,out] mtr mini-transaction */
ATTRIBUTE_COLD
void fil_block_reset_type(const buf_block_t& block, ulint type, mtr_t* mtr)
{
ib::info()
<< "Resetting invalid page " << block.page.id << " type "
<< fil_page_get_type(block.frame) << " to " << type << ".";
mlog_write_ulint(block.frame + FIL_PAGE_TYPE, type, MLOG_2BYTES, mtr);
}
/** Put new extents to the free list if there are free extents above the free /** Put new extents to the free list if there are free extents above the free
limit. If an extent happens to contain an extent descriptor page, the extent limit. If an extent happens to contain an extent descriptor page, the extent
is put to the FSP_FREE_FRAG list with the page marked as used. is put to the FSP_FREE_FRAG list with the page marked as used.
@ -1197,7 +1213,7 @@ fsp_fill_free_list(
header, space, i, mtr, init_space, &desc_block); header, space, i, mtr, init_space, &desc_block);
if (desc_block != NULL) { if (desc_block != NULL) {
fil_block_check_type( fil_block_check_type(
desc_block, FIL_PAGE_TYPE_XDES, mtr); *desc_block, FIL_PAGE_TYPE_XDES, mtr);
} }
xdes_init(descr, mtr); xdes_init(descr, mtr);
@ -1256,7 +1272,7 @@ fsp_alloc_free_extent(
header, space, hint, mtr, false, &desc_block); header, space, hint, mtr, false, &desc_block);
if (desc_block != NULL) { if (desc_block != NULL) {
fil_block_check_type(desc_block, FIL_PAGE_TYPE_XDES, mtr); fil_block_check_type(*desc_block, FIL_PAGE_TYPE_XDES, mtr);
} }
if (descr && (xdes_get_state(descr, mtr) == XDES_FREE)) { if (descr && (xdes_get_state(descr, mtr) == XDES_FREE)) {
@ -1798,7 +1814,7 @@ fsp_alloc_seg_inode(
block = buf_page_get(page_id, page_size, RW_SX_LATCH, mtr); block = buf_page_get(page_id, page_size, RW_SX_LATCH, mtr);
buf_block_dbg_add_level(block, SYNC_FSP_PAGE); buf_block_dbg_add_level(block, SYNC_FSP_PAGE);
fil_block_check_type(block, FIL_PAGE_INODE, mtr); fil_block_check_type(*block, FIL_PAGE_INODE, mtr);
page = buf_block_get_frame(block); page = buf_block_get_frame(block);
@ -2105,7 +2121,7 @@ fseg_create_general(
? FIL_PAGE_TYPE_TRX_SYS ? FIL_PAGE_TYPE_TRX_SYS
: FIL_PAGE_TYPE_SYS; : FIL_PAGE_TYPE_SYS;
fil_block_check_type(block, type, mtr); fil_block_check_type(*block, type, mtr);
} }
if (!has_done_reservation if (!has_done_reservation
@ -2690,7 +2706,7 @@ fseg_alloc_free_page_general(
const page_size_t page_size(space->flags); const page_size_t page_size(space->flags);
inode = fseg_inode_get(seg_header, space_id, page_size, mtr, &iblock); inode = fseg_inode_get(seg_header, space_id, page_size, mtr, &iblock);
fil_block_check_type(iblock, FIL_PAGE_INODE, mtr); fil_block_check_type(*iblock, FIL_PAGE_INODE, mtr);
if (!has_done_reservation if (!has_done_reservation
&& !fsp_reserve_free_extents(&n_reserved, space_id, 2, && !fsp_reserve_free_extents(&n_reserved, space_id, 2,
@ -3173,7 +3189,7 @@ fseg_free_page_func(
seg_inode = fseg_inode_get(seg_header, space_id, page_size, mtr, seg_inode = fseg_inode_get(seg_header, space_id, page_size, mtr,
&iblock); &iblock);
fil_block_check_type(iblock, FIL_PAGE_INODE, mtr); fil_block_check_type(*iblock, FIL_PAGE_INODE, mtr);
fseg_free_page_low(seg_inode, space, page, page_size, ahi, mtr); fseg_free_page_low(seg_inode, space, page, page_size, ahi, mtr);
@ -3353,7 +3369,7 @@ fseg_free_step_func(
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
fil_block_check_type(iblock, FIL_PAGE_INODE, mtr); fil_block_check_type(*iblock, FIL_PAGE_INODE, mtr);
descr = fseg_get_first_extent(inode, space, page_size, mtr); descr = fseg_get_first_extent(inode, space, page_size, mtr);
if (descr != NULL) { if (descr != NULL) {
@ -3421,7 +3437,7 @@ fseg_free_step_not_header_func(
buf_block_t* iblock; buf_block_t* iblock;
inode = fseg_inode_get(header, space_id, page_size, mtr, &iblock); inode = fseg_inode_get(header, space_id, page_size, mtr, &iblock);
fil_block_check_type(iblock, FIL_PAGE_INODE, mtr); fil_block_check_type(*iblock, FIL_PAGE_INODE, mtr);
descr = fseg_get_first_extent(inode, space, page_size, mtr); descr = fseg_get_first_extent(inode, space, page_size, mtr);

View file

@ -212,7 +212,7 @@ static ulint ibuf_counts[IBUF_COUNT_N_SPACES][IBUF_COUNT_N_PAGES];
UNIV_INLINE UNIV_INLINE
void void
ibuf_count_check( ibuf_count_check(
const page_id_t& page_id) const page_id_t page_id)
{ {
if (page_id.space() < IBUF_COUNT_N_SPACES if (page_id.space() < IBUF_COUNT_N_SPACES
&& page_id.page_no() < IBUF_COUNT_N_PAGES) { && page_id.page_no() < IBUF_COUNT_N_PAGES) {
@ -423,9 +423,7 @@ ibuf_tree_root_get(
@param[in] page_id page id @param[in] page_id page id
@return number of entries in the insert buffer currently buffered for @return number of entries in the insert buffer currently buffered for
this page */ this page */
ulint ulint ibuf_count_get(const page_id_t page_id)
ibuf_count_get(
const page_id_t& page_id)
{ {
ibuf_count_check(page_id); ibuf_count_check(page_id);
@ -438,7 +436,7 @@ ibuf_count_get(
static static
void void
ibuf_count_set( ibuf_count_set(
const page_id_t& page_id, const page_id_t page_id,
ulint val) ulint val)
{ {
ibuf_count_check(page_id); ibuf_count_check(page_id);
@ -674,7 +672,7 @@ UNIV_INLINE
ulint ulint
ibuf_bitmap_page_get_bits_low( ibuf_bitmap_page_get_bits_low(
const page_t* page, const page_t* page,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
ulint latch_type, ulint latch_type,
@ -725,7 +723,7 @@ static
void void
ibuf_bitmap_page_set_bits( ibuf_bitmap_page_set_bits(
page_t* page, page_t* page,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ulint bit, ulint bit,
ulint val, ulint val,
@ -778,7 +776,7 @@ ibuf_bitmap_page_set_bits(
UNIV_INLINE UNIV_INLINE
const page_id_t const page_id_t
ibuf_bitmap_page_no_calc( ibuf_bitmap_page_no_calc(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size) const page_size_t& page_size)
{ {
ulint bitmap_page_no; ulint bitmap_page_no;
@ -802,7 +800,7 @@ is x-latched */
static static
page_t* page_t*
ibuf_bitmap_get_map_page_func( ibuf_bitmap_get_map_page_func(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
const char* file, const char* file,
unsigned line, unsigned line,
@ -1105,7 +1103,7 @@ ibuf_update_free_bits_for_two_pages_low(
UNIV_INLINE UNIV_INLINE
ibool ibool
ibuf_fixed_addr_page( ibuf_fixed_addr_page(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size) const page_size_t& page_size)
{ {
return((page_id.space() == IBUF_SPACE_ID return((page_id.space() == IBUF_SPACE_ID
@ -1127,7 +1125,7 @@ in which case a new transaction is created.
@return TRUE if level 2 or level 3 page */ @return TRUE if level 2 or level 3 page */
ibool ibool
ibuf_page_low( ibuf_page_low(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
ibool x_latch, ibool x_latch,
@ -3360,7 +3358,7 @@ ibuf_insert_low(
const dtuple_t* entry, const dtuple_t* entry,
ulint entry_size, ulint entry_size,
dict_index_t* index, dict_index_t* index,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
que_thr_t* thr) que_thr_t* thr)
{ {
@ -3700,7 +3698,7 @@ ibuf_insert(
ibuf_op_t op, ibuf_op_t op,
const dtuple_t* entry, const dtuple_t* entry,
dict_index_t* index, dict_index_t* index,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
que_thr_t* thr) que_thr_t* thr)
{ {
@ -4436,7 +4434,7 @@ want to update a non-existent bitmap page */
void void
ibuf_merge_or_delete_for_page( ibuf_merge_or_delete_for_page(
buf_block_t* block, buf_block_t* block,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t* page_size, const page_size_t* page_size,
ibool update_ibuf_bitmap) ibool update_ibuf_bitmap)
{ {
@ -4454,7 +4452,7 @@ ibuf_merge_or_delete_for_page(
ulint mops[IBUF_OP_COUNT]; ulint mops[IBUF_OP_COUNT];
ulint dops[IBUF_OP_COUNT]; ulint dops[IBUF_OP_COUNT];
ut_ad(block == NULL || page_id.equals_to(block->page.id)); ut_ad(block == NULL || page_id == block->page.id);
ut_ad(block == NULL || buf_block_get_io_fix(block) == BUF_IO_READ); ut_ad(block == NULL || buf_block_get_io_fix(block) == BUF_IO_READ);
if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE if (srv_force_recovery >= SRV_FORCE_NO_IBUF_MERGE

View file

@ -231,7 +231,7 @@ tree
UNIV_INLINE UNIV_INLINE
buf_block_t* buf_block_t*
btr_block_get_func( btr_block_get_func(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ulint mode, ulint mode,
const char* file, const char* file,
@ -272,7 +272,7 @@ UNIV_INLINE
page_t* page_t*
btr_page_get( btr_page_get(
/*=========*/ /*=========*/
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ulint mode, ulint mode,
dict_index_t* index, dict_index_t* index,
@ -371,7 +371,7 @@ btr_create(
@param[in,out] mtr mini-transaction */ @param[in,out] mtr mini-transaction */
void void
btr_free_if_exists( btr_free_if_exists(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
index_id_t index_id, index_id_t index_id,
mtr_t* mtr); mtr_t* mtr);
@ -381,7 +381,7 @@ btr_free_if_exists(
@param[in] page_size page size */ @param[in] page_size page size */
void void
btr_free( btr_free(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size); const page_size_t& page_size);
/** Read the last used AUTO_INCREMENT value from PAGE_ROOT_AUTO_INC. /** Read the last used AUTO_INCREMENT value from PAGE_ROOT_AUTO_INC.

View file

@ -47,7 +47,7 @@ tree
UNIV_INLINE UNIV_INLINE
buf_block_t* buf_block_t*
btr_block_get_func( btr_block_get_func(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ulint mode, ulint mode,
const char* file, const char* file,
@ -113,7 +113,7 @@ UNIV_INLINE
page_t* page_t*
btr_page_get( btr_page_get(
/*=========*/ /*=========*/
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ulint mode, ulint mode,
dict_index_t* index, dict_index_t* index,

View file

@ -795,7 +795,7 @@ btr_rec_set_deleted_flag(
btr_latch_leaves_t btr_latch_leaves_t
btr_cur_latch_leaves( btr_cur_latch_leaves(
buf_block_t* block, buf_block_t* block,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ulint latch_mode, ulint latch_mode,
btr_cur_t* cursor, btr_cur_t* cursor,

View file

@ -133,7 +133,7 @@ btr_search_drop_page_hash_index(buf_block_t* block);
/** Drop possible adaptive hash index entries when a page is evicted /** Drop possible adaptive hash index entries when a page is evicted
from the buffer pool or freed in a file, or the index is being dropped. from the buffer pool or freed in a file, or the index is being dropped.
@param[in] page_id page id */ @param[in] page_id page id */
void btr_search_drop_page_hash_when_freed(const page_id_t& page_id); void btr_search_drop_page_hash_when_freed(const page_id_t page_id);
/** Updates the page hash index when a single record is inserted on a page. /** Updates the page hash index when a single record is inserted on a page.
@param[in] cursor cursor which was positioned to the place to insert @param[in] cursor cursor which was positioned to the place to insert

View file

@ -223,96 +223,46 @@ public:
@param[in] space tablespace id @param[in] space tablespace id
@param[in] page_no page number */ @param[in] page_no page number */
page_id_t(ulint space, ulint page_no) page_id_t(ulint space, ulint page_no)
: : m_space(uint32_t(space)), m_page_no(uint32(page_no))
m_space(static_cast<ib_uint32_t>(space)),
m_page_no(static_cast<ib_uint32_t>(page_no)),
m_fold(ULINT_UNDEFINED)
{ {
ut_ad(space <= 0xFFFFFFFFU); ut_ad(space <= 0xFFFFFFFFU);
ut_ad(page_no <= 0xFFFFFFFFU); ut_ad(page_no <= 0xFFFFFFFFU);
} }
bool operator==(const page_id_t& rhs) const
{
return m_space == rhs.m_space && m_page_no == rhs.m_page_no;
}
bool operator!=(const page_id_t& rhs) const { return !(*this == rhs); }
/** Retrieve the tablespace id. /** Retrieve the tablespace id.
@return tablespace id */ @return tablespace id */
inline ib_uint32_t space() const uint32_t space() const { return m_space; }
{
return(m_space);
}
/** Retrieve the page number. /** Retrieve the page number.
@return page number */ @return page number */
inline ib_uint32_t page_no() const uint32_t page_no() const { return m_page_no; }
{
return(m_page_no);
}
/** Retrieve the fold value. /** Retrieve the fold value.
@return fold value */ @return fold value */
inline ulint fold() const ulint fold() const { return (m_space << 20) + m_space + m_page_no; }
{
/* Initialize m_fold if it has not been initialized yet. */
if (m_fold == ULINT_UNDEFINED) {
m_fold = (m_space << 20) + m_space + m_page_no;
ut_ad(m_fold != ULINT_UNDEFINED);
}
return(m_fold);
}
/** Copy the values from a given page_id_t object.
@param[in] src page id object whose values to fetch */
inline void copy_from(const page_id_t& src)
{
m_space = src.space();
m_page_no = src.page_no();
m_fold = src.fold();
}
/** Reset the values from a (space, page_no).
@param[in] space tablespace id
@param[in] page_no page number */
inline void reset(ulint space, ulint page_no)
{
m_space = static_cast<ib_uint32_t>(space);
m_page_no = static_cast<ib_uint32_t>(page_no);
m_fold = ULINT_UNDEFINED;
ut_ad(space <= 0xFFFFFFFFU);
ut_ad(page_no <= 0xFFFFFFFFU);
}
/** Reset the page number only. /** Reset the page number only.
@param[in] page_no page number */ @param[in] page_no page number */
inline void set_page_no(ulint page_no) inline void set_page_no(ulint page_no)
{ {
m_page_no = static_cast<ib_uint32_t>(page_no); m_page_no = uint32_t(page_no);
m_fold = ULINT_UNDEFINED;
ut_ad(page_no <= 0xFFFFFFFFU); ut_ad(page_no <= 0xFFFFFFFFU);
} }
/** Check if a given page_id_t object is equal to the current one.
@param[in] a page_id_t object to compare
@return true if equal */
inline bool equals_to(const page_id_t& a) const
{
return(a.space() == m_space && a.page_no() == m_page_no);
}
private: private:
/** Tablespace id. */ /** Tablespace id. */
ib_uint32_t m_space; uint32_t m_space;
/** Page number. */ /** Page number. */
ib_uint32_t m_page_no; uint32_t m_page_no;
/** A fold value derived from m_space and m_page_no,
used in hashing. */
mutable ulint m_fold;
/* Disable implicit copying. */
void operator=(const page_id_t&);
/** Declare the overloaded global operator<< as a friend of this /** Declare the overloaded global operator<< as a friend of this
class. Refer to the global declaration for further details. Print class. Refer to the global declaration for further details. Print
@ -324,7 +274,7 @@ private:
std::ostream& std::ostream&
operator<<( operator<<(
std::ostream& out, std::ostream& out,
const page_id_t& page_id); const page_id_t page_id);
}; };
/** Print the given page_id_t object. /** Print the given page_id_t object.
@ -334,7 +284,7 @@ private:
std::ostream& std::ostream&
operator<<( operator<<(
std::ostream& out, std::ostream& out,
const page_id_t& page_id); const page_id_t page_id);
#ifndef UNIV_INNOCHECKSUM #ifndef UNIV_INNOCHECKSUM
/********************************************************************//** /********************************************************************//**
@ -517,7 +467,7 @@ Suitable for using when holding the lock_sys_t::mutex.
@return pointer to a page or NULL */ @return pointer to a page or NULL */
buf_block_t* buf_block_t*
buf_page_try_get_func( buf_page_try_get_func(
const page_id_t& page_id, const page_id_t page_id,
const char* file, const char* file,
unsigned line, unsigned line,
mtr_t* mtr); mtr_t* mtr);
@ -543,7 +493,7 @@ the same set of mutexes or latches.
@return pointer to the block */ @return pointer to the block */
buf_page_t* buf_page_t*
buf_page_get_zip( buf_page_get_zip(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size); const page_size_t& page_size);
/** This is the general function used to get access to a database page. /** This is the general function used to get access to a database page.
@ -559,7 +509,7 @@ BUF_PEEK_IF_IN_POOL, BUF_GET_NO_LATCH, or BUF_GET_IF_IN_POOL_OR_WATCH
@return pointer to the block or NULL */ @return pointer to the block or NULL */
buf_block_t* buf_block_t*
buf_page_get_gen( buf_page_get_gen(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ulint rw_latch, ulint rw_latch,
buf_block_t* guess, buf_block_t* guess,
@ -579,7 +529,7 @@ FILE_PAGE (the other is buf_page_get_gen).
@return pointer to the block, page bufferfixed */ @return pointer to the block, page bufferfixed */
buf_block_t* buf_block_t*
buf_page_create( buf_page_create(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
mtr_t* mtr); mtr_t* mtr);
@ -613,10 +563,7 @@ NOTE that it is possible that the page is not yet read from disk,
though. though.
@param[in] page_id page id @param[in] page_id page id
@return TRUE if found in the page hash table */ @return TRUE if found in the page hash table */
UNIV_INLINE inline bool buf_page_peek(const page_id_t page_id);
ibool
buf_page_peek(
const page_id_t& page_id);
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
@ -626,9 +573,7 @@ debug version to check that it is not accessed any more unless
reallocated. reallocated.
@param[in] page_id page id @param[in] page_id page id
@return control block if found in page hash table, otherwise NULL */ @return control block if found in page hash table, otherwise NULL */
buf_page_t* buf_page_t* buf_page_set_file_page_was_freed(const page_id_t page_id);
buf_page_set_file_page_was_freed(
const page_id_t& page_id);
/** Sets file_page_was_freed FALSE if the page is found in the buffer pool. /** Sets file_page_was_freed FALSE if the page is found in the buffer pool.
This function should be called when we free a file page and want the This function should be called when we free a file page and want the
@ -636,9 +581,7 @@ debug version to check that it is not accessed any more unless
reallocated. reallocated.
@param[in] page_id page id @param[in] page_id page id
@return control block if found in page hash table, otherwise NULL */ @return control block if found in page hash table, otherwise NULL */
buf_page_t* buf_page_t* buf_page_reset_file_page_was_freed(const page_id_t page_id);
buf_page_reset_file_page_was_freed(
const page_id_t& page_id);
#endif /* UNIV_DEBUG */ #endif /* UNIV_DEBUG */
/********************************************************************//** /********************************************************************//**
@ -1086,7 +1029,7 @@ UNIV_INLINE
void void
buf_block_set_file_page( buf_block_set_file_page(
buf_block_t* block, buf_block_t* block,
const page_id_t& page_id); const page_id_t page_id);
/*********************************************************************//** /*********************************************************************//**
Gets the io_fix state of a block. Gets the io_fix state of a block.
@ -1267,7 +1210,7 @@ buf_page_t*
buf_page_init_for_read( buf_page_init_for_read(
dberr_t* err, dberr_t* err,
ulint mode, ulint mode,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
bool unzip); bool unzip);
@ -1315,10 +1258,7 @@ buf_pool_from_block(
/** Returns the buffer pool instance given a page id. /** Returns the buffer pool instance given a page id.
@param[in] page_id page id @param[in] page_id page id
@return buffer pool */ @return buffer pool */
UNIV_INLINE inline buf_pool_t* buf_pool_get(const page_id_t page_id);
buf_pool_t*
buf_pool_get(
const page_id_t& page_id);
/******************************************************************//** /******************************************************************//**
Returns the buffer pool instance given its array index Returns the buffer pool instance given its array index
@ -1338,7 +1278,7 @@ UNIV_INLINE
buf_page_t* buf_page_t*
buf_page_hash_get_low( buf_page_hash_get_low(
buf_pool_t* buf_pool, buf_pool_t* buf_pool,
const page_id_t& page_id); const page_id_t page_id);
/** Returns the control block of a file page, NULL if not found. /** Returns the control block of a file page, NULL if not found.
If the block is found and lock is not NULL then the appropriate If the block is found and lock is not NULL then the appropriate
@ -1360,7 +1300,7 @@ UNIV_INLINE
buf_page_t* buf_page_t*
buf_page_hash_get_locked( buf_page_hash_get_locked(
buf_pool_t* buf_pool, buf_pool_t* buf_pool,
const page_id_t& page_id, const page_id_t page_id,
rw_lock_t** lock, rw_lock_t** lock,
ulint lock_mode, ulint lock_mode,
bool watch = false); bool watch = false);
@ -1383,7 +1323,7 @@ UNIV_INLINE
buf_block_t* buf_block_t*
buf_block_hash_get_locked( buf_block_hash_get_locked(
buf_pool_t* buf_pool, buf_pool_t* buf_pool,
const page_id_t& page_id, const page_id_t page_id,
rw_lock_t** lock, rw_lock_t** lock,
ulint lock_mode); ulint lock_mode);
@ -1423,18 +1363,14 @@ buf_pool_watch_is_sentinel(
/** Stop watching if the page has been read in. /** Stop watching if the page has been read in.
buf_pool_watch_set(space,offset) must have returned NULL before. buf_pool_watch_set(space,offset) must have returned NULL before.
@param[in] page_id page id */ @param[in] page_id page id */
void void buf_pool_watch_unset(const page_id_t page_id);
buf_pool_watch_unset(
const page_id_t& page_id);
/** Check if the page has been read in. /** Check if the page has been read in.
This may only be called after buf_pool_watch_set(space,offset) This may only be called after buf_pool_watch_set(space,offset)
has returned NULL and before invoking buf_pool_watch_unset(space,offset). has returned NULL and before invoking buf_pool_watch_unset(space,offset).
@param[in] page_id page id @param[in] page_id page id
@return FALSE if the given page was not read in, TRUE if it was */ @return FALSE if the given page was not read in, TRUE if it was */
ibool bool buf_pool_watch_occurred(const page_id_t page_id)
buf_pool_watch_occurred(
const page_id_t& page_id)
MY_ATTRIBUTE((warn_unused_result)); MY_ATTRIBUTE((warn_unused_result));
/********************************************************************//** /********************************************************************//**

View file

@ -463,10 +463,10 @@ UNIV_INLINE
void void
buf_block_set_file_page( buf_block_set_file_page(
buf_block_t* block, buf_block_t* block,
const page_id_t& page_id) const page_id_t page_id)
{ {
buf_block_set_state(block, BUF_BLOCK_FILE_PAGE); buf_block_set_state(block, BUF_BLOCK_FILE_PAGE);
block->page.id.copy_from(page_id); block->page.id = page_id;
} }
/*********************************************************************//** /*********************************************************************//**
@ -1042,10 +1042,7 @@ buf_block_buf_fix_dec(
/** Returns the buffer pool instance given a page id. /** Returns the buffer pool instance given a page id.
@param[in] page_id page id @param[in] page_id page id
@return buffer pool */ @return buffer pool */
UNIV_INLINE inline buf_pool_t* buf_pool_get(const page_id_t page_id)
buf_pool_t*
buf_pool_get(
const page_id_t& page_id)
{ {
/* 2log of BUF_READ_AHEAD_AREA (64) */ /* 2log of BUF_READ_AHEAD_AREA (64) */
ulint ignored_page_no = page_id.page_no() >> 6; ulint ignored_page_no = page_id.page_no() >> 6;
@ -1080,7 +1077,7 @@ UNIV_INLINE
buf_page_t* buf_page_t*
buf_page_hash_get_low( buf_page_hash_get_low(
buf_pool_t* buf_pool, buf_pool_t* buf_pool,
const page_id_t& page_id) const page_id_t page_id)
{ {
buf_page_t* bpage; buf_page_t* bpage;
@ -1098,7 +1095,7 @@ buf_page_hash_get_low(
bpage, bpage,
ut_ad(bpage->in_page_hash && !bpage->in_zip_hash ut_ad(bpage->in_page_hash && !bpage->in_zip_hash
&& buf_page_in_file(bpage)), && buf_page_in_file(bpage)),
page_id.equals_to(bpage->id)); page_id == bpage->id);
if (bpage) { if (bpage) {
ut_a(buf_page_in_file(bpage)); ut_a(buf_page_in_file(bpage));
ut_ad(bpage->in_page_hash); ut_ad(bpage->in_page_hash);
@ -1129,7 +1126,7 @@ UNIV_INLINE
buf_page_t* buf_page_t*
buf_page_hash_get_locked( buf_page_hash_get_locked(
buf_pool_t* buf_pool, buf_pool_t* buf_pool,
const page_id_t& page_id, const page_id_t page_id,
rw_lock_t** lock, rw_lock_t** lock,
ulint lock_mode, ulint lock_mode,
bool watch) bool watch)
@ -1173,7 +1170,7 @@ buf_page_hash_get_locked(
} }
ut_ad(buf_page_in_file(bpage)); ut_ad(buf_page_in_file(bpage));
ut_ad(page_id.equals_to(bpage->id)); ut_ad(page_id == bpage->id);
if (lock == NULL) { if (lock == NULL) {
/* The caller wants us to release the page_hash lock */ /* The caller wants us to release the page_hash lock */
@ -1212,7 +1209,7 @@ UNIV_INLINE
buf_block_t* buf_block_t*
buf_block_hash_get_locked( buf_block_hash_get_locked(
buf_pool_t* buf_pool, buf_pool_t* buf_pool,
const page_id_t& page_id, const page_id_t page_id,
rw_lock_t** lock, rw_lock_t** lock,
ulint lock_mode) ulint lock_mode)
{ {
@ -1252,11 +1249,8 @@ buf_block_hash_get_locked(
NOTE that it is possible that the page is not yet read from disk, NOTE that it is possible that the page is not yet read from disk,
though. though.
@param[in] page_id page id @param[in] page_id page id
@return TRUE if found in the page hash table */ @return true if found in the page hash table */
UNIV_INLINE inline bool buf_page_peek(const page_id_t page_id)
ibool
buf_page_peek(
const page_id_t& page_id)
{ {
buf_pool_t* buf_pool = buf_pool_get(page_id); buf_pool_t* buf_pool = buf_pool_get(page_id);

View file

@ -44,7 +44,7 @@ after decryption normal page checksum does not match.
@retval DB_TABLESPACE_DELETED if tablespace .ibd file is missing */ @retval DB_TABLESPACE_DELETED if tablespace .ibd file is missing */
dberr_t dberr_t
buf_read_page( buf_read_page(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size); const page_size_t& page_size);
/********************************************************************//** /********************************************************************//**
@ -57,7 +57,7 @@ released by the i/o-handler thread.
@param[in] sync true if synchronous aio is desired */ @param[in] sync true if synchronous aio is desired */
void void
buf_read_page_background( buf_read_page_background(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
bool sync); bool sync);
@ -79,7 +79,7 @@ pages, it may happen that the page at the given page number does not
get read even if we return a positive value! */ get read even if we return a positive value! */
ulint ulint
buf_read_ahead_random( buf_read_ahead_random(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ibool inside_ibuf); ibool inside_ibuf);
@ -111,7 +111,7 @@ which could result in a deadlock if the OS does not support asynchronous io.
@return number of page read requests issued */ @return number of page read requests issued */
ulint ulint
buf_read_ahead_linear( buf_read_ahead_linear(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ibool inside_ibuf); ibool inside_ibuf);

View file

@ -40,8 +40,8 @@ Created 10/25/1995 Heikki Tuuri
// Forward declaration // Forward declaration
extern ibool srv_use_doublewrite_buf; extern ibool srv_use_doublewrite_buf;
extern struct buf_dblwr_t* buf_dblwr; extern struct buf_dblwr_t* buf_dblwr;
struct trx_t;
class page_id_t; class page_id_t;
struct trx_t;
class truncate_t; class truncate_t;
typedef std::list<char*, ut_allocator<char*> > space_name_list_t; typedef std::list<char*, ut_allocator<char*> > space_name_list_t;
@ -1244,7 +1244,7 @@ dberr_t
fil_io( fil_io(
const IORequest& type, const IORequest& type,
bool sync, bool sync,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
ulint byte_offset, ulint byte_offset,
ulint len, ulint len,
@ -1315,65 +1315,6 @@ fil_page_set_type(
/*==============*/ /*==============*/
byte* page, /*!< in/out: file page */ byte* page, /*!< in/out: file page */
ulint type); /*!< in: type */ ulint type); /*!< in: type */
/** Reset the page type.
Data files created before MySQL 5.1 may contain garbage in FIL_PAGE_TYPE.
In MySQL 3.23.53, only undo log pages and index pages were tagged.
Any other pages were written with uninitialized bytes in FIL_PAGE_TYPE.
@param[in] page_id page number
@param[in,out] page page with invalid FIL_PAGE_TYPE
@param[in] type expected page type
@param[in,out] mtr mini-transaction */
void
fil_page_reset_type(
const page_id_t& page_id,
byte* page,
ulint type,
mtr_t* mtr);
/** Get the file page type.
@param[in] page file page
@return page type */
inline
uint16_t
fil_page_get_type(const byte* page)
{
return(mach_read_from_2(page + FIL_PAGE_TYPE));
}
/** Check (and if needed, reset) the page type.
Data files created before MySQL 5.1 may contain
garbage in the FIL_PAGE_TYPE field.
In MySQL 3.23.53, only undo log pages and index pages were tagged.
Any other pages were written with uninitialized bytes in FIL_PAGE_TYPE.
@param[in] page_id page number
@param[in,out] page page with possibly invalid FIL_PAGE_TYPE
@param[in] type expected page type
@param[in,out] mtr mini-transaction */
inline
void
fil_page_check_type(
const page_id_t& page_id,
byte* page,
ulint type,
mtr_t* mtr)
{
ulint page_type = fil_page_get_type(page);
if (page_type != type) {
fil_page_reset_type(page_id, page, type, mtr);
}
}
/** Check (and if needed, reset) the page type.
Data files created before MySQL 5.1 may contain
garbage in the FIL_PAGE_TYPE field.
In MySQL 3.23.53, only undo log pages and index pages were tagged.
Any other pages were written with uninitialized bytes in FIL_PAGE_TYPE.
@param[in,out] block block with possibly invalid FIL_PAGE_TYPE
@param[in] type expected page type
@param[in,out] mtr mini-transaction */
#define fil_block_check_type(block, type, mtr) \
fil_page_check_type(block->page.id, block->frame, type, mtr)
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
/** Increase redo skipped of a tablespace. /** Increase redo skipped of a tablespace.

View file

@ -640,6 +640,44 @@ fseg_free_step_not_header_func(
fseg_free_step_not_header_func(header, mtr) fseg_free_step_not_header_func(header, mtr)
#endif /* BTR_CUR_HASH_ADAPT */ #endif /* BTR_CUR_HASH_ADAPT */
/** Reset the page type.
Data files created before MySQL 5.1.48 may contain garbage in FIL_PAGE_TYPE.
In MySQL 3.23.53, only undo log pages and index pages were tagged.
Any other pages were written with uninitialized bytes in FIL_PAGE_TYPE.
@param[in] block block with invalid FIL_PAGE_TYPE
@param[in] type expected page type
@param[in,out] mtr mini-transaction */
ATTRIBUTE_COLD
void fil_block_reset_type(const buf_block_t& block, ulint type, mtr_t* mtr);
/** Get the file page type.
@param[in] page file page
@return page type */
inline uint16_t fil_page_get_type(const byte* page)
{
return mach_read_from_2(page + FIL_PAGE_TYPE);
}
/** Check (and if needed, reset) the page type.
Data files created before MySQL 5.1.48 may contain
garbage in the FIL_PAGE_TYPE field.
In MySQL 3.23.53, only undo log pages and index pages were tagged.
Any other pages were written with uninitialized bytes in FIL_PAGE_TYPE.
@param[in] page_id page number
@param[in,out] page page with possibly invalid FIL_PAGE_TYPE
@param[in] type expected page type
@param[in,out] mtr mini-transaction */
inline void
fil_block_check_type(
const buf_block_t& block,
ulint type,
mtr_t* mtr)
{
if (UNIV_UNLIKELY(type != fil_page_get_type(block.frame))) {
fil_block_reset_type(block, type, mtr);
}
}
/** Checks if a page address is an extent descriptor page address. /** Checks if a page address is an extent descriptor page address.
@param[in] page_id page id @param[in] page_id page id
@param[in] page_size page size @param[in] page_size page size
@ -647,7 +685,7 @@ fseg_free_step_not_header_func(
UNIV_INLINE UNIV_INLINE
ibool ibool
fsp_descr_page( fsp_descr_page(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size); const page_size_t& page_size);
/***********************************************************//** /***********************************************************//**

View file

@ -33,7 +33,7 @@ Created 12/18/1995 Heikki Tuuri
UNIV_INLINE UNIV_INLINE
ibool ibool
fsp_descr_page( fsp_descr_page(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size) const page_size_t& page_size)
{ {
return((page_id.page_no() & (page_size.physical() - 1)) return((page_id.page_no() & (page_size.physical() - 1))

View file

@ -251,7 +251,7 @@ ibuf_inside(
UNIV_INLINE UNIV_INLINE
ibool ibool
ibuf_bitmap_page( ibuf_bitmap_page(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size); const page_size_t& page_size);
/** Checks if a page is a level 2 or 3 page in the ibuf hierarchy of pages. /** Checks if a page is a level 2 or 3 page in the ibuf hierarchy of pages.
@ -268,7 +268,7 @@ in which case a new transaction is created.
@return TRUE if level 2 or level 3 page */ @return TRUE if level 2 or level 3 page */
ibool ibool
ibuf_page_low( ibuf_page_low(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
#ifdef UNIV_DEBUG #ifdef UNIV_DEBUG
ibool x_latch, ibool x_latch,
@ -324,7 +324,7 @@ ibuf_insert(
ibuf_op_t op, ibuf_op_t op,
const dtuple_t* entry, const dtuple_t* entry,
dict_index_t* index, dict_index_t* index,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size, const page_size_t& page_size,
que_thr_t* thr); que_thr_t* thr);
@ -343,7 +343,7 @@ want to update a non-existent bitmap page */
void void
ibuf_merge_or_delete_for_page( ibuf_merge_or_delete_for_page(
buf_block_t* block, buf_block_t* block,
const page_id_t& page_id, const page_id_t page_id,
const page_size_t* page_size, const page_size_t* page_size,
ibool update_ibuf_bitmap); ibool update_ibuf_bitmap);
@ -391,9 +391,7 @@ ibuf_parse_bitmap_init(
@param[in] page_id page id @param[in] page_id page id
@return number of entries in the insert buffer currently buffered for @return number of entries in the insert buffer currently buffered for
this page */ this page */
ulint ulint ibuf_count_get(const page_id_t page_id);
ibuf_count_get(
const page_id_t& page_id);
#endif #endif
/******************************************************************//** /******************************************************************//**
Looks if the insert buffer is empty. Looks if the insert buffer is empty.

View file

@ -156,7 +156,7 @@ ibuf_inside(
UNIV_INLINE UNIV_INLINE
ibool ibool
ibuf_bitmap_page( ibuf_bitmap_page(
const page_id_t& page_id, const page_id_t page_id,
const page_size_t& page_size) const page_size_t& page_size)
{ {
return((page_id.page_no() & (page_size.physical() - 1)) return((page_id.page_no() & (page_size.physical() - 1))

View file

@ -1240,7 +1240,7 @@ void
page_warn_strict_checksum( page_warn_strict_checksum(
srv_checksum_algorithm_t curr_algo, srv_checksum_algorithm_t curr_algo,
srv_checksum_algorithm_t page_checksum, srv_checksum_algorithm_t page_checksum,
const page_id_t& page_id); const page_id_t page_id);
#ifdef UNIV_MATERIALIZE #ifdef UNIV_MATERIALIZE
#undef UNIV_INLINE #undef UNIV_INLINE

View file

@ -57,10 +57,7 @@ extern trx_sys_t* trx_sys;
/** Checks if a page address is the trx sys header page. /** Checks if a page address is the trx sys header page.
@param[in] page_id page id @param[in] page_id page id
@return true if trx sys header page */ @return true if trx sys header page */
UNIV_INLINE inline bool trx_sys_hdr_page(const page_id_t page_id);
bool
trx_sys_hdr_page(
const page_id_t& page_id);
/** Initialize the transaction system main-memory data structures. */ /** Initialize the transaction system main-memory data structures. */
void trx_sys_init_at_db_start(); void trx_sys_init_at_db_start();

View file

@ -54,10 +54,7 @@ trx_sys_flush_max_trx_id(void);
/** Checks if a page address is the trx sys header page. /** Checks if a page address is the trx sys header page.
@param[in] page_id page id @param[in] page_id page id
@return true if trx sys header page */ @return true if trx sys header page */
UNIV_INLINE inline bool trx_sys_hdr_page(const page_id_t page_id)
bool
trx_sys_hdr_page(
const page_id_t& page_id)
{ {
return(page_id.space() == TRX_SYS_SPACE return(page_id.space() == TRX_SYS_SPACE
&& page_id.page_no() == TRX_SYS_PAGE_NO); && page_id.page_no() == TRX_SYS_PAGE_NO);

View file

@ -107,7 +107,7 @@ trx_read_roll_ptr(
@return pointer to page x-latched */ @return pointer to page x-latched */
UNIV_INLINE UNIV_INLINE
page_t* page_t*
trx_undo_page_get(const page_id_t& page_id, mtr_t* mtr); trx_undo_page_get(const page_id_t page_id, mtr_t* mtr);
/** Gets an undo log page and s-latches it. /** Gets an undo log page and s-latches it.
@param[in] page_id page id @param[in] page_id page id
@ -115,7 +115,7 @@ trx_undo_page_get(const page_id_t& page_id, mtr_t* mtr);
@return pointer to page s-latched */ @return pointer to page s-latched */
UNIV_INLINE UNIV_INLINE
page_t* page_t*
trx_undo_page_get_s_latched(const page_id_t& page_id, mtr_t* mtr); trx_undo_page_get_s_latched(const page_id_t page_id, mtr_t* mtr);
/******************************************************************//** /******************************************************************//**
Returns the previous undo record on the page in the specified log, or Returns the previous undo record on the page in the specified log, or

View file

@ -158,7 +158,7 @@ trx_read_roll_ptr(
@return pointer to page x-latched */ @return pointer to page x-latched */
UNIV_INLINE UNIV_INLINE
page_t* page_t*
trx_undo_page_get(const page_id_t& page_id, mtr_t* mtr) trx_undo_page_get(const page_id_t page_id, mtr_t* mtr)
{ {
buf_block_t* block = buf_page_get(page_id, univ_page_size, buf_block_t* block = buf_page_get(page_id, univ_page_size,
RW_X_LATCH, mtr); RW_X_LATCH, mtr);
@ -174,7 +174,7 @@ trx_undo_page_get(const page_id_t& page_id, mtr_t* mtr)
@return pointer to page s-latched */ @return pointer to page s-latched */
UNIV_INLINE UNIV_INLINE
page_t* page_t*
trx_undo_page_get_s_latched(const page_id_t& page_id, mtr_t* mtr) trx_undo_page_get_s_latched(const page_id_t page_id, mtr_t* mtr)
{ {
buf_block_t* block = buf_page_get(page_id, univ_page_size, buf_block_t* block = buf_page_get(page_id, univ_page_size,
RW_S_LATCH, mtr); RW_S_LATCH, mtr);

View file

@ -2128,10 +2128,7 @@ recv_recover_page(bool just_read_in, buf_block_t* block)
page number. page number.
@param[in] page_id page id @param[in] page_id page id
@return number of pages found */ @return number of pages found */
static static ulint recv_read_in_area(const page_id_t page_id)
ulint
recv_read_in_area(
const page_id_t& page_id)
{ {
recv_addr_t* recv_addr; recv_addr_t* recv_addr;
ulint page_nos[RECV_READ_AHEAD_AREA]; ulint page_nos[RECV_READ_AHEAD_AREA];

View file

@ -2833,7 +2833,7 @@ void
page_warn_strict_checksum( page_warn_strict_checksum(
srv_checksum_algorithm_t curr_algo, srv_checksum_algorithm_t curr_algo,
srv_checksum_algorithm_t page_checksum, srv_checksum_algorithm_t page_checksum,
const page_id_t& page_id) const page_id_t page_id)
{ {
srv_checksum_algorithm_t curr_algo_nonstrict; srv_checksum_algorithm_t curr_algo_nonstrict;
switch (curr_algo) { switch (curr_algo) {

View file

@ -3668,7 +3668,7 @@ fil_tablespace_iterate(
buf_block_t* block = reinterpret_cast<buf_block_t*> buf_block_t* block = reinterpret_cast<buf_block_t*>
(ut_zalloc_nokey(sizeof *block)); (ut_zalloc_nokey(sizeof *block));
block->frame = page; block->frame = page;
block->page.id.copy_from(page_id_t(0, 0)); block->page.id = page_id_t(0, 0);
block->page.io_fix = BUF_IO_NONE; block->page.io_fix = BUF_IO_NONE;
block->page.buf_fix_count = 1; block->page.buf_fix_count = 1;
block->page.state = BUF_BLOCK_FILE_PAGE; block->page.state = BUF_BLOCK_FILE_PAGE;
@ -3686,8 +3686,7 @@ fil_tablespace_iterate(
} }
if (err == DB_SUCCESS) { if (err == DB_SUCCESS) {
block->page.id.copy_from( block->page.id = page_id_t(callback.get_space_id(), 0);
page_id_t(callback.get_space_id(), 0));
block->page.size.copy_from(callback.get_page_size()); block->page.size.copy_from(callback.get_page_size());
if (block->page.size.is_compressed()) { if (block->page.size.is_compressed()) {
page_zip_set_size(&block->page.zip, page_zip_set_size(&block->page.zip,

View file

@ -2453,24 +2453,24 @@ files_checked:
page_id_t(IBUF_SPACE_ID, page_id_t(IBUF_SPACE_ID,
FSP_IBUF_HEADER_PAGE_NO), FSP_IBUF_HEADER_PAGE_NO),
univ_page_size, RW_X_LATCH, &mtr); univ_page_size, RW_X_LATCH, &mtr);
fil_block_check_type(block, FIL_PAGE_TYPE_SYS, &mtr); fil_block_check_type(*block, FIL_PAGE_TYPE_SYS, &mtr);
/* Already MySQL 3.23.53 initialized /* Already MySQL 3.23.53 initialized
FSP_IBUF_TREE_ROOT_PAGE_NO to FSP_IBUF_TREE_ROOT_PAGE_NO to
FIL_PAGE_INDEX. No need to reset that one. */ FIL_PAGE_INDEX. No need to reset that one. */
block = buf_page_get( block = buf_page_get(
page_id_t(TRX_SYS_SPACE, TRX_SYS_PAGE_NO), page_id_t(TRX_SYS_SPACE, TRX_SYS_PAGE_NO),
univ_page_size, RW_X_LATCH, &mtr); univ_page_size, RW_X_LATCH, &mtr);
fil_block_check_type(block, FIL_PAGE_TYPE_TRX_SYS, fil_block_check_type(*block, FIL_PAGE_TYPE_TRX_SYS,
&mtr); &mtr);
block = buf_page_get( block = buf_page_get(
page_id_t(TRX_SYS_SPACE, page_id_t(TRX_SYS_SPACE,
FSP_FIRST_RSEG_PAGE_NO), FSP_FIRST_RSEG_PAGE_NO),
univ_page_size, RW_X_LATCH, &mtr); univ_page_size, RW_X_LATCH, &mtr);
fil_block_check_type(block, FIL_PAGE_TYPE_SYS, &mtr); fil_block_check_type(*block, FIL_PAGE_TYPE_SYS, &mtr);
block = buf_page_get( block = buf_page_get(
page_id_t(TRX_SYS_SPACE, FSP_DICT_HDR_PAGE_NO), page_id_t(TRX_SYS_SPACE, FSP_DICT_HDR_PAGE_NO),
univ_page_size, RW_X_LATCH, &mtr); univ_page_size, RW_X_LATCH, &mtr);
fil_block_check_type(block, FIL_PAGE_TYPE_SYS, &mtr); fil_block_check_type(*block, FIL_PAGE_TYPE_SYS, &mtr);
mtr.commit(); mtr.commit();
} }