MySQL 8.4.2
Source Code Documentation
|
Insert buffer. More...
#include "univ.i"
#include "dict0mem.h"
#include "fsp0fsp.h"
#include "mtr0mtr.h"
#include "ibuf0types.h"
#include "ibuf0ibuf.ic"
Go to the source code of this file.
Enumerations | |
enum | ibuf_op_t { IBUF_OP_INSERT = 0 , IBUF_OP_DELETE_MARK = 1 , IBUF_OP_DELETE = 2 , IBUF_OP_COUNT = 3 } |
enum | ibuf_use_t { IBUF_USE_NONE = 0 , IBUF_USE_INSERT , IBUF_USE_DELETE_MARK , IBUF_USE_INSERT_DELETE_MARK , IBUF_USE_DELETE , IBUF_USE_ALL } |
Combinations of operations that can be buffered. More... | |
Functions | |
void | ibuf_init_at_db_start (void) |
Creates the insert buffer data structure at a database startup. More... | |
void | ibuf_max_size_update (ulint new_val) |
Updates the max_size value for ibuf. More... | |
void | ibuf_update_max_tablespace_id (void) |
Reads the biggest tablespace id from the high end of the insert buffer tree and updates the counter in fil_system. More... | |
static void | ibuf_mtr_start (mtr_t *mtr) |
Starts an insert buffer mini-transaction. More... | |
static void | ibuf_mtr_commit (mtr_t *mtr) |
Commits an insert buffer mini-transaction. More... | |
void | ibuf_bitmap_page_init (buf_block_t *block, mtr_t *mtr) |
Initializes an ibuf bitmap page. More... | |
void | ibuf_reset_free_bits (buf_block_t *block) |
Resets the free bits of the page in the ibuf bitmap. More... | |
static void | ibuf_update_free_bits_if_full (buf_block_t *block, ulint max_ins_size, ulint increase) |
Updates the free bits of an uncompressed page in the ibuf bitmap if there is not enough free on the page any more. More... | |
void | ibuf_update_free_bits_low (const buf_block_t *block, ulint max_ins_size, mtr_t *mtr) |
Updates the free bits for an uncompressed page to reflect the present state. More... | |
void | ibuf_update_free_bits_zip (buf_block_t *block, mtr_t *mtr) |
Updates the free bits for a compressed page to reflect the present state. More... | |
void | ibuf_update_free_bits_for_two_pages_low (buf_block_t *block1, buf_block_t *block2, mtr_t *mtr) |
Updates the free bits for the two pages to reflect the present state. More... | |
static bool | ibuf_should_try (dict_index_t *index, ulint ignore_sec_unique) |
A basic partial test if an insert to the insert buffer could be possible and recommended. More... | |
static bool | ibuf_inside (const mtr_t *mtr) |
Returns true if the current OS thread is performing an insert buffer routine. More... | |
static bool | ibuf_bitmap_page (const page_id_t &page_id, const page_size_t &page_size) |
Checks if a page address is an ibuf bitmap page (level 3 page) address. More... | |
bool | ibuf_page_low (const page_id_t &page_id, const page_size_t &page_size, bool x_latch, ut::Location location, mtr_t *mtr) |
Checks if a page is a level 2 or 3 page in the ibuf hierarchy of pages. More... | |
bool | ibuf_page (const page_id_t &page_id, const page_size_t &page_size, ut::Location location, mtr_t *mtr) |
Checks if a page is a level 2 or 3 page in the ibuf hierarchy of pages. More... | |
void | ibuf_free_excess_pages (void) |
Frees excess pages from the ibuf free list. More... | |
bool | ibuf_insert (ibuf_op_t op, const dtuple_t *entry, dict_index_t *index, const page_id_t &page_id, const page_size_t &page_size, que_thr_t *thr) |
Buffer an operation in the insert/delete buffer, instead of doing it directly to the disk page, if this is possible. More... | |
void | ibuf_merge_or_delete_for_page (buf_block_t *block, const page_id_t &page_id, const page_size_t *page_size, bool update_ibuf_bitmap) |
When an index page is read from a disk to the buffer pool, this function applies any buffered operations to the page and deletes the entries from the insert buffer. More... | |
void | ibuf_delete_for_discarded_space (space_id_t space) |
Deletes all entries in the insert buffer for a given space id. More... | |
ulint | ibuf_merge_in_background (bool full) |
Contract the change buffer by reading pages to the buffer pool. More... | |
ulint | ibuf_merge_space (space_id_t space) |
Contracts insert buffer trees by reading pages referring to space_id to the buffer pool. More... | |
const byte * | ibuf_parse_bitmap_init (const byte *ptr, const byte *end_ptr, buf_block_t *block, mtr_t *mtr) |
Parses a redo log record of an ibuf bitmap page init. More... | |
bool | ibuf_is_empty (void) |
Looks if the insert buffer is empty. More... | |
void | ibuf_print (FILE *file) |
Prints info of ibuf. More... | |
ulint | ibuf_rec_get_counter (const rec_t *rec) |
in: ibuf record More... | |
bool | ibuf_rec_has_multi_value (const rec_t *rec) |
Determine if there is any multi-value field data on the change buffer record. More... | |
void | ibuf_close (void) |
Closes insert buffer and frees the data structures. More... | |
dberr_t | ibuf_check_bitmap_on_import (const trx_t *trx, space_id_t space_id) |
Checks the insert buffer bitmaps on IMPORT TABLESPACE. More... | |
void | ibuf_set_bitmap_for_bulk_load (buf_block_t *block, bool reset) |
Updates free bits and buffered bits for bulk loaded page. More... | |
Variables | |
constexpr uint32_t | CHANGE_BUFFER_DEFAULT_SIZE = 25 |
Default value for maximum on-disk size of change buffer in terms of percentage of the buffer pool. More... | |
ulong | innodb_change_buffering |
Operations that can currently be buffered. More... | |
ibuf_t * | ibuf |
The insert buffer control structure. More... | |
constexpr uint32_t | IBUF_HEADER_PAGE_NO = FSP_IBUF_HEADER_PAGE_NO |
constexpr uint32_t | IBUF_TREE_ROOT_PAGE_NO = FSP_IBUF_TREE_ROOT_PAGE_NO |
constexpr uint32_t | IBUF_HEADER = PAGE_DATA |
constexpr uint32_t | IBUF_TREE_SEG_HEADER = 0 |
fseg header for ibuf tree More... | |
Insert buffer.
Created 7/19/1997 Heikki Tuuri
enum ibuf_op_t |
enum ibuf_use_t |
|
inlinestatic |
Checks if a page address is an ibuf bitmap page (level 3 page) address.
[in] | page_id | page id |
[in] | page_size | page size |
void ibuf_bitmap_page_init | ( | buf_block_t * | block, |
mtr_t * | mtr | ||
) |
Initializes an ibuf bitmap page.
block | in: bitmap page |
mtr | in: mtr |
dberr_t ibuf_check_bitmap_on_import | ( | const trx_t * | trx, |
space_id_t | space_id | ||
) |
Checks the insert buffer bitmaps on IMPORT TABLESPACE.
trx | in: transaction |
space_id | in: tablespace identifier |
void ibuf_close | ( | void | ) |
Closes insert buffer and frees the data structures.
void ibuf_delete_for_discarded_space | ( | space_id_t | space | ) |
Deletes all entries in the insert buffer for a given space id.
This is used in DISCARD TABLESPACE and IMPORT TABLESPACE. NOTE: this does not update the page free bitmaps in the space. The space will become CORRUPT when you call this function! in: space id
This is used in DISCARD TABLESPACE and IMPORT TABLESPACE. NOTE: this does not update the page free bitmaps in the space. The space will become CORRUPT when you call this function!
space | in: space id |
void ibuf_free_excess_pages | ( | void | ) |
Frees excess pages from the ibuf free list.
This function is called when an OS thread calls fsp services to allocate a new file segment, or a new page to a file segment, and the thread did not own the fsp latch before this call.
void ibuf_init_at_db_start | ( | void | ) |
Creates the insert buffer data structure at a database startup.
Creates the insert buffer data structure at a database startup.
bool ibuf_insert | ( | ibuf_op_t | op, |
const dtuple_t * | entry, | ||
dict_index_t * | index, | ||
const page_id_t & | page_id, | ||
const page_size_t & | page_size, | ||
que_thr_t * | thr | ||
) |
Buffer an operation in the insert/delete buffer, instead of doing it directly to the disk page, if this is possible.
Does not do it if the index is clustered or unique.
[in] | op | operation type |
[in] | entry | index entry to insert |
[in,out] | index | index where to insert |
[in] | page_id | page id where to insert |
[in] | page_size | page size |
[in,out] | thr | query thread |
|
inlinestatic |
Returns true if the current OS thread is performing an insert buffer routine.
For instance, a read-ahead of non-ibuf pages is forbidden by threads that are executing an insert buffer routine.
bool ibuf_is_empty | ( | void | ) |
Looks if the insert buffer is empty.
void ibuf_max_size_update | ( | ulint | new_val | ) |
Updates the max_size value for ibuf.
in: new value in terms of percentage of the buffer pool size
new_val | in: new value in terms of percentage of the buffer pool size |
ulint ibuf_merge_in_background | ( | bool | full | ) |
Contract the change buffer by reading pages to the buffer pool.
[in] | full | If true, do a full contraction based on PCT_IO(100). If false, the size of contract batch is determined based on the current size of the change buffer. |
void ibuf_merge_or_delete_for_page | ( | buf_block_t * | block, |
const page_id_t & | page_id, | ||
const page_size_t * | page_size, | ||
bool | update_ibuf_bitmap | ||
) |
When an index page is read from a disk to the buffer pool, this function applies any buffered operations to the page and deletes the entries from the insert buffer.
If the page is not read, but created in the buffer pool, this function deletes its buffered entries from the insert buffer; there can exist entries for such a page if the page belonged to an index which subsequently was dropped.
[in,out] | block | if page has been read from disk, pointer to the page x-latched, else NULL |
[in] | page_id | page id of the index page |
[in] | update_ibuf_bitmap | normally this is set to true, but if we have deleted or are deleting the tablespace, then we naturally do not want to update a non-existent bitmap page |
[in] | page_size | page size |
ulint ibuf_merge_space | ( | space_id_t | space | ) |
Contracts insert buffer trees by reading pages referring to space_id to the buffer pool.
space | in: tablespace id to merge |
|
inlinestatic |
Commits an insert buffer mini-transaction.
in/out: mini-transaction
|
inlinestatic |
Starts an insert buffer mini-transaction.
out: mini-transaction
|
inline |
Checks if a page is a level 2 or 3 page in the ibuf hierarchy of pages.
Must not be called when recv_no_ibuf_operations==true.
[in] | page_id | Tablespace/page identifier |
[in] | page_size | Page size |
[in] | location | Location where requested |
[in,out] | mtr | Mini-transaction or NULL |
bool ibuf_page_low | ( | const page_id_t & | page_id, |
const page_size_t & | page_size, | ||
bool | x_latch, | ||
ut::Location | location, | ||
mtr_t * | mtr | ||
) |
Checks if a page is a level 2 or 3 page in the ibuf hierarchy of pages.
Must not be called when recv_no_ibuf_operations==true.
[in] | page_id | page id |
[in] | page_size | page size |
[in] | x_latch | false if relaxed check (avoid latching the bitmap page) |
[in] | location | Location where called |
[in,out] | mtr | mtr which will contain an x-latch to the bitmap page if the page is not one of the fixed address ibuf pages, or NULL, in which case a new transaction is created. |
const byte * ibuf_parse_bitmap_init | ( | const byte * | ptr, |
const byte * | end_ptr, | ||
buf_block_t * | block, | ||
mtr_t * | mtr | ||
) |
Parses a redo log record of an ibuf bitmap page init.
[in] | ptr | Buffer. |
[in] | end_ptr | Buffer end. |
[in] | block | Block or nullptr. |
[in] | mtr | MTR or nullptr. |
void ibuf_print | ( | FILE * | file | ) |
Prints info of ibuf.
in: file where to print
file | in: file where to print |
in: ibuf record
in: ibuf record
rec | in: ibuf record |
bool ibuf_rec_has_multi_value | ( | const rec_t * | rec | ) |
Determine if there is any multi-value field data on the change buffer record.
[in] | rec | ibuf record |
void ibuf_reset_free_bits | ( | buf_block_t * | block | ) |
Resets the free bits of the page in the ibuf bitmap.
This is done in a separate mini-transaction, hence this operation does not restrict further work to only ibuf bitmap operations, which would result if the latch to the bitmap page were kept. NOTE: The free bits in the insert buffer bitmap must never exceed the free space on a page. It is safe to decrement or reset the bits in the bitmap in a mini-transaction that is committed before the mini-transaction that affects the free space. in: index page; free bits are set to 0 if the index is a non-clustered non-unique, and page level is 0
This is done in a separate mini-transaction, hence this operation does not restrict further work to only ibuf bitmap operations, which would result if the latch to the bitmap page were kept. NOTE: The free bits in the insert buffer bitmap must never exceed the free space on a page. It is safe to decrement or reset the bits in the bitmap in a mini-transaction that is committed before the mini-transaction that affects the free space.
block | in: index page; free bits are set to 0 if the index is a non-clustered non-unique, and page level is 0 |
void ibuf_set_bitmap_for_bulk_load | ( | buf_block_t * | block, |
bool | reset | ||
) |
Updates free bits and buffered bits for bulk loaded page.
[in] | block | index page |
[in] | reset | flag if reset free val |
|
inlinestatic |
A basic partial test if an insert to the insert buffer could be possible and recommended.
[in] | index | index where to insert |
[in] | ignore_sec_unique | if != 0, we should ignore UNIQUE constraint on a secondary index when we decide |
void ibuf_update_free_bits_for_two_pages_low | ( | buf_block_t * | block1, |
buf_block_t * | block2, | ||
mtr_t * | mtr | ||
) |
Updates the free bits for the two pages to reflect the present state.
Does this in the mtr given, which means that the latching order rules virtually prevent any further operations until mtr is committed. NOTE: The free bits in the insert buffer bitmap must never exceed the free space on a page. It is safe to set the free bits in the same mini-transaction that updated the pages. in: mtr
Does this in the mtr given, which means that the latching order rules virtually prevent any further operations until mtr is committed. NOTE: The free bits in the insert buffer bitmap must never exceed the free space on a page. It is safe to set the free bits in the same mini-transaction that updated the pages.
block1 | in: index page |
block2 | in: index page |
mtr | in: mtr |
|
inlinestatic |
Updates the free bits of an uncompressed page in the ibuf bitmap if there is not enough free on the page any more.
This is done in a separate mini-transaction, hence this operation does not restrict further work to only ibuf bitmap operations, which would result if the latch to the bitmap page were kept. NOTE: The free bits in the insert buffer bitmap must never exceed the free space on a page. It is unsafe to increment the bits in a separately committed mini-transaction, because in crash recovery, the free bits could momentarily be set too high. It is only safe to use this function for decrementing the free bits. Should more free space become available, we must not update the free bits here, because that would break crash recovery.
[in] | block | index page to which we have added new records; the free bits are updated if the index is non-clustered and non-unique and the page level is 0, and the page becomes fuller |
[in] | max_ins_size | value of maximum insert size with reorganize before the latest operation performed to the page |
[in] | increase | upper limit for the additional space used in the latest operation, if known, or ULINT_UNDEFINED |
void ibuf_update_free_bits_low | ( | const buf_block_t * | block, |
ulint | max_ins_size, | ||
mtr_t * | mtr | ||
) |
Updates the free bits for an uncompressed page to reflect the present state.
Does this in the mtr given, which means that the latching order rules virtually prevent any further operations for this OS thread until mtr is committed. NOTE: The free bits in the insert buffer bitmap must never exceed the free space on a page. It is safe to set the free bits in the same mini-transaction that updated the page. in/out: mtr
Does this in the mtr given, which means that the latching order rules virtually prevent any further operations for this OS thread until mtr is committed. NOTE: The free bits in the insert buffer bitmap must never exceed the free space on a page. It is safe to set the free bits in the same mini-transaction that updated the page.
block | in: index page |
max_ins_size | in: value of maximum insert size with reorganize before the latest operation performed to the page |
mtr | in/out: mtr |
void ibuf_update_free_bits_zip | ( | buf_block_t * | block, |
mtr_t * | mtr | ||
) |
Updates the free bits for a compressed page to reflect the present state.
Does this in the mtr given, which means that the latching order rules virtually prevent any further operations for this OS thread until mtr is committed. NOTE: The free bits in the insert buffer bitmap must never exceed the free space on a page. It is safe to set the free bits in the same mini-transaction that updated the page. in/out: mtr
Does this in the mtr given, which means that the latching order rules virtually prevent any further operations for this OS thread until mtr is committed. NOTE: The free bits in the insert buffer bitmap must never exceed the free space on a page. It is safe to set the free bits in the same mini-transaction that updated the page.
block | in/out: index page |
mtr | in/out: mtr |
void ibuf_update_max_tablespace_id | ( | void | ) |
Reads the biggest tablespace id from the high end of the insert buffer tree and updates the counter in fil_system.
|
constexpr |
Default value for maximum on-disk size of change buffer in terms of percentage of the buffer pool.
|
extern |
The insert buffer control structure.
|
constexpr |
|
constexpr |
|
constexpr |
|
constexpr |
fseg header for ibuf tree
|
extern |
Operations that can currently be buffered.