MySQL 26.10.0
Source Code Documentation
buf0buf.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 1995, 2026, Oracle and/or its affiliates.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License, version 2.0, as published by the
7Free Software Foundation.
8
9This program is designed to work with certain software (including
10but not limited to OpenSSL) that is licensed under separate terms,
11as designated in a particular file or component or in included license
12documentation. The authors of MySQL hereby grant you an additional
13permission to link the program and your derivative works with the
14separately licensed software that they have either included with
15the program or referenced in the documentation.
16
17This program is distributed in the hope that it will be useful, but WITHOUT
18ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
20for more details.
21
22You should have received a copy of the GNU General Public License along with
23this program; if not, write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
26*****************************************************************************/
27
28/** @file include/buf0buf.h
29 The database buffer pool high-level routines
30
31 Created 11/5/1995 Heikki Tuuri
32 *******************************************************/
33
34#ifndef buf0buf_h
35#define buf0buf_h
36
37#include "buf0types.h"
38#include "fil0fil.h"
39#include "hash0hash.h"
40#include "mtr0types.h"
41#include "os0proc.h"
42#include "page0types.h"
43#include "srv0shutdown.h"
44#include "srv0srv.h"
45#include "univ.i"
46#include "ut0byte.h"
47
48#include "buf/buf.h"
49
50#include <ostream>
51
52// Forward declaration
53struct fil_addr_t;
54
55/** @name Modes for buf_page_get_gen */
56/** @{ */
57enum class Page_fetch {
58 /** Get always */
59 NORMAL,
60
61 /** Same as NORMAL, but hint that the fetch is part of a large scan.
62 Try not to flood the buffer pool with pages that may not be accessed again
63 any time soon. */
64 SCAN,
65
66 /** get if in pool */
68
69 /** get if in pool, do not make the block young in the LRU list */
71
72 /** get and bufferfix, but set no latch; we have separated this case, because
73 it is error-prone programming not to set a latch, and it should be used with
74 care */
76
77 /** Get the page only if it's in the buffer pool, if not then set a watch on
78 the page. */
80
81 /** Like Page_fetch::NORMAL, but do not mind if the file page has been
82 freed. */
84
85 /** Like Page_fetch::POSSIBLY_FREED, but do not initiate read ahead. */
87};
88/** @} */
89
90/** @name Modes for buf_page_get_known_nowait */
91
92/** @{ */
93enum class Cache_hint {
94 /** Move the block to the start of the LRU list if there is a danger that the
95 block would drift out of the buffer pool*/
96 MAKE_YOUNG = 51,
97
98 /** Preserve the current LRU position of the block. */
99 KEEP_OLD = 52
100};
101
102/** @} */
103
104/** Number of bits to representing a buffer pool ID */
106
107/** The maximum number of buffer pools that can be defined */
109
110/** Maximum number of concurrent buffer pool watches */
111#define BUF_POOL_WATCH_SIZE (srv_n_purge_threads + 1)
112
113/** The maximum number of page_hash locks */
114constexpr ulint MAX_PAGE_HASH_LOCKS = 1024;
115
116/** The buffer pools of the database */
118
119#ifdef UNIV_HOTBACKUP
120/** first block, for --apply-log */
121extern buf_block_t *back_block1;
122/** second block, for page reorganize */
123extern buf_block_t *back_block2;
124#endif /* UNIV_HOTBACKUP */
125
126/** @brief States of a control block
127@see buf_page_t
128
129The enumeration values must be 0..7. */
130enum buf_page_state : uint8_t {
131 /** A sentinel for the buffer pool watch, element of buf_pool->watch[] */
133 /** Contains a clean compressed page */
135 /** Contains a compressed page that is in the buf_pool->flush_list */
137
138 /** Is in the free list; must be after the BUF_BLOCK_ZIP_ constants for
139 compressed-only pages @see buf_block_state_valid() */
141
142 /** When buf_LRU_get_free_block returns a block, it is in this state */
144
145 /** Contains a buffered file page */
147
148 /** Contains some main memory object */
150
151 /** Hash index should be removed before putting to the free list */
154
155const std::unordered_map<buf_page_state, std::string_view> buf_page_state_str{
156 /* First three states are for compression pages and are not states we would
157 get as we scan pages through buffer blocks */
159 {BUF_BLOCK_ZIP_PAGE, ""},
161 {BUF_BLOCK_NOT_USED, "NOT_USED"},
162 {BUF_BLOCK_READY_FOR_USE, "READY_FOR_USE"},
163 {BUF_BLOCK_FILE_PAGE, "FILE_PAGE"},
164 {BUF_BLOCK_MEMORY, "MEMORY"},
165 {BUF_BLOCK_REMOVE_HASH, "REMOVE_HASH"}};
166
167/** This structure defines information we will fetch from each buffer pool. It
168will be used to print table IO stats */
170 /* General buffer pool info */
171
172 /** Buffer Pool ID */
174 /** Buffer Pool size in pages */
176 /** Length of buf_pool->LRU */
178 /** buf_pool->LRU_old_len */
180 /** Length of buf_pool->free list */
182 /** Length of buf_pool->flush_list */
184 /** buf_pool->n_pend_unzip, pages pending decompress */
186 /** buf_pool->n_pend_reads, pages pending read */
188 /** Number of pages pending flush of given type */
189 std::array<size_t, BUF_FLUSH_N_TYPES> n_pending_flush;
190 /** number of pages made young */
192 /** number of pages not made young */
194 /** buf_pool->n_pages_read */
196 /** buf_pool->n_pages_created */
198 /** buf_pool->n_pages_written */
200 /** buf_pool->n_page_gets */
202 /** buf_pool->n_ra_pages_read_rnd, number of pages readahead */
204 /** buf_pool->n_ra_pages_read, number of pages readahead */
206 /** buf_pool->n_ra_pages_evicted, number of readahead pages evicted without
207 access */
209 /** num of buffer pool page gets since last printout */
211
212 /* Buffer pool access stats */
213 double page_made_young_rate; /*!< page made young rate in pages
214 per second */
215 double page_not_made_young_rate; /*!< page not made young rate
216 in pages per second */
217 double pages_read_rate; /*!< num of pages read per second */
218 double pages_created_rate; /*!< num of pages create per second */
219 double pages_written_rate; /*!< num of pages written per second */
220 ulint page_read_delta; /*!< num of pages read since last
221 printout */
222 ulint young_making_delta; /*!< num of pages made young since
223 last printout */
224 ulint not_young_making_delta; /*!< num of pages not make young since
225 last printout */
226
227 /* Statistics about read ahead algorithm. */
228 double pages_readahead_rnd_rate; /*!< random readahead rate in pages per
229 second */
230 double pages_readahead_rate; /*!< readahead rate in pages per
231 second */
232 double pages_evicted_rate; /*!< rate of readahead page evicted
233 without access, in pages per second */
234
235 /* Stats about LRU eviction */
236 ulint unzip_lru_len; /*!< length of buf_pool->unzip_LRU
237 list */
238 /* Counters for LRU policy */
239 ulint io_sum; /*!< buf_LRU_stat_sum.io */
240 ulint io_cur; /*!< buf_LRU_stat_cur.io, num of IO
241 for current interval */
242 ulint unzip_sum; /*!< buf_LRU_stat_sum.unzip */
243 ulint unzip_cur; /*!< buf_LRU_stat_cur.unzip, num
244 pages decompressed in current
245 interval */
246};
247
248/** The occupied bytes of lists in all buffer pools */
250 ulint LRU_bytes; /*!< LRU size in bytes */
251 ulint unzip_LRU_bytes; /*!< unzip_LRU size in bytes */
252 ulint flush_list_bytes; /*!< flush_list size in bytes */
253};
254
255#ifndef UNIV_HOTBACKUP
256/** Creates the buffer pool.
257@param[in] total_size Size of the total pool in bytes.
258@param[in] n_instances Number of buffer pool instances to create.
259@return DB_SUCCESS if success, DB_ERROR if not enough memory or error */
260dberr_t buf_pool_init(ulint total_size, ulint n_instances);
261
262/** Frees the buffer pool at shutdown. This must not be invoked before
263 freeing all mutexes. */
264void buf_pool_free_all();
265
266/** Determines if a block is intended to be withdrawn. The caller must ensure
267that there was a sufficient memory barrier to read curr_size and old_size.
268@param[in] buf_pool buffer pool instance
269@param[in] block pointer to control block
270@retval true if will be withdrawn */
271bool buf_block_will_withdrawn(buf_pool_t *buf_pool, const buf_block_t *block);
272
273/** Determines if a frame is intended to be withdrawn. The caller must ensure
274that there was a sufficient memory barrier to read curr_size and old_size.
275@param[in] buf_pool buffer pool instance
276@param[in] ptr pointer to a frame
277@retval true if will be withdrawn */
278bool buf_frame_will_withdrawn(buf_pool_t *buf_pool, const byte *ptr);
279
280/** This is the thread for resizing buffer pool. It waits for an event and
281when waked up either performs a resizing and sleeps again. */
282void buf_resize_thread();
283
284/** Checks if innobase_should_madvise_buf_pool() value has changed since we've
285last check and if so, then updates buf_pool_should_madvise and calls madvise
286for all chunks in all srv_buf_pool_instances.
287@see buf_pool_should_madvise comment for a longer explanation. */
289
290/** Clears the adaptive hash index on all pages in the buffer pool. */
292
293/** Gets the current size of buffer buf_pool in bytes.
294 @return size in bytes */
295static inline ulint buf_pool_get_curr_size(void);
296/** Gets the current size of buffer buf_pool in frames.
297 @return size in pages */
298static inline ulint buf_pool_get_n_pages(void);
299
300#endif /* !UNIV_HOTBACKUP */
301
302/** Gets the smallest oldest_modification lsn among all of the earliest
303added pages in flush lists. In other words - takes the last dirty page
304from each flush list, and calculates minimum oldest_modification among
305all of them. Does not acquire global lock for the whole process, so the
306result might come from inconsistent view on flush lists.
307
308@note Note that because of the relaxed order in each flush list, this
309functions no longer returns the smallest oldest_modification among all
310of the dirty pages. If you wanted to have a safe lsn, which is smaller
311than every oldest_modification, you would need to use another function:
312 buf_pool_get_oldest_modification_lwm().
313
314Returns zero if there were no dirty pages (flush lists were empty).
315
316@return minimum oldest_modification of last pages from flush lists,
317 zero if flush lists were empty */
319
320/** Gets a safe low watermark for oldest_modification. It's guaranteed
321that there were no dirty pages with smaller oldest_modification in the
322whole flush lists.
323
324Returns zero if flush lists were empty, be careful in such case, because
325taking the newest lsn is probably not a good idea. If you wanted to rely
326on some lsn in such case, you would need to follow pattern:
327
328 dpa_lsn = buf_flush_list_added->smallest_not_added_lsn();
329
330 lwm_lsn = buf_pool_get_oldest_modification_lwm();
331
332 if (lwm_lsn == 0) lwm_lsn = dpa_lsn;
333
334The order is important to avoid race conditions.
335
336@remarks
337It's guaranteed that the returned value will not be smaller than the
338last checkpoint lsn. It's not guaranteed that the returned value is
339the maximum possible. It's just the best effort for the low cost.
340It basically takes result of buf_pool_get_oldest_modification_approx()
341and subtracts maximum possible lag introduced by relaxed order in
342flush lists (srv_buf_flush_list_added_size).
343
344@return safe low watermark for oldest_modification of dirty pages,
345 or zero if flush lists were empty; if non-zero, it is then
346 guaranteed not to be at block boundary (and it points to lsn
347 inside data fragment of block) */
349
350#ifndef UNIV_HOTBACKUP
351
352/** Allocates a buf_page_t descriptor. This function must succeed. In case
353 of failure we assert in this function. */
355 MY_ATTRIBUTE((malloc));
356
357/** Free a buf_page_t descriptor.
358@param[in] bpage bpage descriptor to free */
360
361/** Allocates a buffer block.
362 @return own: the allocated block, in state BUF_BLOCK_MEMORY */
364 buf_pool_t *buf_pool); /*!< in: buffer pool instance,
365 or NULL for round-robin selection
366 of the buffer pool */
367/** Frees a buffer block which does not contain a file page. */
368static inline void buf_block_free(
369 buf_block_t *block); /*!< in, own: block to be freed */
370#endif /* !UNIV_HOTBACKUP */
371
372/** Copies contents of a buffer frame to a given buffer.
373@param[in] buf buffer to copy to
374@param[in] frame buffer frame
375@return buf */
376static inline byte *buf_frame_copy(byte *buf, const buf_frame_t *frame);
377
378#ifndef UNIV_HOTBACKUP
379/** This is the general function used to get optimistic access to a database
380page.
381@param[in] rw_latch RW_S_LATCH, RW_X_LATCH
382@param[in,out] block Guessed block
383@param[in] modify_clock Modify clock value
384@param[in] fetch_mode Fetch mode
385@param[in] file File name
386@param[in] line Line where called
387@param[in,out] mtr Mini-transaction
388@return true if success */
389bool buf_page_optimistic_get(ulint rw_latch, buf_block_t *block,
390 uint64_t modify_clock, Page_fetch fetch_mode,
391 const char *file, ulint line, mtr_t *mtr);
392
393/** This is used to get access to a known database page, when no waiting can be
394done.
395@param[in] rw_latch RW_S_LATCH or RW_X_LATCH.
396@param[in] block The known page.
397@param[in] hint Cache_hint::MAKE_YOUNG or Cache_hint::KEEP_OLD
398@param[in] file File name from where it was called.
399@param[in] line Line from where it was called.
400@param[in,out] mtr Mini-transaction covering the fetch
401@return true if success */
402bool buf_page_get_known_nowait(ulint rw_latch, buf_block_t *block,
403 Cache_hint hint, const char *file, ulint line,
404 mtr_t *mtr);
405
406/** Given a tablespace id and page number tries to get that page. If the
407page is not in the buffer pool it is not loaded and NULL is returned.
408Suitable for using when holding the lock_sys latches (as it avoids deadlock).
409@param[in] page_id page Id
410@param[in] location Location where called
411@param[in] mtr Mini-transaction
412@return pointer to a page or NULL */
413const buf_block_t *buf_page_try_get(const page_id_t &page_id,
414 ut::Location location, mtr_t *mtr);
415
416/** Get read access to a compressed page (usually of type
417FIL_PAGE_TYPE_ZBLOB or FIL_PAGE_TYPE_ZBLOB2).
418The page must be released with buf_page_release_zip().
419NOTE: the page is not protected by any latch. Mutual exclusion has to
420be implemented at a higher level. In other words, all possible
421accesses to a given page through this function must be protected by
422the same set of mutexes or latches.
423@param[in] page_id page id
424@param[in] page_size page size
425@return pointer to the block */
427 const page_size_t &page_size);
428
429/** This is the general function used to get access to a database page.
430@param[in] page_id Page id
431@param[in] page_size Page size
432@param[in] rw_latch RW_S_LATCH, RW_X_LATCH, RW_NO_LATCH
433@param[in] guess Guessed block or NULL
434@param[in] mode Fetch mode.
435@param[in] location Location from where this method was called.
436@param[in] mtr Mini-transaction
437@param[in] dirty_with_no_latch Mark page as dirty even if page is being
438 pinned without any latch
439@return pointer to the block or NULL */
441 const page_size_t &page_size, ulint rw_latch,
443 ut::Location location, mtr_t *mtr,
444 bool dirty_with_no_latch = false);
445
446/** NOTE! The following macros should be used instead of buf_page_get_gen,
447 to improve debugging. Only values RW_S_LATCH and RW_X_LATCH are allowed
448 in LA! */
450 ulint latch, ut::Location location,
451 mtr_t *mtr) {
452 return buf_page_get_gen(id, size, latch, nullptr, Page_fetch::NORMAL,
453 location, mtr);
454}
455/** Use these macros to bufferfix a page with no latching. Remember not to
456 read the contents of the page unless you know it is safe. Do not modify
457 the contents of the page! We have separated this case, because it is
458 error-prone programming not to set a latch, and it should be used
459 with care. */
461 const page_size_t &size,
462 ut::Location location,
463 mtr_t *mtr) {
465 location, mtr);
466}
467
468/** Initializes a page to the buffer buf_pool. The page is usually not read
469from a file even if it cannot be found in the buffer buf_pool. This is one
470of the functions which perform to a block a state transition NOT_USED =>
471FILE_PAGE (the other is buf_page_get_gen). The page is latched by passed mtr.
472@param[in] page_id Page id
473@param[in] page_size Page size
474@param[in] rw_latch RW_SX_LATCH, RW_X_LATCH
475@param[in] mtr Mini-transaction
476@return pointer to the block, page bufferfixed */
478 const page_size_t &page_size,
479 rw_lock_type_t rw_latch, mtr_t *mtr);
480
481#else /* !UNIV_HOTBACKUP */
482
483/** Inits a page to the buffer buf_pool, for use in mysqlbackup --restore.
484@param[in] page_id page id
485@param[in] page_size page size
486@param[in,out] block block to init */
487void meb_page_init(const page_id_t &page_id, const page_size_t &page_size,
488 buf_block_t *block);
489#endif /* !UNIV_HOTBACKUP */
490
491#ifndef UNIV_HOTBACKUP
492/** Releases a compressed-only page acquired with buf_page_get_zip(). */
493static inline void buf_page_release_zip(
494 buf_page_t *bpage); /*!< in: buffer block */
495
496/** Releases a latch, if specified.
497@param[in] block buffer block
498@param[in] rw_latch RW_S_LATCH, RW_X_LATCH, RW_NO_LATCH */
499static inline void buf_page_release_latch(buf_block_t *block, ulint rw_latch);
500
501/** Moves a page to the start of the buffer pool LRU list. This high-level
502function can be used to prevent an important page from slipping out of
503the buffer pool.
504@param[in,out] bpage buffer block of a file page */
506
507/** Moved a page to the end of the buffer pool LRU list so that it can be
508flushed out at the earliest.
509@param[in] bpage buffer block of a file page */
510void buf_page_make_old(buf_page_t *bpage);
511
512/** Returns true if the page can be found in the buffer pool hash table.
513NOTE that it is possible that the page is not yet read from disk,
514though.
515@param[in] page_id page id
516@return true if found in the page hash table */
517static inline bool buf_page_peek(const page_id_t &page_id);
518
519#ifdef UNIV_DEBUG
520
521/** Checks whether a page is present in the buffer pool and marked as freed.
522The page is not fetched when it is absent.
523@param[in] page_id page id
524@return true if the page is present and marked as freed */
525bool buf_page_was_freed(const page_id_t &page_id) noexcept;
526
527/** Sets file_page_was_freed true if the page is found in the buffer pool.
528This function should be called when we free a file page and want the
529debug version to check that it is not accessed any more unless
530reallocated.
531@param[in] page_id page id
532@return control block if found in page hash table, otherwise NULL */
534
535/** Sets file_page_was_freed false if the page is found in the buffer pool.
536This function should be called when we free a file page and want the
537debug version to check that it is not accessed any more unless
538reallocated.
539@param[in] page_id page id
540@return control block if found in page hash table, otherwise NULL */
542
543#endif /* UNIV_DEBUG */
544/** Reads the freed_page_clock of a buffer block.
545 @return freed_page_clock */
546[[nodiscard]] static inline ulint buf_page_get_freed_page_clock(
547 const buf_page_t *bpage); /*!< in: block */
548/** Reads the freed_page_clock of a buffer block.
549 @return freed_page_clock */
550[[nodiscard]] static inline ulint buf_block_get_freed_page_clock(
551 const buf_block_t *block); /*!< in: block */
552
553/** Tells, for heuristics, if a block is still close enough to the MRU end of
554the LRU list meaning that it is not in danger of getting evicted and also
555implying that it has been accessed recently.
556The page must be either buffer-fixed, either its page hash must be locked.
557@param[in] bpage block
558@return true if block is close to MRU end of LRU */
559static inline bool buf_page_peek_if_young(const buf_page_t *bpage);
560
561/** Recommends a move of a block to the start of the LRU list if there is
562danger of dropping from the buffer pool.
563NOTE: does not reserve the LRU list mutex.
564@param[in] bpage block to make younger
565@return true if should be made younger */
566static inline bool buf_page_peek_if_too_old(const buf_page_t *bpage);
567
568/** Gets the youngest modification log sequence number for a frame.
569 Returns zero if not file page or no modification occurred yet.
570 @return newest modification to page */
572 const buf_page_t *bpage); /*!< in: block containing the
573 page frame */
574
575/** Increment the modify clock.
576The caller must
577(1) own the buf_pool->mutex and block bufferfix count has to be zero,
578(2) own X or SX latch on the block->lock, or
579(3) operate on a thread-private temporary table
580@param[in,out] block buffer block */
581static inline void buf_block_modify_clock_inc(buf_block_t *block);
582
583/** Increments the bufferfix count.
584@param[in] location location
585@param[in,out] block block to bufferfix */
587 buf_block_t *block);
588
589/** Increments the bufferfix count.
590@param[in,out] bpage block to bufferfix
591@return the count */
592static inline ulint buf_block_fix(buf_page_t *bpage);
593
594/** Increments the bufferfix count.
595@param[in,out] block block to bufferfix
596@return the count */
597static inline ulint buf_block_fix(buf_block_t *block);
598
599/** Decrements the bufferfix count.
600@param[in,out] bpage block to bufferunfix
601@return the remaining buffer-fix count */
602static inline ulint buf_block_unfix(buf_page_t *bpage);
603
604/** Decrements the bufferfix count.
605@param[in,out] block block to bufferunfix
606@return the remaining buffer-fix count */
607static inline ulint buf_block_unfix(buf_block_t *block);
608
609/** Unfixes the page, unlatches the page,
610removes it from page_hash and removes it from LRU.
611@param[in,out] bpage pointer to the block */
613
614/** Increments the bufferfix count.
615@param[in,out] b block to bufferfix
616@param[in] l location where requested */
618 ut::Location l [[maybe_unused]]) {
620}
621#else /* !UNIV_HOTBACKUP */
622static inline void buf_block_modify_clock_inc(buf_block_t *block) {}
623#endif /* !UNIV_HOTBACKUP */
624
625#ifndef UNIV_HOTBACKUP
626
627/** Gets the space id, page offset, and byte offset within page of a pointer
628pointing to a buffer frame containing a file page.
629@param[in] ptr pointer to a buffer frame
630@param[out] space space id
631@param[out] addr page offset and byte offset */
632static inline void buf_ptr_get_fsp_addr(const void *ptr, space_id_t *space,
633 fil_addr_t *addr);
634
635#ifdef UNIV_DEBUG
636/** Finds a block in the buffer pool that points to a
637given compressed page. Used only to confirm that buffer pool does not contain a
638given pointer, thus protected by zip_free_mutex.
639@param[in] buf_pool buffer pool instance
640@param[in] data pointer to compressed page
641@return buffer block pointing to the compressed page, or NULL */
642buf_block_t *buf_pool_contains_zip(buf_pool_t *buf_pool, const void *data);
643#endif /* UNIV_DEBUG */
644
645/***********************************************************************
646FIXME_FTS: Gets the frame the pointer is pointing to. */
648 /* out: pointer to frame */
649 byte *ptr); /* in: pointer to a frame */
650
651#if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
652/** Validates the buffer pool data structure.
653 @return true */
654bool buf_validate(void);
655#endif /* UNIV_DEBUG || UNIV_BUF_DEBUG */
656#if defined UNIV_DEBUG_PRINT || defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
657/** Prints info of the buffer pool data structure. */
658void buf_print(void);
659#endif /* UNIV_DEBUG_PRINT || UNIV_DEBUG || UNIV_BUF_DEBUG */
660#endif /* !UNIV_HOTBACKUP */
662 /** Do not crash at the end of buf_page_print(). */
664 /** Do not print the full page dump. */
667
668/** Prints a page to stderr.
669@param[in] read_buf a database page
670@param[in] page_size page size
671@param[in] flags 0 or BUF_PAGE_PRINT_NO_CRASH or
672BUF_PAGE_PRINT_NO_FULL */
673void buf_page_print(const byte *read_buf, const page_size_t &page_size,
674 ulint flags);
675
676/** Decompress a block.
677 @return true if successful */
678bool buf_zip_decompress(buf_block_t *block, /*!< in/out: block */
679 bool check); /*!< in: true=verify the page checksum */
680#ifndef UNIV_HOTBACKUP
681#ifdef UNIV_DEBUG
682/** Returns the number of latched pages in the buffer pool.
683 @return number of latched pages */
685#endif /* UNIV_DEBUG */
686/** Returns the number of pending buf pool read ios.
687 @return number of pending read I/O operations */
689/** Prints info of the buffer i/o. */
690void buf_print_io(FILE *file); /*!< in: file where to print */
691/** Collect buffer pool stats information for a buffer pool. Also
692 record aggregated stats if there are more than one buffer pool
693 in the server */
695 buf_pool_t *buf_pool, /*!< in: buffer pool */
696 ulint pool_id, /*!< in: buffer pool ID */
697 buf_pool_info_t *all_pool_info); /*!< in/out: buffer pool info
698 to fill */
699/** Return the ratio in percents of modified pages in the buffer pool /
700database pages in the buffer pool.
701@return modified page percentage ratio */
702double buf_get_modified_ratio_pct(void);
703/** Refresh the statistics used to print per-second averages. */
705
706/** Assert that all file pages in the buffer are in a replaceable state. */
708
709/** Computes number of pending I/O read operations for the buffer pool.
710@return number of pending i/o reads */
712
713/** Computes number of pending I/O write operations for the buffer pool.
714@return number of pending i/o writes */
716
717/** Waits until there are no pending I/O operations for the buffer pool.
718Keep waiting in loop with sleeps, emitting information every minute.
719This is used to avoid risk of some pending async IO (e.g. enqueued by
720the linear read-ahead), which would involve ibuf merge and create new
721redo records. */
723
724/** Invalidates the file pages in the buffer pool when an archive recovery is
725 completed. All the file pages buffered must be in a replaceable state when
726 this function is called: not latched and not modified. */
727void buf_pool_invalidate(void);
728
729/*========================================================================
730--------------------------- LOWER LEVEL ROUTINES -------------------------
731=========================================================================*/
732
733#ifdef UNIV_DEBUG
734/** Adds latch level info for the rw-lock protecting the buffer frame. This
735should be called in the debug version after a successful latching of a page if
736we know the latching order level of the acquired latch.
737@param[in] block buffer page where we have acquired latch
738@param[in] level latching order level */
739static inline void buf_block_dbg_add_level(buf_block_t *block,
740 latch_level_t level);
741#else /* UNIV_DEBUG */
742#define buf_block_dbg_add_level(block, level) /* nothing */
743#endif /* UNIV_DEBUG */
744
745#endif /* !UNIV_HOTBACKUP */
746
747/** Gets the state of a block.
748 @return state */
750 const buf_page_t *bpage); /*!< in: pointer to the control block */
751/** Gets the state of a block.
752 @return state */
753[[nodiscard]] static inline enum buf_page_state buf_block_get_state(
754 const buf_block_t *block); /*!< in: pointer to the control block */
755
756/** Sets the state of a block.
757@param[in,out] bpage pointer to control block
758@param[in] state state */
759static inline void buf_page_set_state(buf_page_t *bpage,
760 enum buf_page_state state);
761
762/** Sets the state of a block.
763@param[in,out] block pointer to control block
764@param[in] state state */
765static inline void buf_block_set_state(buf_block_t *block,
766 enum buf_page_state state);
767
768/** Determines if a block is mapped to a tablespace.
769 @return true if mapped */
770[[nodiscard]] static inline bool buf_page_in_file(
771 const buf_page_t *bpage); /*!< in: pointer to control block */
772#ifndef UNIV_HOTBACKUP
773/** Determines if a block should be on unzip_LRU list.
774 @return true if block belongs to unzip_LRU */
775[[nodiscard]] static inline bool buf_page_belongs_to_unzip_LRU(
776 const buf_page_t *bpage); /*!< in: pointer to control block */
777
778/** Gets the mutex of a block.
779 @return pointer to mutex protecting bpage */
780[[nodiscard]] static inline BPageMutex *buf_page_get_mutex(
781 const buf_page_t *bpage); /*!< in: pointer to control block */
782
783/** Get the flush type of a page.
784 @return flush type */
785[[nodiscard]] static inline buf_flush_t buf_page_get_flush_type(
786 const buf_page_t *bpage); /*!< in: buffer page */
787
788/** Set the flush type of a page.
789@param[in] bpage buffer page
790@param[in] flush_type flush type */
791static inline void buf_page_set_flush_type(buf_page_t *bpage,
793
794/** Map a block to a file page.
795@param[in,out] block pointer to control block
796@param[in] page_id page id */
797static inline void buf_block_set_file_page(buf_block_t *block,
798 const page_id_t &page_id);
799
800/** Gets the io_fix state of a block.
801 @return io_fix state */
802[[nodiscard]] static inline enum buf_io_fix buf_page_get_io_fix(
803 const buf_page_t *bpage); /*!< in: pointer to the control block */
804/** Gets the io_fix state of a block.
805 @return io_fix state */
806[[nodiscard]] static inline enum buf_io_fix buf_block_get_io_fix(
807 const buf_block_t *block); /*!< in: pointer to the control block */
808
809/** Sets the io_fix state of a block.
810@param[in,out] bpage control block
811@param[in] io_fix io_fix state */
812static inline void buf_page_set_io_fix(buf_page_t *bpage,
813 enum buf_io_fix io_fix);
814
815/** Sets the io_fix state of a block.
816@param[in,out] block control block
817@param[in] io_fix io_fix state */
818static inline void buf_block_set_io_fix(buf_block_t *block,
819 enum buf_io_fix io_fix);
820
821/** Makes a block sticky. A sticky block implies that even after we release
822the buf_pool->LRU_list_mutex and the block->mutex:
823* it cannot be removed from the flush_list
824* the block descriptor cannot be relocated
825* it cannot be removed from the LRU list
826Note that:
827* the block can still change its position in the LRU list
828* the next and previous pointers can change.
829@param[in,out] bpage control block */
830static inline void buf_page_set_sticky(buf_page_t *bpage);
831
832/** Removes stickiness of a block. */
833static inline void buf_page_unset_sticky(
834 buf_page_t *bpage); /*!< in/out: control block */
835/** Determine if a buffer block can be relocated in memory. The block
836 can be dirty, but it must not be I/O-fixed or bufferfixed. */
837[[nodiscard]] static inline bool buf_page_can_relocate(
838 const buf_page_t *bpage); /*!< control block being relocated */
839
840/** Determine if a block has been flagged old.
841@param[in] bpage control block
842@return true if old */
843[[nodiscard]] static inline bool buf_page_is_old(const buf_page_t *bpage);
844
845/** Flag a block old.
846@param[in,out] bpage control block
847@param[in] old old */
848static inline void buf_page_set_old(buf_page_t *bpage, bool old);
849
850/** Determine the time of first access of a block in the buffer pool.
851 @return Time of first access, zero if not accessed
852 */
853[[nodiscard]] static inline std::chrono::steady_clock::time_point
854buf_page_is_accessed(const buf_page_t *bpage); /*!< in: control block */
855/** Flag a block accessed. */
856static inline void buf_page_set_accessed(
857 buf_page_t *bpage); /*!< in/out: control block */
858
859/** Gets the buf_block_t handle of a buffered file block if an uncompressed
860page frame exists, or NULL. page frame exists, or NULL. The caller must hold
861either the appropriate hash lock in any mode, either the LRU list mutex. Note:
862even though bpage is not declared a const we don't update its value. It is safe
863to make this pure.
864@param[in] bpage control block, or NULL
865@return control block, or NULL */
866[[nodiscard]] static inline buf_block_t *buf_page_get_block(buf_page_t *bpage);
867#ifdef UNIV_DEBUG
868/** Gets a pointer to the memory frame of a block.
869 @return pointer to the frame */
870[[nodiscard]] static inline buf_frame_t *buf_block_get_frame(
871 const buf_block_t *block); /*!< in: pointer to the control block */
872#else /* UNIV_DEBUG */
873#define buf_block_get_frame(block) (block)->frame
874#endif /* UNIV_DEBUG */
875#else /* !UNIV_HOTBACKUP */
876#define buf_block_get_frame(block) (block)->frame
877#endif /* !UNIV_HOTBACKUP */
878
879/** Get a buffer block from an adaptive hash index pointer.
880This function does not return if the block is not identified.
881@param[in] ptr pointer to within a page frame
882@return pointer to block, never NULL */
883buf_block_t *buf_block_from_ahi(const byte *ptr);
884
885/** Find out if a block pointer points into one of currently used chunks of
886the buffer pool. This is useful if you stored the pointer some time ago, and
887want to dereference it now, and are afraid that buffer pool resize could free
888the memory pointed by it. Thus calling this function requires holding at least
889one of the latches which prevent freeing memory from buffer pool for the
890duration of the call and until you pin the block in some other way, as otherwise
891the result of this function might be obsolete by the time you dereference the
892block (an s-latch on buf_page_hash_lock_get for any hash cell is enough).
893@param buf_pool The buffer pool instance to search in.
894@param ptr A pointer which you want to check. This function will not
895 dereference it.
896@return true iff `block` points inside one of the chunks of the `buf_pool`
897*/
898bool buf_is_block_in_instance(const buf_pool_t *buf_pool,
899 const buf_block_t *ptr);
900
901#ifndef UNIV_HOTBACKUP
902
903/** Inits a page for read to the buffer buf_pool. If the page is
904(1) already in buf_pool, or
905(2) if we specify to read only ibuf pages and the page is not an ibuf page, or
906(3) if the space is deleted or being deleted,
907then this function does nothing.
908Sets the io_fix flag to BUF_IO_READ and sets a non-recursive exclusive lock
909on the buffer frame. The io-handler must take care that the flag is cleared
910and the lock released later.
911@param[in] mode BUF_READ_IBUF_PAGES_ONLY, ...
912@param[in] page_id page id
913@param[in] page_size page size
914@param[in] unzip true=request uncompressed page
915@return pointer to the block or NULL */
917 const page_size_t &page_size, bool unzip);
918
919/** Completes an asynchronous read or write request of a file page to or from
920the buffer pool.
921@param[in] bpage pointer to the block in question
922@param[in] evict whether or not to evict the page from LRU list
923@return DB_SUCCESS or DB_INDEX_CORRUPT */
924[[nodiscard]] dberr_t buf_page_io_complete(buf_page_t *bpage, bool evict);
925
926/** Free a stale page. Caller must hold the LRU mutex. Upon successful page free
927the LRU mutex will be released.
928@param[in,out] buf_pool Buffer pool the page belongs to.
929@param[in,out] bpage Page to free.
930@return true if page was freed. */
931bool buf_page_free_stale(buf_pool_t *buf_pool, buf_page_t *bpage) noexcept;
932
933/** Evict a page from the buffer pool.
934@param[in] page_id page to be evicted.
935@param[in] page_size page size of the tablespace.
936@param[in] dirty_is_ok if true, it is OK for the page to be dirty. */
937void buf_page_force_evict(const page_id_t &page_id,
938 const page_size_t &page_size,
939 const bool dirty_is_ok = true) noexcept;
940
941/** Free a stale page found under the page hash S latch. The caller must hold
942hash_lock in S mode. This overload never accepts nullptr for hash_lock. The hash
943lock will be released before this function returns.
944@param[in,out] buf_pool Buffer pool the page belongs to.
945@param[in,out] bpage Page to free.
946@param[in] hash_lock Hash lock for bpage->id, held in S mode.
947@return true if page was freed. */
948bool buf_page_free_stale(buf_pool_t *buf_pool, buf_page_t *bpage,
949 rw_lock_t *hash_lock) noexcept;
950
951/** Free a stale page that is being written. The caller must be within the
952page's write code path.
953@param[in,out] bpage Page to free.
954@param[in] owns_sx_lock SX lock on block->lock is set. */
956 bool owns_sx_lock = false) noexcept;
957
958/** Calculates the index of a buffer pool to the buf_pool[] array.
959 @return the position of the buffer pool in buf_pool[] */
960[[nodiscard]] static inline ulint buf_pool_index(
961 const buf_pool_t *buf_pool); /*!< in: buffer pool */
962/** Returns the buffer pool instance given a page instance
963 @return buf_pool */
965 const buf_page_t *bpage); /*!< in: buffer pool page */
966/** Returns the buffer pool instance given a block instance
967 @return buf_pool */
969 const buf_block_t *block); /*!< in: block */
970
971/** Returns the buffer pool instance given a page id.
972@param[in] page_id page id
973@return buffer pool */
974static inline buf_pool_t *buf_pool_get(const page_id_t &page_id);
975
976/** Returns the buffer pool instance given its array index
977 @return buffer pool */
979 ulint index); /*!< in: array index to get
980 buffer pool instance from */
981
982/** Returns the control block of a file page, NULL if not found.
983@param[in] buf_pool buffer pool instance
984@param[in] page_id page id
985@return block, NULL if not found */
987 const page_id_t &page_id);
988
989/** Returns the control block of a file page, NULL if not found.
990If the block is found and lock is not NULL then the appropriate
991page_hash lock is acquired in the specified lock mode. Otherwise,
992mode value is ignored. It is up to the caller to release the
993lock. If the block is found and the lock is NULL then the page_hash
994lock is released by this function.
995@param[in] buf_pool buffer pool instance
996@param[in] page_id page id
997@param[in,out] lock lock of the page hash acquired if bpage is
998found, NULL otherwise. If NULL is passed then the hash_lock is released by
999this function.
1000@param[in] lock_mode RW_LOCK_X or RW_LOCK_S. Ignored if
1001lock == NULL
1002@param[in] watch if true, return watch sentinel also.
1003@return pointer to the bpage or NULL; if NULL, lock is also NULL or
1004a watch sentinel. */
1006 const page_id_t &page_id,
1007 rw_lock_t **lock,
1009 bool watch = false);
1010
1011/** Returns the control block of a file page, NULL if not found.
1012If the block is found and lock is not NULL then the appropriate
1013page_hash lock is acquired in the specified lock mode. Otherwise,
1014mode value is ignored. It is up to the caller to release the
1015lock. If the block is found and the lock is NULL then the page_hash
1016lock is released by this function.
1017@param[in] buf_pool buffer pool instance
1018@param[in] page_id page id
1019@param[in,out] lock lock of the page hash acquired if bpage is
1020found, NULL otherwise. If NULL is passed then the hash_lock is released by
1021this function.
1022@param[in] lock_mode RW_LOCK_X or RW_LOCK_S. Ignored if
1023lock == NULL
1024@return pointer to the block or NULL; if NULL, lock is also NULL. */
1026 const page_id_t &page_id,
1027 rw_lock_t **lock,
1029
1030/* There are four different ways we can try to get a bpage or block
1031from the page hash:
10321) Caller already holds the appropriate page hash lock: in the case call
1033buf_page_hash_get_low() function.
10342) Caller wants to hold page hash lock in x-mode
10353) Caller wants to hold page hash lock in s-mode
10364) Caller doesn't want to hold page hash lock */
1038 const page_id_t &page_id,
1039 rw_lock_t **l) {
1040 return buf_page_hash_get_locked(b, page_id, l, RW_LOCK_S);
1041}
1043 const page_id_t &page_id,
1044 rw_lock_t **l) {
1045 return buf_page_hash_get_locked(b, page_id, l, RW_LOCK_X);
1046}
1048 return buf_page_hash_get_locked(b, page_id, nullptr, 0);
1049}
1051 const page_id_t &page_id) {
1052 return buf_page_hash_get_locked(b, page_id, nullptr, 0, true);
1053}
1054
1056 const page_id_t &page_id,
1057 rw_lock_t **l) {
1058 return buf_block_hash_get_locked(b, page_id, l, RW_LOCK_S);
1059}
1061 const page_id_t &page_id,
1062 rw_lock_t **l) {
1063 return buf_block_hash_get_locked(b, page_id, l, RW_LOCK_X);
1064}
1066 const page_id_t &page_id) {
1067 return buf_block_hash_get_locked(b, page_id, nullptr, 0);
1068}
1069
1070/** Gets the current length of the free list of buffer blocks.
1071 @return length of the free list */
1073
1074/** Determine if a block is a sentinel for a buffer pool watch.
1075@param[in] buf_pool buffer pool instance
1076@param[in] bpage block
1077@return true if a sentinel for a buffer pool watch, false if not */
1078[[nodiscard]] bool buf_pool_watch_is_sentinel(const buf_pool_t *buf_pool,
1079 const buf_page_t *bpage);
1080
1081/** Stop watching if the page has been read in.
1082buf_pool_watch_set(same_page_id) must have returned NULL before.
1083@param[in] page_id page id */
1084void buf_pool_watch_unset(const page_id_t &page_id);
1085
1086/** Check if the page has been read in.
1087This may only be called after buf_pool_watch_set(same_page_id)
1088has returned NULL and before invoking buf_pool_watch_unset(same_page_id).
1089@param[in] page_id page id
1090@return false if the given page was not read in, true if it was */
1091[[nodiscard]] bool buf_pool_watch_occurred(const page_id_t &page_id);
1092
1093/** Get total buffer pool statistics.
1094@param[out] LRU_len Length of all lru lists
1095@param[out] free_len Length of all free lists
1096@param[out] flush_list_len Length of all flush lists */
1097void buf_get_total_list_len(ulint *LRU_len, ulint *free_len,
1098 ulint *flush_list_len);
1099
1100/** Get total list size in bytes from all buffer pools. */
1102 buf_pools_list_size_t *buf_pools_list_size); /*!< out: list sizes
1103 in all buffer pools */
1104/** Get total buffer pool statistics. */
1106 buf_pool_stat_t *tot_stat); /*!< out: buffer pool stats */
1107
1108/** Get the nth chunk's buffer block in the specified buffer pool.
1109@param[in] buf_pool buffer pool instance
1110@param[in] n nth chunk in the buffer pool
1111@param[in] chunk_size chunk_size
1112@return the nth chunk's buffer block. */
1113static inline buf_block_t *buf_get_nth_chunk_block(const buf_pool_t *buf_pool,
1114 ulint n, ulint *chunk_size);
1115
1116/** Calculate aligned buffer pool size based on srv_buf_pool_chunk_unit,
1117if needed.
1118@param[in] size size in bytes
1119@return aligned size */
1121
1122/** Adjust the proposed chunk unit size so that it satisfies all invariants
1123@param[in] size proposed size of buffer pool chunk unit in bytes
1124@return adjusted size which meets invariants */
1126
1127/** Calculate the checksum of a page from compressed table and update the
1128page.
1129@param[in,out] page page to update
1130@param[in] size compressed page size
1131@param[in] lsn LSN to stamp on the page
1132@param[in] skip_lsn_check true to skip check for lsn (in DEBUG) */
1134 bool skip_lsn_check);
1135
1136/** Return how many more pages must be added to the withdraw list to reach the
1137withdraw target of the currently ongoing buffer pool resize.
1138@param[in] buf_pool buffer pool instance
1139@return page count to be withdrawn or zero if the target is already achieved or
1140if the buffer pool is not currently being resized. */
1141static inline ulint buf_get_withdraw_depth(buf_pool_t *buf_pool);
1142
1143#endif /* !UNIV_HOTBACKUP */
1144
1145/** The common buffer control block structure
1146for compressed and uncompressed frames */
1147
1148/** Number of bits used for buffer page states. */
1149constexpr uint32_t BUF_PAGE_STATE_BITS = 3;
1150
1151template <typename T>
1152class copyable_atomic_t : public std::atomic<T> {
1153 public:
1155 : std::atomic<T>(other.load(std::memory_order_relaxed)) {}
1156};
1157
1160 public:
1161 /** Copy constructor.
1162 @param[in] other Instance to copy from. */
1164 : id(other.id),
1165 size(other.size),
1167 io_fix(other.io_fix),
1168 state(other.state),
1169 flush_type(other.flush_type),
1171#ifndef UNIV_HOTBACKUP
1172 hash(other.hash),
1173#endif /* !UNIV_HOTBACKUP */
1174 list(other.list),
1177 LRU(other.LRU),
1178 zip(other.zip)
1179#ifndef UNIV_HOTBACKUP
1180 ,
1182 m_space(other.m_space),
1184 m_version(other.m_version),
1185 access_time(other.access_time),
1186 m_dblwr_id(other.m_dblwr_id),
1187 old(other.old)
1188#ifdef UNIV_DEBUG
1189 ,
1193 in_LRU_list(other.in_LRU_list),
1196#endif /* UNIV_DEBUG */
1197#endif /* !UNIV_HOTBACKUP */
1198 {
1199#ifndef UNIV_HOTBACKUP
1200 m_space->inc_ref();
1201#endif /* !UNIV_HOTBACKUP */
1202 }
1203
1204 public:
1205 /** Check if the given ptr lies in a memory block of type BUF_BLOCK_MEMORY.
1206 This is checked by looking at the FIL_PAGE_LSN. If the FIL_PAGE_LSN is zero,
1207 then the block state is assumed to be BUF_BLOCK_MEMORY.
1208 @return true if the FIL_PAGE_LSN is zero, false otherwise. */
1209 [[nodiscard]] static bool is_memory(const page_t *const ptr) noexcept;
1210
1211 /** Check if the state of this page is BUF_BLOCK_MEMORY.
1212 @return true if the state is BUF_BLOCK_MEMORY, or false. */
1213 [[nodiscard]] bool is_memory() const noexcept {
1214 return state == BUF_BLOCK_MEMORY;
1215 }
1216
1217#ifndef UNIV_HOTBACKUP
1218 /** Set the doublewrite buffer ID.
1219 @param[in] batch_id Double write batch ID that flushed the page. */
1220 void set_dblwr_batch_id(uint16_t batch_id) { m_dblwr_id = batch_id; }
1221
1222 /** @return the double write batch id, or uint16_t max if undefined. */
1223 [[nodiscard]] uint16_t get_dblwr_batch_id() const { return (m_dblwr_id); }
1224
1225 /** Retrieve the tablespace id.
1226 @return tablespace id */
1227 [[nodiscard]] space_id_t space() const noexcept { return id.space(); }
1228
1229 /** Retrieve the page number.
1230 @return page number */
1231 [[nodiscard]] page_no_t page_no() const noexcept { return id.page_no(); }
1232
1233 /** Checks if this space reference saved during last page ID initialization
1234 was deleted or truncated since.
1235 @return true when space reference stored leads was deleted or truncated and
1236 this page should be discarded. Result is up to date until the fil_shard mutex
1237 is released. */
1238 inline bool is_stale() const {
1239 ut_a(m_space != nullptr);
1240 ut_a(id.space() == m_space->id);
1241 ut_a(m_version <= m_space->get_current_version());
1243 ut_a(!m_space->is_deleted());
1244 return false;
1245 } else {
1246 return true;
1247 }
1248 }
1249
1250 /** Checks if this space reference saved during last page ID initialization
1251 was deleted or truncated since.
1252 @return true when space reference stored leads was deleted or truncated and
1253 this page should be discarded. When false is returned, the status of stale is
1254 checked to be guaranteed. */
1255 inline bool was_stale() const {
1256 ut_a(m_space != nullptr);
1257 ut_a(id.space() == m_space->id);
1258 /* If the version is OK, then the space must not be deleted.
1259 However, version is modified before the deletion flag is set, so reading
1260 these values need to be executed in reversed order. The atomic reads
1261 cannot be relaxed for it to work. */
1262 bool was_not_deleted = m_space->was_not_deleted();
1264 ut_a(was_not_deleted);
1265 return false;
1266 } else {
1267 return true;
1268 }
1269 }
1270
1271 /** Retrieve the tablespace object if one was available during page ID
1272 initialization. The returned object is safe to use as long as this buf_page_t
1273 object is not changed. Caller should have a IO fix, buffer fix, mutex or any
1274 other mean to assure the page will not be freed. After that is released the
1275 space object may be freed.
1276 @return tablespace object */
1277 inline fil_space_t *get_space() const { return m_space; }
1278
1279 /** Set the stored page id to a new value. This is used only on a buffer
1280 block with BUF_BLOCK_MEMORY state.
1281 @param[in] page_id the new value of the page id. */
1282 void set_page_id(const page_id_t page_id) {
1284 id = page_id;
1285 }
1286
1287 /** Set the page size to a new value. This can be used during initialization
1288 of a newly allocated buffer page.
1289 @param[in] page_size the new value of the page size. */
1290 void set_page_size(const page_size_t &page_size) {
1292 size = page_size;
1293 }
1294
1295 /** Sets stored page ID to the new value. Handles space object reference
1296 count.
1297 @param[in] new_page_id new page ID to be set. */
1298 inline void reset_page_id(page_id_t new_page_id) {
1299 if (m_space != nullptr) {
1300 /* If we reach this line through a call chain:
1301 srv_shutdown -> buf_pool_free_all -> buf_pool_free_instance ->
1302 buf_page_free_descriptor, then we are already past the fil system
1303 shutdown, and all fil_space_t objects were already freed. */
1305 m_space->dec_ref();
1306 }
1307 }
1308 id = new_page_id;
1310 }
1311
1312 /** Sets stored value to invalid/empty value. Handles space object reference
1313 count. */
1314 inline void reset_page_id() {
1316 }
1317
1318 private:
1319 /** Updates new space reference and acquires "reference count latch" and the
1320 current version of the space object. */
1321 inline void space_id_changed() {
1322 m_space = nullptr;
1323 m_version = 0;
1324 if (id.space() != UINT32_UNDEFINED) {
1325 m_space = fil_space_get(id.space());
1326 /* There could be non-existent tablespace while importing it */
1327 if (m_space) {
1328 m_space->inc_ref();
1329 /* We don't have a way to check the MDL locks, which are guarding the
1330 version number, so we don't use get_current_version(). */
1332 }
1333 }
1334 }
1335
1336 public:
1337 /** @return the flush observer instance. */
1339
1340 /** Set the flush observer for the page.
1341 @param[in] flush_observer The flush observer to set. */
1342 void set_flush_observer(Flush_observer *flush_observer) noexcept {
1343 /* Don't allow to set flush observer from non-null to null, or from one
1344 observer to another. */
1345 ut_a(m_flush_observer == nullptr || m_flush_observer == flush_observer);
1346 m_flush_observer = flush_observer;
1347 }
1348
1349 /** Remove the flush observer. */
1351#endif /* !UNIV_HOTBACKUP */
1352
1353 /** @return the LSN of the latest modification. */
1355
1356 /** @return the LSN of the first modification since the last time
1357 it was clean. */
1359
1360 /** @return true if the page is dirty. */
1361 bool is_dirty() const noexcept { return get_oldest_lsn() > 0; }
1362
1363 /** Set the latest modification LSN.
1364 @param[in] lsn Latest modification lSN. */
1366
1367 /** Set the LSN when the page is modified for the first time.
1368 @param[in] lsn First modification LSN. */
1369 void set_oldest_lsn(lsn_t lsn) noexcept;
1370
1371 /** Set page to clean state. */
1373
1374 /** @name General fields
1375 None of these bit-fields must be modified without holding
1376 buf_page_get_mutex() [buf_block_t::mutex or
1377 buf_pool->zip_mutex], since they can be stored in the same
1378 machine word. */
1379 /** @{ */
1380
1381 /** Page id. */
1383
1384 /** Page size. */
1386
1387 /** Count of how many fold this block is currently bufferfixed. */
1389
1390 private:
1391 /** Type of pending I/O operation.
1392 Modified under protection of buf_page_get_mutex(this).
1393 Read under protection of rules described in @see Buf_io_fix_latching_rules */
1395
1396 public:
1397 /** Checks if io_fix has any of the known enum values.
1398 @param[in] io_fix the value to test
1399 @return true iff io_fix has any of the known enum values
1400 */
1402 switch (io_fix) {
1403 case BUF_IO_NONE:
1404 case BUF_IO_READ:
1405 case BUF_IO_WRITE:
1406 case BUF_IO_PIN:
1407 return true;
1408 }
1409 return false;
1410 }
1411
1412#ifdef UNIV_DEBUG
1413 private:
1414 /** Checks if io_fix has any of the known enum values.
1415 @return true iff io_fix has any of the known enum values
1416 */
1419 }
1420 /* Helper debug-only functions related latching rules are moved to a separate
1421 class so that this header doesn't have to pull in Stateful_latching_rules.*/
1424
1425 /* Helper debug-only class used to track which thread is currently responsible
1426 for performing I/O operation on this page. There's at most one such thread and
1427 the responsibility might be passed from one to another during async I/O. This
1428 is used to prove correctness of io_fix state transitions and checking it
1429 without a latch in the io_completion threads. */
1431 /** The thread responsible for I/O on this page, or an impossible value if
1432 no thread is currently responsible for I/O*/
1433 std::thread::id responsible_thread{std::thread().get_id()};
1434
1435 public:
1436 /** Checks if there is any thread responsible for I/O on this page now.
1437 @return true iff there is a thread responsible for I/O on this page.*/
1439 return responsible_thread != std::thread().get_id();
1440 }
1441
1442 /** Checks if the current thread is responsible for I/O on this page now.
1443 @return true iff the current thread is responsible for I/O on this page.*/
1446 }
1447
1448 /** Called by the thread responsible for I/O on this page to release its
1449 responsibility. */
1450 void release() {
1452 responsible_thread = std::thread().get_id();
1453 }
1454
1455 /** Called by the thread which becomes responsible for I/O on this page to
1456 indicate that it takes the responsibility. */
1457 void take() {
1460 }
1461 };
1462 /** Tracks which thread is responsible for I/O on this page. */
1464
1465 public:
1466 /** Checks if there is any thread responsible for I/O on this page now.
1467 @return true iff there is a thread responsible for I/O on this page.*/
1470 }
1471
1472 /** Checks if the current thread is responsible for I/O on this page now.
1473 @return true iff the current thread is responsible for I/O on this page.*/
1476 }
1477
1478 /** Called by the thread responsible for I/O on this page to release its
1479 responsibility. */
1481
1482 /** Called by the thread which becomes responsible for I/O on this page to
1483 indicate that it takes the responsibility. */
1486 io_fix.load(std::memory_order_relaxed) == BUF_IO_WRITE ||
1487 io_fix.load(std::memory_order_relaxed) == BUF_IO_READ);
1489 }
1490#endif /* UNIV_DEBUG */
1491 private:
1492 /** Retrieves a value of io_fix without requiring or acquiring any latches.
1493 Note that this implies that the value might be stale unless caller establishes
1494 happens-before relation in some other way.
1495 This is a low-level function which shouldn't be used directly, but
1496 rather via wrapper methods which check if proper latches are taken or via one
1497 of the many `was_io_fix_something()` methods with name explicitly warning the
1498 developer about the uncertainty involved.
1499 @return the value of io_fix at some moment "during" the call */
1502 return io_fix.load(std::memory_order_relaxed);
1503 }
1504
1505 public:
1506 /** This is called only when having full ownership of the page object and no
1507 other thread can reach it. This currently happens during buf_pool_create(),
1508 buf_pool_resize() (which latch quite a lot) or from fil_tablespace_iterate()
1509 which creates a fake, private block which is not really a part of the buffer
1510 pool.
1511 Therefore we allow this function to set io_fix without checking for any
1512 latches.
1513 Please use set_io_fix(BUF_IO_NONE) to change state in a regular situation. */
1515 io_fix.store(BUF_IO_NONE, std::memory_order_relaxed);
1516 /* This is only needed because places which call init_io_fix() do not call
1517 buf_page_t's constructor */
1519 }
1520
1521 /** This is called only when having full ownership of the page object and no
1522 other thread can reach it. This currently happens during buf_page_init_low()
1523 under buf_page_get_mutex(this), on a previously initialized page for reuse,
1524 yet should be treated as initialization of the field, not a state transition.
1525 Please use set_io_fix(BUF_IO_NONE) to change state in a regular situation. */
1527 ut_ad(io_fix.load(std::memory_order_relaxed) == BUF_IO_NONE);
1529 io_fix.store(BUF_IO_NONE, std::memory_order_relaxed);
1530 }
1531
1532 /** Sets io_fix to specified value.
1533 Assumes the caller holds buf_page_get_mutex(this).
1534 Might require additional latches depending on particular state transition.
1535 Calls take_io_responsibility() or release_io_responsibility() as needed.
1536 @see Buf_io_fix_latching_rules for specific rules. */
1538
1539 /** Retrieves the current value of io_fix.
1540 Assumes the caller holds buf_page_get_mutex(this).
1541 @return the current value of io_fix */
1544 return get_io_fix_snapshot();
1545 }
1546
1547 /** Checks if the current value of io_fix is BUF_IO_WRITE.
1548 Assumes the caller holds buf_page_get_mutex(this) or some other latches which
1549 prevent state transition from/to BUF_IO_WRITE.
1550 @see Buf_io_fix_latching_rules for specific rules.
1551 @return true iff the current value of io_fix == BUF_IO_WRITE */
1552 bool is_io_fix_write() const;
1553
1554 /** Checks if the current value of io_fix is BUF_IO_READ.
1555 Assumes the caller holds buf_page_get_mutex(this) or some other latches which
1556 prevent state transition from/to BUF_IO_READ.
1557 @see Buf_io_fix_latching_rules for specific rules.
1558 @return true iff the current value of io_fix == BUF_IO_READ */
1559 bool is_io_fix_read() const;
1560
1561 /** Assuming that io_fix is either BUF_IO_READ or BUF_IO_WRITE determines
1562 which of the two it is. Additionally it assumes the caller holds
1563 buf_page_get_mutex(this) or some other latches which prevent state transition
1564 from BUF_IO_READ or from BUF_IO_WRITE to another state.
1565 @see Buf_io_fix_latching_rules for specific rules.
1566 @return true iff the current value of io_fix == BUF_IO_READ */
1568
1569 /** Checks if io_fix is BUF_IO_READ without requiring or acquiring any
1570 latches.
1571 Note that this implies calling this function twice in a row could produce
1572 different results.
1573 @return true iff io_fix equal to BUF_IO_READ was noticed*/
1575
1576 /** Checks if io_fix is BUF_IO_FIX or BUF_IO_READ or BUF_IO_WRITE without
1577 requiring or acquiring any latches.
1578 Note that this implies calling this function twice in a row could produce
1579 different results.
1580 @return true iff io_fix not equal to BUF_IO_NONE was noticed */
1581 bool was_io_fixed() const { return get_io_fix_snapshot() != BUF_IO_NONE; }
1582
1583 /** Checks if io_fix is BUF_IO_NONE without requiring or acquiring any
1584 latches.
1585 Note that this implies calling this function twice in a row could produce
1586 different results.
1587 Please, prefer this function over !was_io_fixed() to avoid the misleading
1588 interpretation as "not(Exists time such that io_fix(time))", while in fact we
1589 want and get "Exists time such that !io_fix(time)".
1590 @return true iff io_fix equal to BUF_IO_NONE was noticed */
1592
1593 /** Block state. @see buf_page_in_file */
1595
1596 /** If this block is currently being flushed to disk, this tells
1597 the flush_type. @see buf_flush_t */
1599
1600 /** Index number of the buffer pool that this block belongs to */
1602
1603 static_assert(MAX_BUFFER_POOLS <= 64,
1604 "MAX_BUFFER_POOLS > 64; redefine buf_pool_index");
1605
1606 /** @} */
1607#ifndef UNIV_HOTBACKUP
1608 /** Node used in chaining to buf_pool->page_hash or buf_pool->zip_hash */
1610#endif /* !UNIV_HOTBACKUP */
1611
1612 /** @name Page flushing fields
1613 All these are protected by buf_pool->mutex. */
1614 /** @{ */
1615
1616 /** Based on state, this is a list node, protected by the corresponding list
1617 mutex, in one of the following lists in buf_pool:
1618
1619 - BUF_BLOCK_NOT_USED: free, withdraw
1620 - BUF_BLOCK_FILE_PAGE: flush_list
1621 - BUF_BLOCK_ZIP_DIRTY: flush_list
1622 - BUF_BLOCK_ZIP_PAGE: zip_clean
1623
1624 The node pointers are protected by the corresponding list mutex.
1625
1626 The contents of the list node is undefined if !in_flush_list &&
1627 state == BUF_BLOCK_FILE_PAGE, or if state is one of
1628 BUF_BLOCK_MEMORY,
1629 BUF_BLOCK_REMOVE_HASH or
1630 BUF_BLOCK_READY_IN_USE. */
1631
1633
1634 private:
1635 /** The flush LSN, LSN when this page was written to the redo log. For
1636 non redo logged pages this is set using: buf_flush_borrow_lsn() */
1638
1639 /** log sequence number of the youngest modification to this block, zero
1640 if not modified. Protected by block mutex */
1642
1643 public:
1644 /** log sequence number of the START of the log entry written of the oldest
1645 modification to this block which has not yet been flushed on disk; zero if
1646 all modifications are on disk. Writes to this field must be covered by both
1647 block->mutex and buf_pool->flush_list_mutex. Hence reads can happen while
1648 holding any one of the two mutexes */
1649 /** @} */
1650
1651 /** @name LRU replacement algorithm fields
1652 These fields are protected by both buf_pool->LRU_list_mutex and the
1653 block mutex. */
1654 /** @{ */
1655
1656 /** node of the LRU list */
1658
1659 /** compressed page; zip.data (but not the data it points to) is
1660 protected by buf_pool->zip_mutex; state == BUF_BLOCK_ZIP_PAGE and
1661 zip.data == NULL means an active buf_pool->watch */
1663
1664#ifndef UNIV_HOTBACKUP
1665 /** Flush observer instance. */
1667
1668 /** Tablespace instance that this page belongs to. */
1670
1671 /** The value of buf_pool->freed_page_clock when this block was the last
1672 time put to the head of the LRU list; a thread is allowed to read this
1673 for heuristic purposes without holding any mutex or latch */
1675
1676 /** @} */
1677 /** Version of fil_space_t when the page was updated. It can also be viewed as
1678 the truncation number. */
1679 uint32_t m_version{};
1680
1681 /** Time of first access, or 0 if the block was never accessed in the
1682 buffer pool. Protected by block mutex */
1683 std::chrono::steady_clock::time_point access_time;
1684
1685 private:
1686 /** Double write instance ordinal value during writes. This is used
1687 by IO completion (writes) to select the double write instance.*/
1688 uint16_t m_dblwr_id{};
1689
1690 public:
1691 /** true if the block is in the old blocks in buf_pool->LRU_old */
1692 bool old;
1693
1694#ifdef UNIV_DEBUG
1695 /** This is set to true when fsp frees a page in buffer pool;
1696 protected by buf_pool->zip_mutex or buf_block_t::mutex. */
1698
1699 /** true if in buf_pool->flush_list; when buf_pool->flush_list_mutex
1700 is free, the following should hold:
1701 in_flush_list == (state == BUF_BLOCK_FILE_PAGE ||
1702 state == BUF_BLOCK_ZIP_DIRTY)
1703 Writes to this field must be covered by both buf_pool->flush_list_mutex
1704 and block->mutex. Hence reads can happen while holding any one of the
1705 two mutexes */
1707
1708 /** true if in buf_pool->free; when buf_pool->free_list_mutex is free, the
1709 following should hold: in_free_list == (state == BUF_BLOCK_NOT_USED) */
1711
1712 /** true if the page is in the LRU list; used in debugging */
1714
1715 /** true if in buf_pool->page_hash */
1717
1718 /** true if in buf_pool->zip_hash */
1720#endif /* UNIV_DEBUG */
1721
1722 /** Print page metadata in JSON format {"key":"value"}. Asserts that caller
1723 holds page mutex and page if file page
1724 @param[in,out] outs the output stream
1725 @param[in] page the page whose metadata needs to be printed
1726 @return same output stream */
1727 friend std::ostream &operator<<(std::ostream &outs, const buf_page_t &page);
1728#endif /* !UNIV_HOTBACKUP */
1729};
1730
1731/** Structure used by AHI to contain information on record prefixes to be
1732considered in hash index subsystem. It is meant for using as a single 64bit
1733atomic value, thus it needs to be aligned properly. */
1734struct alignas(alignof(uint64_t)) btr_search_prefix_info_t {
1735 /** recommended prefix: number of bytes in an incomplete field
1736 @see BTR_PAGE_MAX_REC_SIZE */
1737 uint32_t n_bytes;
1738 /** recommended prefix length for hash search: number of full fields */
1739 uint16_t n_fields;
1740 /** true or false, depending on whether the leftmost record of several records
1741 with the same prefix should be indexed in the hash index */
1743
1745 return n_bytes == other.n_bytes && n_fields == other.n_fields;
1746 }
1747
1748 bool operator==(const btr_search_prefix_info_t &other) const {
1749 return n_bytes == other.n_bytes && n_fields == other.n_fields &&
1750 left_side == other.left_side;
1751 }
1752
1753 bool operator!=(const btr_search_prefix_info_t &other) const {
1754 return !(*this == other);
1755 }
1756};
1757
1758/** The buffer control block structure */
1760 /** @name General fields */
1761 /** @{ */
1762
1763 /** page information; this must be the first field, so
1764 that buf_pool->page_hash can point to buf_page_t or buf_block_t */
1766
1767#ifndef UNIV_HOTBACKUP
1768 /** read-write lock of the buffer frame */
1770
1771#ifdef UNIV_DEBUG
1772 /** Check if the buffer block was freed.
1773 @return true if the block was freed, false otherwise. */
1774 bool was_freed() const { return page.file_page_was_freed; }
1775#endif /* UNIV_DEBUG */
1776
1777#endif /* UNIV_HOTBACKUP */
1778
1779 /** pointer to buffer frame which is of size UNIV_PAGE_SIZE, and aligned
1780 to an address divisible by UNIV_PAGE_SIZE */
1781 byte *frame;
1782
1783 /** node of the decompressed LRU list; a block is in the unzip_LRU list if
1784 page.state == BUF_BLOCK_FILE_PAGE and page.zip.data != NULL. Protected by
1785 both LRU_list_mutex and the block mutex. */
1787#ifdef UNIV_DEBUG
1788 /** true if the page is in the decompressed LRU list; used in debugging */
1790
1792#endif /* UNIV_DEBUG */
1793
1794 /** @} */
1795
1796 /** Structure that holds most AHI-related fields. */
1797 struct ahi_t {
1798 public:
1799 /** Recommended prefix info for hash search. It is atomically copied
1800 from the index's current recommendation for the prefix info and should
1801 eventually get to the block's actual prefix info used. It is used to decide
1802 when the n_hash_helps should be reset. It is modified only while having S-
1803 or X- latch on block's lock. */
1804 std::atomic<btr_search_prefix_info_t> recommended_prefix_info;
1805 /** Prefix info that was used for building hash index. It cannot be modified
1806 while there are any record entries added in the AHI. It's invariant that all
1807 records added to AHI from this block were folded using this prefix info. It
1808 may only be modified when we are holding the appropriate X-latch in
1809 btr_search_sys->parts[]->latch. Also, it happens that it is modified
1810 to not-empty value only when the block is held in private or the block's
1811 lock is S- or X-latched. This implies that the field's non-empty value may
1812 be read and use reliably when the appropriate
1813 btr_search_sys->parts[]->latch S-latch or X-latch is being held, or
1814 the block's lock is X-latched. */
1815 std::atomic<btr_search_prefix_info_t> prefix_info;
1816 static_assert(decltype(prefix_info)::is_always_lock_free);
1817
1818 /** Index for which the adaptive hash index has been created, or nullptr if
1819 the page does not exist in the index. Note that it does not guarantee that
1820 the AHI index is complete, though: there may have been hash collisions etc.
1821 It may be modified:
1822 - to nullptr if btr_search_enabled is false and block's mutex is held and
1823 block's state is BUF_BLOCK_FILE_PAGE and btr_search_enabled_mutex is
1824 owned, protecting the btr_search_enabled from being changed,
1825 - to nullptr if btr_search_enabled is false and block is held in private in
1826 BUF_BLOCK_REMOVE_HASH state in buf_LRU_free_page().
1827 - to any value under appropriate X-latch in btr_search_sys->parts[]->latch
1828 if btr_search_enabled is true (and setting btr_search_enabled to false in
1829 turn is protected by having all btr_search_sys->parts[]->latch X-latched).
1830 */
1831 std::atomic<dict_index_t *> index;
1832
1833#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
1834 /** Used in debugging. The number of pointers in the adaptive hash index
1835 pointing to this frame; Modified under appropriate X-latch in
1836 btr_search_sys->parts[]->latch. */
1837 std::atomic<uint16_t> n_pointers;
1838
1839 inline void validate() const {
1840 /* These fields are read without holding any AHI latches. Adding or
1841 removing a block from AHI requires having only an appropriate AHI part
1842 X-latched. If we have at least S-latched the correct AHI part (for which
1843 we would need at least S-latch on block for the block's index to not be
1844 changed in meantime) this check is certain. If we don't have necessary AHI
1845 latches, then:
1846 - it can't happen that the check fails while the block is removed from
1847 AHI. Both btr_search_drop_page_hash_index() and
1848 buf_pool_clear_hash_index() will first make the n_pointers be 0 and then
1849 set index to nullptr. As the index is an atomic variable, so if we
1850 synchronize with a reset to nullptr which is sequenced after the reset of
1851 n_pointers, we should see the n_pointers set to 0 here.
1852 - it can happen that the check fails while the block is added to the AHI
1853 right after we read the index is nullptr. In such case, if the n_pointers
1854 is not 0, we double check the index member. It can still be nullptr, if
1855 the block is removed after reading the n_pointers, but that should be near
1856 impossible. */
1857 ut_a(this->index.load() != nullptr || this->n_pointers.load() == 0 ||
1858 this->index.load() != nullptr);
1859 }
1860
1861 inline void assert_empty() const { ut_a(this->n_pointers.load() == 0); }
1862
1863 inline void assert_empty_on_init() const {
1864 UNIV_MEM_VALID(&this->n_pointers, sizeof(this->n_pointers));
1865 assert_empty();
1866 }
1867#else
1868 inline void validate() const {}
1869
1870 inline void assert_empty() const {}
1871
1872 inline void assert_empty_on_init() const {}
1873#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
1875
1876 /** Counter which controls how many times the current prefix recommendation
1877 would help in searches. If it is helpful enough, it will be used as the
1878 actual prefix to build hash for this block. It is modified similarly as
1879 recommended_prefix_info, that is only while having S- or X- latch on block's
1880 lock. Because it is modified concurrently, it may not have fully reliable
1881 count, but it is enough for this use case.
1882 Mind the n_hash_helps is AHI-related, and should be in the ahi_t struct above,
1883 but having it outside causes the made_dirty_with_no_latch to occupy the common
1884 8byte aligned 8byte long space, so basically it saves us 8bytes of the object
1885 that is used in high volumes. */
1886 std::atomic<uint32_t> n_hash_helps;
1887 /** true if block has been made dirty without acquiring X/SX latch as the
1888 block belongs to temporary tablespace and block is always accessed by a
1889 single thread. */
1891
1892#ifndef UNIV_HOTBACKUP
1893#ifdef UNIV_DEBUG
1894 /** @name Debug fields */
1895 /** @{ */
1896 /** In the debug version, each thread which bufferfixes the block acquires
1897 an s-latch here; so we can use the debug utilities in sync0rw */
1899 /** @} */
1900#endif /* UNIV_DEBUG */
1901#endif /* !UNIV_HOTBACKUP */
1902
1903 /** @name Optimistic search field */
1904 /** @{ */
1905
1906 /** This clock is incremented every time a pointer to a record on the page
1907 may become obsolete; this is used in the optimistic cursor positioning: if
1908 the modify clock has not changed, we know that the pointer is still valid;
1909 this field may be changed if the thread (1) owns the LRU list mutex and the
1910 page is not bufferfixed, or (2) the thread has an x-latch on the block,
1911 or (3) the block must belong to an intrinsic table */
1913
1914 /** @} */
1915
1916 /** mutex protecting this block: state (also protected by the buffer
1917 pool mutex), io_fix, buf_fix_count, and accessed; we introduce this
1918 new mutex in InnoDB-5.1 to relieve contention on the buffer pool mutex */
1920
1921 /** Get the modified clock (version) value.
1922 @param[in] single_threaded Thread can only be written to or read by a
1923 single thread
1924 @return the modified clock vlue. */
1925 uint64_t get_modify_clock(IF_DEBUG(bool single_threaded)) const noexcept {
1926#if defined(UNIV_DEBUG) && !defined(UNIV_LIBRARY) && !defined(UNIV_HOTBACKUP)
1927 /* No block latch is acquired when blocks access is guaranteed to be
1928 in single threaded mode. */
1930 ut_ad(single_threaded || rw_lock_own_flagged(&lock, mode));
1931#endif /* UNIV_DEBUG && !UNIV_LIBRARY */
1932
1933 return modify_clock;
1934 }
1935
1936 /** Get the page number and space id of the current buffer block.
1937 @return page number of the current buffer block. */
1938 const page_id_t &get_page_id() const { return page.id; }
1939
1940 /** Get the page number of the current buffer block.
1941 @return page number of the current buffer block. */
1942 page_no_t get_page_no() const { return (page.id.page_no()); }
1943
1944 /** Get the next page number of the current buffer block.
1945 @return next page number of the current buffer block. */
1948 }
1949
1950 /** Get the prev page number of the current buffer block.
1951 @return prev page number of the current buffer block. */
1954 }
1955
1956 /** Get the page type of the current buffer block.
1957 @return page type of the current buffer block. */
1960 }
1961
1962#ifndef UNIV_HOTBACKUP
1963 /** Mark the frame with jumbled page_id, while initiating i/o read
1964 (BUF_IO_READ).*/
1966 memset(frame, 0x00, page.size.logical());
1969 }
1970
1971 /** Print control block information in JSON format: {"key":"value"}
1972 @param[in,out] outs the output stream
1973 @param[in] block the control block whose information needs to be printed
1974 @return same output stream */
1975 friend std::ostream &operator<<(std::ostream &outs, const buf_block_t &block);
1976#endif /* UNIV_HOTBACKUP */
1977
1978 uint16_t get_page_level() const;
1979 bool is_leaf() const;
1980 bool is_root() const;
1981 bool is_index_page() const;
1982
1983 /** Check if this index page is empty. An index page is considered empty
1984 if the next record of an infimum record is supremum record. Presence of
1985 del-marked records will make the page non-empty.
1986 @return true if this index page is empty. */
1987 bool is_empty() const;
1988
1989 /** Get the page type of the current buffer block as string.
1990 @return page type of the current buffer block as string. */
1991 [[nodiscard]] const char *get_page_type_str() const noexcept;
1992
1993 /** Gets the compressed page descriptor corresponding to an uncompressed page
1994 if applicable.
1995 @return page descriptor or nullptr. */
1997 return page.zip.data != nullptr ? &page.zip : nullptr;
1998 }
1999
2000 /** Const version.
2001 @return page descriptor or nullptr. */
2003 return page.zip.data != nullptr ? &page.zip : nullptr;
2004 }
2005
2006 [[nodiscard]] bool is_memory() const noexcept { return page.is_memory(); }
2007};
2008
2009inline bool buf_block_t::is_root() const {
2010 return ((get_next_page_no() == FIL_NULL) && (get_prev_page_no() == FIL_NULL));
2011}
2012
2013inline bool buf_block_t::is_leaf() const { return get_page_level() == 0; }
2014
2015inline bool buf_block_t::is_index_page() const {
2016 return get_page_type() == FIL_PAGE_INDEX;
2017}
2018
2019/** Check if a buf_block_t object is in a valid state
2020@param block buffer block
2021@return true if valid */
2023 return buf_block_get_state(block) >= BUF_BLOCK_NOT_USED &&
2025}
2026
2027/** Compute the hash value for blocks in buf_pool->zip_hash. */
2028/** @{ */
2029static inline uint64_t buf_pool_hash_zip_frame(void *ptr) {
2030 return ut::hash_uint64(reinterpret_cast<uintptr_t>(ptr) >>
2032}
2033static inline uint64_t buf_pool_hash_zip(buf_block_t *b) {
2034 return buf_pool_hash_zip_frame(b->frame);
2035}
2036/** @} */
2037
2038/** A "Hazard Pointer" class used to iterate over page lists
2039inside the buffer pool. A hazard pointer is a buf_page_t pointer
2040which we intend to iterate over next and we want it remain valid
2041even after we release the buffer pool mutex. */
2043 public:
2044 /** Constructor
2045 @param buf_pool buffer pool instance
2046 @param mutex mutex that is protecting the hp. */
2047 HazardPointer(const buf_pool_t *buf_pool, const ib_mutex_t *mutex)
2048 : m_buf_pool(buf_pool) IF_DEBUG(, m_mutex(mutex)), m_hp() {}
2049
2050 /** Destructor */
2051 virtual ~HazardPointer() = default;
2052
2053 /** Get current value */
2054 buf_page_t *get() const {
2056 return (m_hp);
2057 }
2058
2059 /** Set current value
2060 @param bpage buffer block to be set as hp */
2061 void set(buf_page_t *bpage);
2062
2063 /** Checks if a bpage is the hp
2064 @param bpage buffer block to be compared
2065 @return true if it is hp */
2066 bool is_hp(const buf_page_t *bpage);
2067
2068 /** Adjust the value of hp. This happens when some
2069 other thread working on the same list attempts to
2070 remove the hp from the list. Must be implemented
2071 by the derived classes.
2072 @param bpage buffer block to be compared */
2073 virtual void adjust(const buf_page_t *bpage) = 0;
2074
2075 /** Adjust the value of hp for moving. This happens
2076 when some other thread working on the same list
2077 attempts to relocate the hp of the page.
2078 @param bpage buffer block to be compared
2079 @param dpage buffer block to be moved to */
2080 void move(const buf_page_t *bpage, buf_page_t *dpage);
2081
2082 protected:
2083 /** Disable copying */
2086
2087 /** Buffer pool instance */
2089
2090#ifdef UNIV_DEBUG
2091 /** mutex that protects access to the m_hp. */
2092 const ib_mutex_t *m_mutex;
2093#endif /* UNIV_DEBUG */
2094
2095 /** hazard pointer. */
2097};
2098
2099/** Class implementing buf_pool->flush_list hazard pointer */
2100class FlushHp : public HazardPointer {
2101 public:
2102 /** Constructor
2103 @param buf_pool buffer pool instance
2104 @param mutex mutex that is protecting the hp. */
2105 FlushHp(const buf_pool_t *buf_pool, const ib_mutex_t *mutex)
2106 : HazardPointer(buf_pool, mutex) {}
2107
2108 /** Destructor */
2109 ~FlushHp() override = default;
2110
2111 /** Adjust the value of hp. This happens when some
2112 other thread working on the same list attempts to
2113 remove the hp from the list.
2114 @param bpage buffer block to be compared */
2115 void adjust(const buf_page_t *bpage) override;
2116};
2117
2118/** Class implementing buf_pool->LRU hazard pointer */
2119class LRUHp : public HazardPointer {
2120 public:
2121 /** Constructor
2122 @param buf_pool buffer pool instance
2123 @param mutex mutex that is protecting the hp. */
2124 LRUHp(const buf_pool_t *buf_pool, const ib_mutex_t *mutex)
2125 : HazardPointer(buf_pool, mutex) {}
2126
2127 /** Destructor */
2128 ~LRUHp() override = default;
2129
2130 /** Adjust the value of hp. This happens when some
2131 other thread working on the same list attempts to
2132 remove the hp from the list.
2133 @param bpage buffer block to be compared */
2134 void adjust(const buf_page_t *bpage) override;
2135};
2136
2137/** Special purpose iterators to be used when scanning the LRU list.
2138The idea is that when one thread finishes the scan it leaves the
2139itr in that position and the other thread can start scan from
2140there */
2141class LRUItr : public LRUHp {
2142 public:
2143 /** Constructor
2144 @param buf_pool buffer pool instance
2145 @param mutex mutex that is protecting the hp. */
2146 LRUItr(const buf_pool_t *buf_pool, const ib_mutex_t *mutex)
2147 : LRUHp(buf_pool, mutex) {}
2148
2149 /** Destructor */
2150 ~LRUItr() override = default;
2151
2152 /** Selects from where to start a scan. If we have scanned
2153 too deep into the LRU list it resets the value to the tail
2154 of the LRU list.
2155 @return buf_page_t from where to start scan. */
2156 buf_page_t *start();
2157};
2158
2159/** Struct that is embedded in the free zip blocks */
2161 union {
2162 ulint size; /*!< size of the block */
2164 /*!< stamp[FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID]
2165 == BUF_BUDDY_FREE_STAMP denotes a free
2166 block. If the space_id field of buddy
2167 block != BUF_BUDDY_FREE_STAMP, the block
2168 is not in any zip_free list. If the
2169 space_id is BUF_BUDDY_FREE_STAMP then
2170 stamp[0] will contain the
2171 buddy block size. */
2173
2174 buf_page_t bpage; /*!< Embedded bpage descriptor */
2176 /*!< Node of zip_free list */
2177};
2178
2179/** @brief The buffer pool statistics structure. */
2182
2183 /** Number of page gets performed; also successful searches through the
2184 adaptive hash index are counted as page gets; this field is NOT protected
2185 by the buffer pool mutex */
2187
2188 /** Number of read operations. */
2189 std::atomic<uint64_t> n_pages_read;
2190
2191 /** Number of write operations. */
2192 std::atomic<uint64_t> n_pages_written;
2193
2194 /** number of pages created in the pool with no read. */
2195 std::atomic<uint64_t> n_pages_created;
2196
2197 /** Number of pages read in as part of random read ahead. */
2198 std::atomic<uint64_t> n_ra_pages_read_rnd;
2199
2200 /** Number of pages read in as part of read ahead. */
2201 std::atomic<uint64_t> n_ra_pages_read;
2202
2203 /** Number of read ahead pages that are evicted without being accessed.
2204 Protected by LRU_list_mutex. */
2206
2207 /** Number of pages made young, in calls to buf_LRU_make_block_young().
2208 Protected by LRU_list_mutex. */
2210
2211 /** Number of pages not made young because the first access was not long
2212 enough ago, in buf_page_peek_if_too_old(). Not protected. */
2214
2215 /** LRU size in bytes. Protected by LRU_list_mutex. */
2216 uint64_t LRU_bytes;
2217
2218 /** Flush_list size in bytes. Protected by flush_list_mutex */
2220
2221 static void copy(buf_pool_stat_t &dst, const buf_pool_stat_t &src) noexcept {
2222 Counter::copy(dst.m_n_page_gets, src.m_n_page_gets);
2223
2224 dst.n_pages_read.store(src.n_pages_read.load());
2225
2226 dst.n_pages_written.store(src.n_pages_written.load());
2227
2228 dst.n_pages_created.store(src.n_pages_created.load());
2229
2230 dst.n_ra_pages_read_rnd.store(src.n_ra_pages_read_rnd.load());
2231
2232 dst.n_ra_pages_read.store(src.n_ra_pages_read.load());
2233
2234 dst.n_ra_pages_evicted = src.n_ra_pages_evicted;
2235
2236 dst.n_pages_made_young = src.n_pages_made_young;
2237
2238 dst.n_pages_not_made_young = src.n_pages_not_made_young;
2239
2240 dst.LRU_bytes = src.LRU_bytes;
2241
2242 dst.flush_list_bytes = src.flush_list_bytes;
2243 }
2244
2245 void reset() {
2247
2248 n_pages_read = 0;
2249 n_pages_written = 0;
2250 n_pages_created = 0;
2252 n_ra_pages_read = 0;
2256 LRU_bytes = 0;
2257 flush_list_bytes = 0;
2258 }
2259};
2260
2261/** Statistics of buddy blocks of a given size. */
2263 /** Number of blocks allocated from the buddy system. */
2264 std::atomic<ulint> used;
2265 /** Number of blocks relocated by the buddy system.
2266 Protected by buf_pool zip_free_mutex. */
2267 uint64_t relocated;
2268 /** Total duration of block relocations.
2269 Protected by buf_pool zip_free_mutex. */
2270 std::chrono::steady_clock::duration relocated_duration;
2271
2272 struct snapshot_t {
2274 uint64_t relocated;
2275 std::chrono::steady_clock::duration relocated_duration;
2276 };
2277
2279 return {used.load(), relocated, relocated_duration};
2280 }
2281};
2282
2283/** @brief The buffer pool structure.
2284
2285NOTE! The definition appears here only for other modules of this
2286directory (buf) to see it. Do not use from outside! */
2287
2289 /** @name General fields */
2290 /** @{ */
2291 /** protects (de)allocation of chunks:
2292 - changes to chunks, n_chunks are performed while holding this latch,
2293 - reading buf_pool_should_madvise requires holding this latch for any
2294 buf_pool_t
2295 - writing to buf_pool_should_madvise requires holding these latches
2296 for all buf_pool_t-s */
2298
2299 /** LRU list mutex */
2301
2302 /** free and withdraw list mutex */
2304
2305 /** buddy allocator mutex */
2307
2308 /** zip_hash mutex */
2310
2311 /** Flush state protection mutex */
2313
2314 /** Zip mutex of this buffer pool instance, protects compressed only pages (of
2315 type buf_page_t, not buf_block_t */
2317
2318 /** Array index of this buffer pool instance */
2320
2321 /** Current pool size in bytes */
2323
2324 /** Reserve this much of the buffer pool for "old" blocks */
2326#ifdef UNIV_DEBUG
2327 /** Number of frames allocated from the buffer pool to the buddy system.
2328 Protected by zip_hash_mutex. */
2330#endif
2331
2332 /** Number of buffer pool chunks */
2333 volatile ulint n_chunks;
2334
2335 /** New number of buffer pool chunks */
2337
2338 /** buffer pool chunks */
2340
2341 /** old buffer pool chunks to be freed after resizing buffer pool */
2343
2344 /** Current pool size in pages */
2346
2347 /** Previous pool size in pages */
2349
2350 /** Size in pages of the area which the read-ahead algorithms read
2351 if invoked */
2353
2354 /** Hash table of buf_page_t or buf_block_t file pages, buf_page_in_file() ==
2355 true, indexed by (space_id, offset). page_hash is protected by an array of
2356 mutexes. */
2358
2359 /** Hash table of buf_block_t blocks whose frames are allocated to the zip
2360 buddy system, indexed by block->frame */
2362
2363 /** Number of pending read operations. Accessed atomically */
2364 std::atomic<ulint> n_pend_reads;
2365
2366 /** number of pending decompressions. Accessed atomically. */
2367 std::atomic<ulint> n_pend_unzip;
2368
2369 /** when buf_print_io was last time called. Accesses not protected. */
2370 std::chrono::steady_clock::time_point last_printout_time;
2371
2372 /** Statistics of buddy system, indexed by block size. Protected by zip_free
2373 mutex, except for the used field, which is also accessed atomically */
2375
2376 /** Current statistics */
2378
2379 /** Old statistics */
2381
2382 /** @} */
2383
2384 /** @name Page flushing algorithm fields */
2385
2386 /** @{ */
2387
2388 /** Mutex protecting the flush list access. This mutex protects flush_list and
2389 bpage::list pointers when the bpage is on flush_list. It also protects writes
2390 to bpage::oldest_modification and flush_list_hp */
2392
2393 /** "Hazard pointer" used during scan of flush_list while doing flush list
2394 batch. Protected by flush_list_mutex */
2396
2397 /** Entry pointer to scan the oldest page except for system temporary */
2399
2400 /** Base node of the modified block list */
2402
2403 /** This is true when a flush of the given type is being initialized.
2404 Protected by flush_state_mutex. */
2406
2407 /** This is the number of pending writes in the given flush type. Protected
2408 by flush_state_mutex. */
2409 std::array<size_t, BUF_FLUSH_N_TYPES> n_flush;
2410
2411 /** This is in the set state when there is no flush batch of the given type
2412 running. Protected by flush_state_mutex. */
2414
2415 /** A sequence number used to count the number of buffer blocks removed from
2416 the end of the LRU list; NOTE that this counter may wrap around at 4
2417 billion! A thread is allowed to read this for heuristic purposes without
2418 holding any mutex or latch. For non-heuristic purposes protected by
2419 LRU_list_mutex */
2421
2422 /** Set to false when an LRU scan for free block fails. This flag is used to
2423 avoid repeated scans of LRU list when we know that there is no free block
2424 available in the scan depth for eviction. Set to true whenever we flush a
2425 batch from the buffer pool. Accessed protected by memory barriers. */
2427
2428 /** Page Tracking start LSN. */
2430
2431 /** Check if the page modifications are tracked.
2432 @return true if page modifications are tracked, false otherwise. */
2433 bool is_tracking() { return track_page_lsn != LSN_MAX; }
2434
2435 /** Maximum LSN for which write io has already started. */
2437
2438 /** @} */
2439
2440 /** @name LRU replacement algorithm fields */
2441 /** @{ */
2442
2443 /** Base node of the free block list */
2445
2446 /** base node of the withdraw block list. It is only used during shrinking
2447 buffer pool size, not to reuse the blocks will be removed. Protected by
2448 free_list_mutex */
2450
2451 /** Target length of withdraw block list, when withdrawing */
2453
2454 /** "hazard pointer" used during scan of LRU while doing
2455 LRU list batch. Protected by buf_pool::LRU_list_mutex */
2457
2458 /** Iterator used to scan the LRU list when searching for
2459 replaceable victim. Protected by buf_pool::LRU_list_mutex. */
2461
2462 /** Iterator used to scan the LRU list when searching for
2463 single page flushing victim. Protected by buf_pool::LRU_list_mutex. */
2465
2466 /** Base node of the LRU list */
2468
2469 /** Pointer to the about LRU_old_ratio/BUF_LRU_OLD_RATIO_DIV oldest blocks in
2470 the LRU list; NULL if LRU length less than BUF_LRU_OLD_MIN_LEN; NOTE: when
2471 LRU_old != NULL, its length should always equal LRU_old_len */
2473
2474 /** Length of the LRU list from the block to which LRU_old points onward,
2475 including that block; see buf0lru.cc for the restrictions on this value; 0
2476 if LRU_old == NULL; NOTE: LRU_old_len must be adjusted whenever LRU_old
2477 shrinks or grows! */
2479
2480 /** Base node of the unzip_LRU list. The list is protected by the
2481 LRU_list_mutex. */
2482 UT_LIST_BASE_NODE_T(buf_block_t, unzip_LRU) unzip_LRU;
2483
2484 /** @} */
2485 /** @name Buddy allocator fields
2486 The buddy allocator is used for allocating compressed page
2487 frames and buf_page_t descriptors of blocks that exist
2488 in the buffer pool only in compressed form. */
2489 /** @{ */
2490#if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
2491 /** Unmodified compressed pages */
2493#endif /* UNIV_DEBUG || UNIV_BUF_DEBUG */
2494
2495 /** Buddy free lists */
2497
2498 /** Sentinel records for buffer pool watches. Scanning the array is protected
2499 by taking all page_hash latches in X. Updating or reading an individual
2500 watch page is protected by a corresponding individual page_hash latch. */
2502
2503 /** A wrapper for buf_pool_t::allocator.alocate_large which also advices the
2504 OS that this chunk should not be dumped to a core file if that was requested.
2505 Emits a warning to the log and disables @@global.core_file if advising was
2506 requested but could not be performed, but still return true as the allocation
2507 itself succeeded.
2508 @param[in] mem_size number of bytes to allocate
2509 @param[in,out] chunk mem and mem_pfx fields of this chunk will be updated
2510 to contain information about allocated memory region
2511 @return true iff allocated successfully */
2512 bool allocate_chunk(ulonglong mem_size, buf_chunk_t *chunk);
2513
2514 /** A wrapper for buf_pool_t::allocator.deallocate_large which also advices
2515 the OS that this chunk can be dumped to a core file.
2516 Emits a warning to the log and disables @@global.core_file if advising was
2517 requested but could not be performed.
2518 @param[in] chunk mem and mem_pfx fields of this chunk will be used to
2519 locate the memory region to free */
2520 void deallocate_chunk(buf_chunk_t *chunk);
2521
2522 /** Advices the OS that all chunks in this buffer pool instance can be dumped
2523 to a core file.
2524 Emits a warning to the log if could not succeed.
2525 @return true iff succeeded, false if no OS support or failed */
2526 bool madvise_dump();
2527
2528 /** Advices the OS that all chunks in this buffer pool instance should not
2529 be dumped to a core file.
2530 Emits a warning to the log if could not succeed.
2531 @return true iff succeeded, false if no OS support or failed */
2532 bool madvise_dont_dump();
2533
2534 /** Checks if the batch is running, which is basically equivalent to
2535 !os_event_is_set(no_flush[type]) if you hold flush_state_mutex.
2536 It is used as source of truth to know when to set or reset this event.
2537 Caller should hold flush_state_mutex.
2538 @param[in] flush_type The type of the flush we are interested in
2539 @return Should no_flush[type] be in the "unset" state? */
2542 return init_flush[flush_type] || 0 < n_flush[flush_type];
2543 }
2544
2545#ifndef UNIV_HOTBACKUP
2546 /** Executes change() which modifies fields protected by flush_state_mutex.
2547 If it caused a change to is_flushing(flush_type) then it sets or resets the
2548 no_flush[flush_type] to keep it in sync.
2549 @param[in] flush_type The type of the flush this change of state concerns
2550 @param[in] change A callback to execute within flush_state_mutex
2551 */
2552 template <typename F>
2555 const bool was_set = !is_flushing(flush_type);
2557 std::forward<F>(change)();
2558 const bool should_be_set = !is_flushing(flush_type);
2559 if (was_set && !should_be_set) {
2561 } else if (!was_set && should_be_set) {
2563 }
2564 ut_ad(should_be_set == os_event_is_set(no_flush[flush_type]));
2566 }
2567#endif /*! UNIV_HOTBACKUP */
2568
2569 static_assert(BUF_BUDDY_LOW <= UNIV_ZIP_SIZE_MIN,
2570 "BUF_BUDDY_LOW > UNIV_ZIP_SIZE_MIN");
2571 /** @} */
2572};
2573
2574/** Print the given buf_pool_t object.
2575@param[in,out] out the output stream
2576@param[in] buf_pool the buf_pool_t object to be printed
2577@return the output stream */
2578std::ostream &operator<<(std::ostream &out, const buf_pool_t &buf_pool);
2579
2580/** @name Accessors for buffer pool mutexes
2581Use these instead of accessing buffer pool mutexes directly. */
2582/** @{ */
2583
2584#ifndef UNIV_HOTBACKUP
2585/** Test if flush list mutex is owned. */
2586#define buf_flush_list_mutex_own(b) mutex_own(&(b)->flush_list_mutex)
2587
2588/** Acquire the flush list mutex. */
2589#define buf_flush_list_mutex_enter(b) \
2590 do { \
2591 mutex_enter(&(b)->flush_list_mutex); \
2592 } while (0)
2593/** Release the flush list mutex. */
2594#define buf_flush_list_mutex_exit(b) \
2595 do { \
2596 mutex_exit(&(b)->flush_list_mutex); \
2597 } while (0)
2598/** Acquire the block->mutex. */
2599#define buf_page_mutex_enter(b) \
2600 do { \
2601 mutex_enter(&(b)->mutex); \
2602 } while (0)
2603
2604/** Release the block->mutex. */
2605#define buf_page_mutex_exit(b) \
2606 do { \
2607 (b)->mutex.exit(); \
2608 } while (0)
2609
2610/** Get appropriate page_hash_lock. */
2612 const page_id_t page_id) {
2613 return hash_get_lock(buf_pool->page_hash, page_id.hash());
2614}
2615
2616/** If not appropriate page_hash_lock, relock until appropriate. */
2618 const buf_pool_t *buf_pool,
2619 const page_id_t page_id) {
2620 return hash_lock_s_confirm(hash_lock, buf_pool->page_hash, page_id.hash());
2621}
2622
2624 buf_pool_t *buf_pool,
2625 const page_id_t &page_id) {
2626 return hash_lock_x_confirm(hash_lock, buf_pool->page_hash, page_id.hash());
2627}
2628#endif /* !UNIV_HOTBACKUP */
2629
2630#if defined(UNIV_DEBUG) && !defined(UNIV_HOTBACKUP)
2631/** Test if page_hash lock is held in s-mode. */
2633 const buf_page_t *bpage) {
2634 return rw_lock_own(buf_page_hash_lock_get(buf_pool, bpage->id), RW_LOCK_S);
2635}
2636
2637/** Test if page_hash lock is held in x-mode. */
2639 const buf_page_t *bpage) {
2640 return rw_lock_own(buf_page_hash_lock_get((buf_pool), (bpage)->id),
2641 RW_LOCK_X);
2642}
2643
2644/** Test if page_hash lock is held in x or s-mode. */
2645inline bool buf_page_hash_lock_held_s_or_x(const buf_pool_t *buf_pool,
2646 const buf_page_t *bpage) {
2647 return buf_page_hash_lock_held_s(buf_pool, bpage) ||
2648 buf_page_hash_lock_held_x(buf_pool, bpage);
2649}
2650
2651inline bool buf_block_hash_lock_held_s(const buf_pool_t *buf_pool,
2652 const buf_block_t *block) {
2653 return buf_page_hash_lock_held_s(buf_pool, &block->page);
2654}
2655
2656inline bool buf_block_hash_lock_held_x(const buf_pool_t *buf_pool,
2657 const buf_block_t *block) {
2658 return buf_page_hash_lock_held_x(buf_pool, &block->page);
2659}
2660
2662 const buf_block_t *block) {
2663 return buf_page_hash_lock_held_s_or_x(buf_pool, &block->page);
2664}
2665#else /* UNIV_DEBUG && !UNIV_HOTBACKUP */
2666#define buf_page_hash_lock_held_s(b, p) (true)
2667#define buf_page_hash_lock_held_x(b, p) (true)
2668#define buf_page_hash_lock_held_s_or_x(b, p) (true)
2669#define buf_block_hash_lock_held_s(b, p) (true)
2670#define buf_block_hash_lock_held_x(b, p) (true)
2671#define buf_block_hash_lock_held_s_or_x(b, p) (true)
2672#endif /* UNIV_DEBUG && !UNIV_HOTBACKUP */
2673
2674/** @} */
2675
2676/**********************************************************************
2677Let us list the consistency conditions for different control block states.
2678
2679NOT_USED: is in free list, not in LRU list, not in flush list, nor
2680 page hash table
2681READY_FOR_USE: is not in free list, LRU list, or flush list, nor page
2682 hash table
2683MEMORY: is not in free list, LRU list, or flush list, nor page
2684 hash table
2685FILE_PAGE: space and offset are defined, is in page hash table
2686 if io_fix == BUF_IO_WRITE,
2687 pool: no_flush[flush_type] is in reset state,
2688 pool: n_flush[flush_type] > 0
2689
2690 (1) if buf_fix_count == 0, then
2691 is in LRU list, not in free list
2692 is in flush list,
2693 if and only if oldest_modification > 0
2694 is x-locked,
2695 if and only if io_fix == BUF_IO_READ
2696 is s-locked,
2697 if and only if io_fix == BUF_IO_WRITE
2698
2699 (2) if buf_fix_count > 0, then
2700 is not in LRU list, not in free list
2701 is in flush list,
2702 if and only if oldest_modification > 0
2703 if io_fix == BUF_IO_READ,
2704 is x-locked
2705 if io_fix == BUF_IO_WRITE,
2706 is s-locked
2707
2708State transitions:
2709
2710NOT_USED => READY_FOR_USE
2711READY_FOR_USE => MEMORY
2712READY_FOR_USE => FILE_PAGE
2713MEMORY => NOT_USED
2714FILE_PAGE => NOT_USED NOTE: This transition is allowed if and only if
2715 (1) buf_fix_count == 0,
2716 (2) oldest_modification == 0, and
2717 (3) io_fix == 0.
2718*/
2719
2720#if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
2721#ifndef UNIV_HOTBACKUP
2722/** Functor to validate the LRU list. */
2724 void operator()(const buf_page_t *elem) const { ut_a(elem->in_LRU_list); }
2725
2726 static void validate(const buf_pool_t *buf_pool) {
2727 CheckInLRUList check;
2728 ut_list_validate(buf_pool->LRU, check);
2729 }
2730};
2731
2732/** Functor to validate the LRU list. */
2734 void operator()(const buf_page_t *elem) const { ut_a(elem->in_free_list); }
2735
2736 static void validate(const buf_pool_t *buf_pool) {
2737 CheckInFreeList check;
2738 ut_list_validate(buf_pool->free, check);
2739 }
2740};
2741
2743 void operator()(const buf_block_t *elem) const {
2744 ut_a(elem->page.in_LRU_list);
2745 ut_a(elem->in_unzip_LRU_list);
2746 }
2747
2748 static void validate(const buf_pool_t *buf_pool) {
2750 ut_list_validate(buf_pool->unzip_LRU, check);
2751 }
2752};
2753#endif /* !UNIV_HOTBACKUP */
2754#endif /* UNIV_DEBUG || defined UNIV_BUF_DEBUG */
2755
2756#ifndef UNIV_HOTBACKUP
2757/** Prepare a page before adding to the free list.
2758@param[in,out] bpage Buffer page to prepare for freeing. */
2759inline void buf_page_prepare_for_free(buf_page_t *bpage) noexcept {
2760 bpage->reset_page_id();
2761}
2762#endif /* !UNIV_HOTBACKUP */
2763
2764/** Gets the compressed page descriptor corresponding to an uncompressed
2765page if applicable.
2766@param[in] block Get the zip descriptor for this block. */
2768 return block->get_page_zip();
2769}
2770
2771/** Gets the compressed page descriptor corresponding to an uncompressed
2772page if applicable. Const version.
2773@param[in] block Get the zip descriptor for this block.
2774@return page descriptor or nullptr. */
2776 const buf_block_t *block) noexcept {
2777 return block->get_page_zip();
2778}
2779
2780inline bool buf_page_in_memory(const buf_page_t *bpage) {
2781 switch (buf_page_get_state(bpage)) {
2782 case BUF_BLOCK_MEMORY:
2783 return true;
2784 default:
2785 break;
2786 }
2787 return false;
2788}
2789
2790/** Verify the page contained by the block. If there is page type
2791mismatch then reset it to expected page type. Data files created
2792before MySQL 5.7 GA may contain garbage in the FIL_PAGE_TYPE field.
2793@param[in,out] block block that may possibly have invalid
2794 FIL_PAGE_TYPE
2795@param[in] type Expected page type
2796@param[in,out] mtr Mini-transaction */
2799 mtr_t &mtr) {
2800 byte *page = block.frame;
2801 page_type_t page_type = fil_page_get_type(page);
2802 if (page_type != type) {
2803 const page_id_t &page_id = block.page.id;
2804 fil_page_reset_type(page_id, page, type, &mtr);
2805 }
2806}
2807
2808#include "buf0buf.ic"
2809
2810#endif /* !buf0buf_h */
uint32_t space_id_t
Tablespace identifier.
Definition: api0api.h:49
uint32_t page_no_t
Page number.
Definition: api0api.h:47
Cache_hint
Definition: buf0buf.h:93
@ MAKE_YOUNG
Move the block to the start of the LRU list if there is a danger that the block would drift out of th...
@ KEEP_OLD
Preserve the current LRU position of the block.
static void buf_block_dbg_add_level(buf_block_t *block, latch_level_t level)
Adds latch level info for the rw-lock protecting the buffer frame.
bool buf_block_hash_lock_held_x(const buf_pool_t *buf_pool, const buf_block_t *block)
Definition: buf0buf.h:2656
static buf_block_t * buf_page_get_block(buf_page_t *bpage)
Gets the buf_block_t handle of a buffered file block if an uncompressed page frame exists,...
static bool buf_page_belongs_to_unzip_LRU(const buf_page_t *bpage)
Determines if a block should be on unzip_LRU list.
static bool buf_page_can_relocate(const buf_page_t *bpage)
Determine if a buffer block can be relocated in memory.
buf_page_t * buf_page_get_zip(const page_id_t &page_id, const page_size_t &page_size)
Get read access to a compressed page (usually of type FIL_PAGE_TYPE_ZBLOB or FIL_PAGE_TYPE_ZBLOB2).
Definition: buf0buf.cc:3332
dberr_t buf_pool_init(ulint total_size, ulint n_instances)
Creates the buffer pool.
Definition: buf0buf.cc:1504
void buf_page_print(const byte *read_buf, const page_size_t &page_size, ulint flags)
Prints a page to stderr.
Definition: buf0buf.cc:606
ulint buf_get_n_pending_read_ios(void)
Returns the number of pending buf pool read ios.
Definition: buf0buf.cc:6505
bool buf_page_hash_lock_held_s_or_x(const buf_pool_t *buf_pool, const buf_page_t *bpage)
Test if page_hash lock is held in x or s-mode.
Definition: buf0buf.h:2645
static ulint buf_pool_get_curr_size(void)
Gets the current size of buffer buf_pool in bytes.
ulint buf_page_hash_lock_held_x(const buf_pool_t *buf_pool, const buf_page_t *bpage)
Test if page_hash lock is held in x-mode.
Definition: buf0buf.h:2638
void buf_page_force_evict(const page_id_t &page_id, const page_size_t &page_size, const bool dirty_is_ok=true) noexcept
Evict a page from the buffer pool.
Definition: buf0buf.cc:5462
bool buf_validate(void)
Validates the buffer pool data structure.
Definition: buf0buf.cc:6291
void buf_flush_update_zip_checksum(buf_frame_t *page, ulint size, lsn_t lsn, bool skip_lsn_check)
Calculate the checksum of a page from compressed table and update the page.
Definition: buf0flu.cc:715
static enum buf_page_state buf_block_get_state(const buf_block_t *block)
Gets the state of a block.
static void buf_page_set_state(buf_page_t *bpage, enum buf_page_state state)
Sets the state of a block.
buf_block_t * buf_block_from_ahi(const byte *ptr)
Get a buffer block from an adaptive hash index pointer.
Definition: buf0buf.cc:3551
lsn_t buf_pool_get_oldest_modification_lwm(void)
Gets a safe low watermark for oldest_modification.
Definition: buf0buf.cc:489
dberr_t buf_page_io_complete(buf_page_t *bpage, bool evict)
Completes an asynchronous read or write request of a file page to or from the buffer pool.
Definition: buf0buf.cc:5759
bool buf_frame_will_withdrawn(buf_pool_t *buf_pool, const byte *ptr)
Determines if a frame is intended to be withdrawn.
Definition: buf0buf.cc:1882
void buf_pool_update_madvise()
Checks if innobase_should_madvise_buf_pool() value has changed since we've last check and if so,...
Definition: buf0buf.cc:1011
ulonglong buf_pool_adjust_chunk_unit(ulonglong size)
Adjust the proposed chunk unit size so that it satisfies all invariants.
Definition: buf0buf.cc:2151
static buf_page_t * buf_page_hash_get_locked(buf_pool_t *buf_pool, const page_id_t &page_id, rw_lock_t **lock, ulint lock_mode, bool watch=false)
Returns the control block of a file page, NULL if not found.
static enum buf_io_fix buf_page_get_io_fix(const buf_page_t *bpage)
Gets the io_fix state of a block.
static void buf_page_set_io_fix(buf_page_t *bpage, enum buf_io_fix io_fix)
Sets the io_fix state of a block.
buf_page_t * buf_page_set_file_page_was_freed(const page_id_t &page_id)
Sets file_page_was_freed true if the page is found in the buffer pool.
Definition: buf0buf.cc:3245
static void buf_page_set_accessed(buf_page_t *bpage)
Flag a block accessed.
static void buf_block_set_io_fix(buf_block_t *block, enum buf_io_fix io_fix)
Sets the io_fix state of a block.
void buf_page_make_young(buf_page_t *bpage)
Moves a page to the start of the buffer pool LRU list.
Definition: buf0buf.cc:3180
buf_pool_t * buf_pool_ptr
The buffer pools of the database.
Definition: buf0buf.cc:307
void buf_pool_clear_hash_index(void)
Clears the adaptive hash index on all pages in the buffer pool.
Definition: buf0buf.cc:2718
void buf_get_total_stat(buf_pool_stat_t *tot_stat)
Get total buffer pool statistics.
Definition: buf0buf.cc:551
static buf_pool_t * buf_pool_from_bpage(const buf_page_t *bpage)
Returns the buffer pool instance given a page instance.
static buf_flush_t buf_page_get_flush_type(const buf_page_t *bpage)
Get the flush type of a page.
static ulint buf_page_get_freed_page_clock(const buf_page_t *bpage)
Reads the freed_page_clock of a buffer block.
ulint buf_page_hash_lock_held_s(const buf_pool_t *buf_pool, const buf_page_t *bpage)
Test if page_hash lock is held in s-mode.
Definition: buf0buf.h:2632
static std::chrono::steady_clock::time_point buf_page_is_accessed(const buf_page_t *bpage)
Determine the time of first access of a block in the buffer pool.
constexpr ulint MAX_PAGE_HASH_LOCKS
The maximum number of page_hash locks.
Definition: buf0buf.h:114
bool buf_page_was_freed(const page_id_t &page_id) noexcept
Checks whether a page is present in the buffer pool and marked as freed.
Definition: buf0buf.cc:3220
bool buf_page_optimistic_get(ulint rw_latch, buf_block_t *block, uint64_t modify_clock, Page_fetch fetch_mode, const char *file, ulint line, mtr_t *mtr)
This is the general function used to get optimistic access to a database page.
Definition: buf0buf.cc:4540
void buf_pool_watch_unset(const page_id_t &page_id)
Stop watching if the page has been read in.
Definition: buf0buf.cc:3129
static byte * buf_frame_copy(byte *buf, const buf_frame_t *frame)
Copies contents of a buffer frame to a given buffer.
void buf_assert_all_are_replaceable()
Assert that all file pages in the buffer are in a replaceable state.
Definition: buf0buf.cc:6849
bool buf_pool_watch_occurred(const page_id_t &page_id)
Check if the page has been read in.
Definition: buf0buf.cc:3156
buf_page_t * buf_page_init_for_read(ulint mode, const page_id_t &page_id, const page_size_t &page_size, bool unzip)
Inits a page for read to the buffer buf_pool.
Definition: buf0buf.cc:4904
static bool buf_page_peek_if_young(const buf_page_t *bpage)
Tells, for heuristics, if a block is still close enough to the MRU end of the LRU list meaning that i...
bool buf_page_free_stale(buf_pool_t *buf_pool, buf_page_t *bpage) noexcept
Free a stale page.
Definition: buf0buf.cc:5429
buf_page_t * buf_page_hash_get_x_locked(buf_pool_t *b, const page_id_t &page_id, rw_lock_t **l)
Definition: buf0buf.h:1042
static void buf_page_set_old(buf_page_t *bpage, bool old)
Flag a block old.
size_t buf_pool_pending_io_reads_count()
Computes number of pending I/O read operations for the buffer pool.
Definition: buf0buf.cc:6855
size_t buf_pool_pending_io_writes_count()
Computes number of pending I/O write operations for the buffer pool.
Definition: buf0buf.cc:6863
void buf_read_page_handle_error(buf_page_t *bpage)
Unfixes the page, unlatches the page, removes it from page_hash and removes it from LRU.
Definition: buf0buf.cc:5394
static ulint buf_block_unfix(buf_page_t *bpage)
Decrements the bufferfix count.
static void buf_page_set_flush_type(buf_page_t *bpage, buf_flush_t flush_type)
Set the flush type of a page.
void buf_page_free_stale_during_write(buf_page_t *bpage, bool owns_sx_lock=false) noexcept
Free a stale page that is being written.
Definition: buf0buf.cc:5570
static buf_pool_t * buf_pool_from_block(const buf_block_t *block)
Returns the buffer pool instance given a block instance.
bool buf_is_block_in_instance(const buf_pool_t *buf_pool, const buf_block_t *ptr)
Find out if a block pointer points into one of currently used chunks of the buffer pool.
Definition: buf0buf.cc:3587
rw_lock_t * buf_page_hash_lock_get(const buf_pool_t *buf_pool, const page_id_t page_id)
Get appropriate page_hash_lock.
Definition: buf0buf.h:2611
std::ostream & operator<<(std::ostream &out, const buf_pool_t &buf_pool)
Print the given buf_pool_t object.
Definition: buf0buf.cc:6936
static BPageMutex * buf_page_get_mutex(const buf_page_t *bpage)
Gets the mutex of a block.
static uint64_t buf_pool_hash_zip_frame(void *ptr)
Compute the hash value for blocks in buf_pool->zip_hash.
Definition: buf0buf.h:2029
static buf_frame_t * buf_block_get_frame(const buf_block_t *block)
Gets a pointer to the memory frame of a block.
void buf_block_reset_page_type_on_mismatch(buf_block_t &block, page_type_t type, mtr_t &mtr)
Verify the page contained by the block.
Definition: buf0buf.h:2797
void buf_pool_free_all()
Frees the buffer pool at shutdown.
Definition: buf0buf.cc:6970
static enum buf_page_state buf_page_get_state(const buf_page_t *bpage)
Gets the state of a block.
static ulint buf_pool_index(const buf_pool_t *buf_pool)
Calculates the index of a buffer pool to the buf_pool[] array.
buf_block_t * buf_page_get_gen(const page_id_t &page_id, const page_size_t &page_size, ulint rw_latch, buf_block_t *guess, Page_fetch mode, ut::Location location, mtr_t *mtr, bool dirty_with_no_latch=false)
This is the general function used to get access to a database page.
Definition: buf0buf.cc:4473
ulint buf_get_free_list_len(void)
Gets the current length of the free list of buffer blocks.
rw_lock_t * buf_page_hash_lock_x_confirm(rw_lock_t *hash_lock, buf_pool_t *buf_pool, const page_id_t &page_id)
Definition: buf0buf.h:2623
static lsn_t buf_page_get_newest_modification(const buf_page_t *bpage)
Gets the youngest modification log sequence number for a frame.
ulint buf_get_latched_pages_number(void)
Returns the number of latched pages in the buffer pool.
Definition: buf0buf.cc:6486
static buf_page_t * buf_page_hash_get_low(buf_pool_t *buf_pool, const page_id_t &page_id)
Returns the control block of a file page, NULL if not found.
static ulint buf_block_fix(buf_page_t *bpage)
Increments the bufferfix count.
constexpr ulint MAX_BUFFER_POOLS
The maximum number of buffer pools that can be defined.
Definition: buf0buf.h:108
static buf_block_t * buf_block_hash_get_locked(buf_pool_t *buf_pool, const page_id_t &page_id, rw_lock_t **lock, ulint lock_mode)
Returns the control block of a file page, NULL if not found.
void buf_print_io(FILE *file)
Prints info of the buffer i/o.
Definition: buf0buf.cc:6782
static buf_pool_t * buf_pool_from_array(ulint index)
Returns the buffer pool instance given its array index.
static void buf_page_release_latch(buf_block_t *block, ulint rw_latch)
Releases a latch, if specified.
void buf_stats_get_pool_info(buf_pool_t *buf_pool, ulint pool_id, buf_pool_info_t *all_pool_info)
Collect buffer pool stats information for a buffer pool.
Definition: buf0buf.cc:6589
void buf_resize_thread()
This is the thread for resizing buffer pool.
Definition: buf0buf.cc:2691
void buf_print(void)
Prints info of the buffer pool data structure.
Definition: buf0buf.cc:6392
const buf_block_t * buf_page_try_get(const page_id_t &page_id, ut::Location location, mtr_t *mtr)
Given a tablespace id and page number tries to get that page.
Definition: buf0buf.cc:4733
static ulint buf_block_get_freed_page_clock(const buf_block_t *block)
Reads the freed_page_clock of a buffer block.
static void buf_ptr_get_fsp_addr(const void *ptr, space_id_t *space, fil_addr_t *addr)
Gets the space id, page offset, and byte offset within page of a pointer pointing to a buffer frame c...
static bool buf_page_peek_if_too_old(const buf_page_t *bpage)
Recommends a move of a block to the start of the LRU list if there is danger of dropping from the buf...
bool buf_block_will_withdrawn(buf_pool_t *buf_pool, const buf_block_t *block)
Determines if a block is intended to be withdrawn.
Definition: buf0buf.cc:1861
void buf_page_make_old(buf_page_t *bpage)
Moved a page to the end of the buffer pool LRU list so that it can be flushed out at the earliest.
Definition: buf0buf.cc:3192
lsn_t buf_pool_get_oldest_modification_approx(void)
Gets the smallest oldest_modification lsn among all of the earliest added pages in flush lists.
Definition: buf0buf.cc:436
buf_block_t * buf_block_hash_get_s_locked(buf_pool_t *b, const page_id_t &page_id, rw_lock_t **l)
Definition: buf0buf.h:1055
Page_fetch
Definition: buf0buf.h:57
@ NO_LATCH
get and bufferfix, but set no latch; we have separated this case, because it is error-prone programmi...
@ NORMAL
Get always.
@ IF_IN_POOL
get if in pool
@ POSSIBLY_FREED_NO_READ_AHEAD
Like Page_fetch::POSSIBLY_FREED, but do not initiate read ahead.
@ IF_IN_POOL_OR_WATCH
Get the page only if it's in the buffer pool, if not then set a watch on the page.
@ PEEK_IF_IN_POOL
get if in pool, do not make the block young in the LRU list
@ POSSIBLY_FREED
Like Page_fetch::NORMAL, but do not mind if the file page has been freed.
@ SCAN
Same as NORMAL, but hint that the fetch is part of a large scan.
rw_lock_t * buf_page_hash_lock_s_confirm(rw_lock_t *hash_lock, const buf_pool_t *buf_pool, const page_id_t page_id)
If not appropriate page_hash_lock, relock until appropriate.
Definition: buf0buf.h:2617
static void buf_page_unset_sticky(buf_page_t *bpage)
Removes stickiness of a block.
buf_page_print_flags
Definition: buf0buf.h:661
@ BUF_PAGE_PRINT_NO_FULL
Do not print the full page dump.
Definition: buf0buf.h:665
@ BUF_PAGE_PRINT_NO_CRASH
Do not crash at the end of buf_page_print().
Definition: buf0buf.h:663
buf_page_t * buf_page_get_also_watch(buf_pool_t *b, const page_id_t &page_id)
Definition: buf0buf.h:1050
bool buf_pool_watch_is_sentinel(const buf_pool_t *buf_pool, const buf_page_t *bpage)
Determine if a block is a sentinel for a buffer pool watch.
Definition: buf0buf.cc:2974
buf_block_t * buf_page_get_with_no_latch(const page_id_t &id, const page_size_t &size, ut::Location location, mtr_t *mtr)
Use these macros to bufferfix a page with no latching.
Definition: buf0buf.h:460
constexpr ulint MAX_BUFFER_POOLS_BITS
Number of bits to representing a buffer pool ID.
Definition: buf0buf.h:105
bool buf_block_hash_lock_held_s(const buf_pool_t *buf_pool, const buf_block_t *block)
Definition: buf0buf.h:2651
buf_block_t * buf_block_hash_get(buf_pool_t *b, const page_id_t &page_id)
Definition: buf0buf.h:1065
bool buf_page_in_memory(const buf_page_t *bpage)
Definition: buf0buf.h:2780
static bool buf_page_peek(const page_id_t &page_id)
Returns true if the page can be found in the buffer pool hash table.
bool buf_page_get_known_nowait(ulint rw_latch, buf_block_t *block, Cache_hint hint, const char *file, ulint line, mtr_t *mtr)
This is used to get access to a known database page, when no waiting can be done.
Definition: buf0buf.cc:4640
buf_page_t * buf_page_hash_get_s_locked(buf_pool_t *b, const page_id_t &page_id, rw_lock_t **l)
Definition: buf0buf.h:1037
static void buf_page_release_zip(buf_page_t *bpage)
Releases a compressed-only page acquired with buf_page_get_zip().
static void buf_block_free(buf_block_t *block)
Frees a buffer block which does not contain a file page.
static uint64_t buf_pool_hash_zip(buf_block_t *b)
Definition: buf0buf.h:2033
buf_page_t * buf_page_hash_get(buf_pool_t *b, const page_id_t &page_id)
Definition: buf0buf.h:1047
static void buf_block_set_state(buf_block_t *block, enum buf_page_state state)
Sets the state of a block.
constexpr uint32_t BUF_PAGE_STATE_BITS
The common buffer control block structure for compressed and uncompressed frames.
Definition: buf0buf.h:1149
static void buf_block_buf_fix_inc_func(ut::Location location, buf_block_t *block)
Increments the bufferfix count.
static buf_pool_t * buf_pool_get(const page_id_t &page_id)
Returns the buffer pool instance given a page id.
static ulint buf_get_withdraw_depth(buf_pool_t *buf_pool)
Return how many more pages must be added to the withdraw list to reach the withdraw target of the cur...
buf_page_state
States of a control block.
Definition: buf0buf.h:130
@ BUF_BLOCK_NOT_USED
Is in the free list; must be after the BUF_BLOCK_ZIP_ constants for compressed-only pages.
Definition: buf0buf.h:140
@ BUF_BLOCK_ZIP_PAGE
Contains a clean compressed page.
Definition: buf0buf.h:134
@ BUF_BLOCK_REMOVE_HASH
Hash index should be removed before putting to the free list.
Definition: buf0buf.h:152
@ BUF_BLOCK_MEMORY
Contains some main memory object.
Definition: buf0buf.h:149
@ BUF_BLOCK_ZIP_DIRTY
Contains a compressed page that is in the buf_pool->flush_list.
Definition: buf0buf.h:136
@ BUF_BLOCK_POOL_WATCH
A sentinel for the buffer pool watch, element of buf_pool->watch[].
Definition: buf0buf.h:132
@ BUF_BLOCK_READY_FOR_USE
When buf_LRU_get_free_block returns a block, it is in this state.
Definition: buf0buf.h:143
@ BUF_BLOCK_FILE_PAGE
Contains a buffered file page.
Definition: buf0buf.h:146
void buf_refresh_io_stats_all()
Refresh the statistics used to print per-second averages.
Definition: buf0buf.cc:6843
static ulint buf_pool_get_n_pages(void)
Gets the current size of buffer buf_pool in frames.
buf_block_t * buf_block_alloc(buf_pool_t *buf_pool)
Allocates a buffer block.
Definition: buf0buf.cc:577
static buf_block_t * buf_get_nth_chunk_block(const buf_pool_t *buf_pool, ulint n, ulint *chunk_size)
Get the nth chunk's buffer block in the specified buffer pool.
static ulint buf_pool_size_align(ulint size)
Calculate aligned buffer pool size based on srv_buf_pool_chunk_unit, if needed.
buf_block_t * buf_page_get(const page_id_t &id, const page_size_t &size, ulint latch, ut::Location location, mtr_t *mtr)
NOTE! The following macros should be used instead of buf_page_get_gen, to improve debugging.
Definition: buf0buf.h:449
static void buf_block_modify_clock_inc(buf_block_t *block)
Increment the modify clock.
static bool buf_page_in_file(const buf_page_t *bpage)
Determines if a block is mapped to a tablespace.
page_zip_des_t * buf_block_get_page_zip(buf_block_t *block) noexcept
Gets the compressed page descriptor corresponding to an uncompressed page if applicable.
Definition: buf0buf.h:2767
void buf_pool_invalidate(void)
Invalidates the file pages in the buffer pool when an archive recovery is completed.
Definition: buf0buf.cc:6097
void buf_page_free_descriptor(buf_page_t *bpage)
Free a buf_page_t descriptor.
Definition: buf0buf.cc:1419
buf_block_t * buf_page_create(const page_id_t &page_id, const page_size_t &page_size, rw_lock_type_t rw_latch, mtr_t *mtr)
Initializes a page to the buffer buf_pool.
Definition: buf0buf.cc:5110
double buf_get_modified_ratio_pct(void)
Return the ratio in percents of modified pages in the buffer pool / database pages in the buffer pool...
Definition: buf0buf.cc:6519
static buf_frame_t * buf_frame_align(byte *ptr)
void buf_page_prepare_for_free(buf_page_t *bpage) noexcept
Prepare a page before adding to the free list.
Definition: buf0buf.h:2759
buf_block_t * buf_pool_contains_zip(buf_pool_t *buf_pool, const void *data)
Finds a block in the buffer pool that points to a given compressed page.
Definition: buf0buf.cc:1168
static void buf_block_set_file_page(buf_block_t *block, const page_id_t &page_id)
Map a block to a file page.
void buf_pool_wait_for_no_pending_io()
Waits until there are no pending I/O operations for the buffer pool.
Definition: buf0buf.cc:6875
static buf_page_t * buf_page_alloc_descriptor(void)
Allocates a buf_page_t descriptor.
static enum buf_io_fix buf_block_get_io_fix(const buf_block_t *block)
Gets the io_fix state of a block.
bool buf_block_hash_lock_held_s_or_x(const buf_pool_t *buf_pool, const buf_block_t *block)
Definition: buf0buf.h:2661
bool buf_block_state_valid(buf_block_t *block)
Check if a buf_block_t object is in a valid state.
Definition: buf0buf.h:2022
buf_block_t * buf_block_hash_get_x_locked(buf_pool_t *b, const page_id_t &page_id, rw_lock_t **l)
Definition: buf0buf.h:1060
const std::unordered_map< buf_page_state, std::string_view > buf_page_state_str
Definition: buf0buf.h:155
buf_page_t * buf_page_reset_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.
Definition: buf0buf.cc:3271
static bool buf_page_is_old(const buf_page_t *bpage)
Determine if a block has been flagged old.
void buf_block_buf_fix_inc(buf_block_t *b, ut::Location l)
Increments the bufferfix count.
Definition: buf0buf.h:617
static void buf_page_set_sticky(buf_page_t *bpage)
Makes a block sticky.
void buf_get_total_list_size_in_bytes(buf_pools_list_size_t *buf_pools_list_size)
Get total list size in bytes from all buffer pools.
Definition: buf0buf.cc:530
void buf_get_total_list_len(ulint *LRU_len, ulint *free_len, ulint *flush_list_len)
Get total buffer pool statistics.
Definition: buf0buf.cc:514
bool buf_zip_decompress(buf_block_t *block, bool check)
Decompress a block.
Definition: buf0buf.cc:3483
The database buffer buf_pool.
The database buffer pool global types for the directory.
byte buf_frame_t
A buffer frame.
Definition: buf0types.h:62
BPageMutex BufPoolZipMutex
Definition: buf0types.h:185
constexpr uint32_t BUF_BUDDY_LOW
Smallest buddy page size.
Definition: buf0types.h:167
constexpr uint32_t BUF_BUDDY_SIZES_MAX
Maximum number of buddy sizes based on the max page size.
Definition: buf0types.h:173
buf_flush_t
Flags for flush types.
Definition: buf0types.h:68
@ BUF_FLUSH_N_TYPES
Index of last element + 1
Definition: buf0types.h:79
ib_mutex_t BufListMutex
Definition: buf0types.h:183
ib_bpmutex_t BPageMutex
Definition: buf0types.h:182
buf_io_fix
Flags for io_fix types.
Definition: buf0types.h:83
@ BUF_IO_NONE
no pending I/O
Definition: buf0types.h:85
@ BUF_IO_WRITE
write pending
Definition: buf0types.h:91
@ BUF_IO_READ
read pending
Definition: buf0types.h:88
@ BUF_IO_PIN
disallow relocation of block and its removal from the flush_list
Definition: buf0types.h:94
The database buffer pool high-level routines.
Class implementing buf_pool->flush_list hazard pointer.
Definition: buf0buf.h:2100
~FlushHp() override=default
Destructor.
FlushHp(const buf_pool_t *buf_pool, const ib_mutex_t *mutex)
Constructor.
Definition: buf0buf.h:2105
void adjust(const buf_page_t *bpage) override
Adjust the value of hp.
Definition: buf0buf.cc:2934
We use Flush_observer to track flushing of non-redo logged pages in bulk create index(btr0load....
Definition: buf0flu.h:283
A "Hazard Pointer" class used to iterate over page lists inside the buffer pool.
Definition: buf0buf.h:2042
bool is_hp(const buf_page_t *bpage)
Checks if a bpage is the hp.
Definition: buf0buf.cc:2909
void set(buf_page_t *bpage)
Set current value.
Definition: buf0buf.cc:2896
virtual void adjust(const buf_page_t *bpage)=0
Adjust the value of hp.
const ib_mutex_t * m_mutex
mutex that protects access to the m_hp.
Definition: buf0buf.h:2092
void move(const buf_page_t *bpage, buf_page_t *dpage)
Adjust the value of hp for moving.
Definition: buf0buf.cc:2921
buf_page_t * m_hp
hazard pointer.
Definition: buf0buf.h:2096
virtual ~HazardPointer()=default
Destructor.
const buf_pool_t * m_buf_pool
Buffer pool instance.
Definition: buf0buf.h:2088
HazardPointer(const HazardPointer &)
Disable copying.
buf_page_t * get() const
Get current value.
Definition: buf0buf.h:2054
HazardPointer(const buf_pool_t *buf_pool, const ib_mutex_t *mutex)
Constructor.
Definition: buf0buf.h:2047
HazardPointer & operator=(const HazardPointer &)
Class implementing buf_pool->LRU hazard pointer.
Definition: buf0buf.h:2119
~LRUHp() override=default
Destructor.
void adjust(const buf_page_t *bpage) override
Adjust the value of hp.
Definition: buf0buf.cc:2949
LRUHp(const buf_pool_t *buf_pool, const ib_mutex_t *mutex)
Constructor.
Definition: buf0buf.h:2124
Special purpose iterators to be used when scanning the LRU list.
Definition: buf0buf.h:2141
~LRUItr() override=default
Destructor.
buf_page_t * start()
Selects from where to start a scan.
Definition: buf0buf.cc:2964
LRUItr(const buf_pool_t *buf_pool, const ib_mutex_t *mutex)
Constructor.
Definition: buf0buf.h:2146
The purpose of this class is to hide the knowledge that Buf_io_fix_latching_rules even exists from us...
Definition: buf0buf.cc:5664
Definition: buf0buf.h:1430
bool someone_is_responsible() const
Checks if there is any thread responsible for I/O on this page now.
Definition: buf0buf.h:1438
void release()
Called by the thread responsible for I/O on this page to release its responsibility.
Definition: buf0buf.h:1450
bool current_thread_is_responsible() const
Checks if the current thread is responsible for I/O on this page now.
Definition: buf0buf.h:1444
void take()
Called by the thread which becomes responsible for I/O on this page to indicate that it takes the res...
Definition: buf0buf.h:1457
std::thread::id responsible_thread
The thread responsible for I/O on this page, or an impossible value if no thread is currently respons...
Definition: buf0buf.h:1433
Definition: buf0buf.h:1159
uint32_t freed_page_clock
The value of buf_pool->freed_page_clock when this block was the last time put to the head of the LRU ...
Definition: buf0buf.h:1674
buf_page_t(const buf_page_t &other)
Copy constructor.
Definition: buf0buf.h:1163
void space_id_changed()
Updates new space reference and acquires "reference count latch" and the current version of the space...
Definition: buf0buf.h:1321
void take_io_responsibility()
Called by the thread which becomes responsible for I/O on this page to indicate that it takes the res...
Definition: buf0buf.h:1484
bool is_stale() const
Checks if this space reference saved during last page ID initialization was deleted or truncated sinc...
Definition: buf0buf.h:1238
void init_io_fix()
This is called only when having full ownership of the page object and no other thread can reach it.
Definition: buf0buf.h:1514
void set_io_fix(buf_io_fix io_fix)
Sets io_fix to specified value.
Definition: buf0buf.cc:5738
bool someone_has_io_responsibility() const
Checks if there is any thread responsible for I/O on this page now.
Definition: buf0buf.h:1468
bool has_correct_io_fix_value() const
Checks if io_fix has any of the known enum values.
Definition: buf0buf.h:1417
lsn_t get_newest_lsn() const noexcept
Definition: buf0buf.h:1354
bool current_thread_has_io_responsibility() const
Checks if the current thread is responsible for I/O on this page now.
Definition: buf0buf.h:1474
void set_newest_lsn(lsn_t lsn) noexcept
Set the latest modification LSN.
Definition: buf0buf.h:1365
buf_page_t * hash
Node used in chaining to buf_pool->page_hash or buf_pool->zip_hash.
Definition: buf0buf.h:1604
bool is_io_fix_write() const
Checks if the current value of io_fix is BUF_IO_WRITE.
Definition: buf0buf.cc:5718
Flush_observer * get_flush_observer() noexcept
Definition: buf0buf.h:1338
fil_space_t * get_space() const
Retrieve the tablespace object if one was available during page ID initialization.
Definition: buf0buf.h:1277
bool is_io_fix_read_as_opposed_to_write() const
Assuming that io_fix is either BUF_IO_READ or BUF_IO_WRITE determines which of the two it is.
Definition: buf0buf.cc:5730
space_id_t space() const noexcept
Retrieve the tablespace id.
Definition: buf0buf.h:1227
bool in_zip_hash
true if in buf_pool->zip_hash
Definition: buf0buf.h:1719
bool in_free_list
true if in buf_pool->free; when buf_pool->free_list_mutex is free, the following should hold: in_free...
Definition: buf0buf.h:1710
std::chrono::steady_clock::time_point access_time
Time of first access, or 0 if the block was never accessed in the buffer pool.
Definition: buf0buf.h:1683
Flush_observer * m_flush_observer
Flush observer instance.
Definition: buf0buf.h:1666
buf_fix_count_atomic_t buf_fix_count
Count of how many fold this block is currently bufferfixed.
Definition: buf0buf.h:1388
bool in_flush_list
true if in buf_pool->flush_list; when buf_pool->flush_list_mutex is free, the following should hold: ...
Definition: buf0buf.h:1706
void reset_page_id()
Sets stored value to invalid/empty value.
Definition: buf0buf.h:1314
bool is_dirty() const noexcept
Definition: buf0buf.h:1361
bool old
true if the block is in the old blocks in buf_pool->LRU_old
Definition: buf0buf.h:1692
bool was_io_fix_read() const
Checks if io_fix is BUF_IO_READ without requiring or acquiring any latches.
Definition: buf0buf.h:1574
void reinit_io_fix()
This is called only when having full ownership of the page object and no other thread can reach it.
Definition: buf0buf.h:1526
void reset_page_id(page_id_t new_page_id)
Sets stored page ID to the new value.
Definition: buf0buf.h:1298
void set_oldest_lsn(lsn_t lsn) noexcept
Set the LSN when the page is modified for the first time.
Definition: buf0buf.ic:746
uint16_t get_dblwr_batch_id() const
Definition: buf0buf.h:1223
bool was_stale() const
Checks if this space reference saved during last page ID initialization was deleted or truncated sinc...
Definition: buf0buf.h:1255
void set_page_id(const page_id_t page_id)
Set the stored page id to a new value.
Definition: buf0buf.h:1282
friend std::ostream & operator<<(std::ostream &outs, const buf_page_t &page)
Print page metadata in JSON format {"key":"value"}.
Definition: buf0buf.cc:7016
lsn_t newest_modification
The flush LSN, LSN when this page was written to the redo log.
Definition: buf0buf.h:1637
void release_io_responsibility()
Called by the thread responsible for I/O on this page to release its responsibility.
Definition: buf0buf.h:1480
static bool is_memory(const page_t *const ptr) noexcept
Check if the given ptr lies in a memory block of type BUF_BLOCK_MEMORY.
Definition: buf0buf.cc:6982
lsn_t get_oldest_lsn() const noexcept
Definition: buf0buf.h:1358
lsn_t oldest_modification
log sequence number of the youngest modification to this block, zero if not modified.
Definition: buf0buf.h:1641
page_id_t id
Page id.
Definition: buf0buf.h:1382
copyable_atomic_t< buf_io_fix > io_fix
Type of pending I/O operation.
Definition: buf0buf.h:1394
UT_LIST_NODE_T(buf_page_t) list
Based on state, this is a list node, protected by the corresponding list mutex, in one of the followi...
buf_io_fix get_io_fix_snapshot() const
Retrieves a value of io_fix without requiring or acquiring any latches.
Definition: buf0buf.h:1500
page_size_t size
Page size.
Definition: buf0buf.h:1385
io_responsibility_t io_responsibility
Tracks which thread is responsible for I/O on this page.
Definition: buf0buf.h:1463
uint8_t buf_pool_index
Index number of the buffer pool that this block belongs to.
Definition: buf0buf.h:1601
uint16_t m_dblwr_id
Double write instance ordinal value during writes.
Definition: buf0buf.h:1688
bool was_io_fix_none() const
Checks if io_fix is BUF_IO_NONE without requiring or acquiring any latches.
Definition: buf0buf.h:1591
void set_clean() noexcept
Set page to clean state.
Definition: buf0buf.h:1372
buf_io_fix get_io_fix() const
Retrieves the current value of io_fix.
Definition: buf0buf.h:1542
bool is_io_fix_read() const
Checks if the current value of io_fix is BUF_IO_READ.
Definition: buf0buf.cc:5724
uint32_t m_version
Version of fil_space_t when the page was updated.
Definition: buf0buf.h:1679
bool in_LRU_list
true if the page is in the LRU list; used in debugging
Definition: buf0buf.h:1713
void set_flush_observer(Flush_observer *flush_observer) noexcept
Set the flush observer for the page.
Definition: buf0buf.h:1342
buf_page_state state
Block state.
Definition: buf0buf.h:1594
page_no_t page_no() const noexcept
Retrieve the page number.
Definition: buf0buf.h:1231
fil_space_t * m_space
Tablespace instance that this page belongs to.
Definition: buf0buf.h:1669
bool was_io_fixed() const
Checks if io_fix is BUF_IO_FIX or BUF_IO_READ or BUF_IO_WRITE without requiring or acquiring any latc...
Definition: buf0buf.h:1581
void reset_flush_observer() noexcept
Remove the flush observer.
Definition: buf0buf.h:1350
void set_dblwr_batch_id(uint16_t batch_id)
Set the doublewrite buffer ID.
Definition: buf0buf.h:1220
bool file_page_was_freed
This is set to true when fsp frees a page in buffer pool; protected by buf_pool->zip_mutex or buf_blo...
Definition: buf0buf.h:1697
UT_LIST_NODE_T(buf_page_t) LRU
node of the LRU list
friend class Latching_rules_helpers
Definition: buf0buf.h:1422
bool is_memory() const noexcept
Check if the state of this page is BUF_BLOCK_MEMORY.
Definition: buf0buf.h:1213
buf_flush_t flush_type
If this block is currently being flushed to disk, this tells the flush_type.
Definition: buf0buf.h:1598
void set_page_size(const page_size_t &page_size)
Set the page size to a new value.
Definition: buf0buf.h:1290
bool in_page_hash
true if in buf_pool->page_hash
Definition: buf0buf.h:1716
page_zip_des_t zip
compressed page; zip.data (but not the data it points to) is protected by buf_pool->zip_mutex; state ...
Definition: buf0buf.h:1662
static bool is_correct_io_fix_value(buf_io_fix io_fix)
Checks if io_fix has any of the known enum values.
Definition: buf0buf.h:1401
Definition: buf0buf.h:1152
copyable_atomic_t(const copyable_atomic_t< T > &other)
Definition: buf0buf.h:1154
Tablespace or log data space.
Definition: fil0fil.h:506
space_id_t id
Tablespace ID.
Definition: fil0fil.h:660
void dec_ref() noexcept
Decrement the page reference count.
Definition: fil0fil.h:564
uint32_t get_current_version() const
Returns current version of the space object.
Definition: fil0fil.cc:10328
uint32_t get_recent_version() const
Returns current version of the space object.
Definition: fil0fil.cc:10332
bool was_not_deleted() const
Definition: fil0fil.cc:10320
void inc_ref() noexcept
Increment the page reference count.
Definition: fil0fil.h:553
bool is_deleted() const
Definition: fil0fil.cc:10315
Definition: hash0hash.h:375
Page identifier.
Definition: buf0types.h:191
uint64_t hash() const
Retrieve the hash value.
Definition: buf0types.h:231
page_no_t page_no() const
Retrieve the page number.
Definition: buf0types.h:227
Page size descriptor.
Definition: page0size.h:50
size_t logical() const
Retrieve the logical page size (in-memory).
Definition: page0size.h:137
int page
Definition: ctype-mb.cc:1226
dberr_t
Definition: db0err.h:39
fil_space_t * fil_space_get(space_id_t space_id)
Look up a tablespace.
Definition: fil0fil.cc:2139
void fil_page_reset_type(const page_id_t &page_id, byte *page, ulint type, mtr_t *mtr)
Reset the page type.
Definition: fil0fil.cc:7529
The low-level file system.
uint16_t page_type_t
Definition: fil0fil.h:1558
constexpr page_type_t FIL_PAGE_INDEX
File page types (values of FIL_PAGE_TYPE)
Definition: fil0fil.h:1562
constexpr page_no_t FIL_NULL
'null' (undefined) page offset in the context of file spaces
Definition: fil0fil.h:1502
page_type_t fil_page_get_type(const byte *page)
Get the file page type.
Definition: fil0fil.h:1675
constexpr uint32_t FIL_PAGE_TYPE
file page type: FIL_PAGE_INDEX,..., 2 bytes.
Definition: fil0types.h:76
constexpr uint32_t FIL_PAGE_OFFSET
page offset inside space
Definition: fil0types.h:46
constexpr uint32_t FIL_PAGE_DATA
start of the data on the page
Definition: fil0types.h:111
constexpr uint32_t FIL_PAGE_SPACE_ID
alias for space id
Definition: fil0types.h:108
constexpr uint32_t FIL_PAGE_NEXT
if there is a 'natural' successor of the page, its offset.
Definition: fil0types.h:61
constexpr uint32_t FIL_PAGE_PREV
if there is a 'natural' predecessor of the page, its offset.
Definition: fil0types.h:51
flush_type
Definition: my_sys.h:330
The simple hash table utility.
static rw_lock_t * hash_lock_s_confirm(rw_lock_t *hash_lock, hash_table_t *table, uint64_t hash_value)
If not appropriate rw_lock for a hash value in a hash table, relock S-lock the another rw_lock until ...
static rw_lock_t * hash_lock_x_confirm(rw_lock_t *hash_lock, hash_table_t *table, uint64_t hash_value)
If not appropriate rw_lock for a hash value in a hash table, relock X-lock the another rw_lock until ...
static rw_lock_t * hash_get_lock(hash_table_t *table, uint64_t hash_value)
Gets the rw_lock for a hash value in a hash table.
static int flags[50]
Definition: hp_test1.cc:40
#define T
Definition: jit_executor_value.cc:373
#define F
Definition: jit_executor_value.cc:374
#define malloc(A)
Definition: lexyy.cc:914
#define free(A)
Definition: lexyy.cc:915
lock_mode
Definition: lock0types.h:54
constexpr lsn_t LSN_MAX
Maximum possible lsn value is slightly higher than the maximum sn value, because lsn sequence enumera...
Definition: log0constants.h:159
uint64_t lsn_t
Type used for all log sequence number storage and arithmetic.
Definition: log0types.h:63
static uint16_t mach_read_from_2(const byte *b)
The following function is used to fetch data from 2 consecutive bytes.
static uint32_t mach_read_from_4(const byte *b)
The following function is used to fetch data from 4 consecutive bytes.
static void mach_write_to_4(byte *b, ulint n)
The following function is used to store data in 4 consecutive bytes.
Mini-transaction buffer global types.
unsigned long long int ulonglong
Definition: my_inttypes.h:56
void copy(Shards< COUNT > &dst, const Shards< COUNT > &src) noexcept
Copy the counters, overwrite destination.
Definition: ut0counter.h:354
void clear(Shards< COUNT > &shards) noexcept
Clear the counter - reset to 0.
Definition: ut0counter.h:344
Definition: buf0block_hint.cc:30
const std::string FILE("FILE")
bool load(THD *, const dd::String_type &fname, dd::String_type *buf)
Read an sdi file from disk and store in a buffer.
Definition: sdi_file.cc:308
Definition: os0file.h:89
bool index(const std::string &value, const String &search_for, uint32_t *idx)
Definition: contains.h:76
Provides atomic access in shared-exclusive modes.
Definition: shared_spin_lock.h:79
noexcept
The return type for any call_and_catch(f, args...) call where f(args...) returns Type.
Definition: call_and_catch.h:76
size_t size(const char *const c)
Definition: base64.h:46
Define std::hash<Gtid>.
Definition: gtid.h:355
mode
Definition: file_handle.h:61
pid_type get_id()
Definition: process.h:48
static uint64_t hash_uint64(uint64_t value)
Hashes a 64-bit integer.
Definition: ut0rnd.h:199
std::list< T, ut::allocator< T > > list
Specialization of list which uses ut_allocator.
Definition: ut0new.h:2728
void os_event_set(os_event_t event)
Sets an event semaphore to the signaled state: lets waiting threads proceed.
Definition: os0event.cc:539
bool os_event_is_set(const os_event_t event)
Check if the event is set.
Definition: os0event.cc:531
int64_t os_event_reset(os_event_t event)
Resets an event semaphore to the non-signaled state.
Definition: os0event.cc:552
The interface to the operating system process control primitives.
Index page routines.
byte page_t
Type of the index page.
Definition: page0types.h:152
required string type
Definition: replication_group_member_actions.proto:34
Shutdowns the Innobase database server.
std::atomic< enum srv_shutdown_t > srv_shutdown_state
At a shutdown this value climbs from SRV_SHUTDOWN_NONE to SRV_SHUTDOWN_EXIT_THREADS.
Definition: srv0start.cc:158
@ SRV_SHUTDOWN_EXIT_THREADS
Exit all threads and free resources.
Definition: srv0shutdown.h:111
The server main program.
Functor to validate the LRU list.
Definition: buf0buf.h:2733
static void validate(const buf_pool_t *buf_pool)
Definition: buf0buf.h:2736
void operator()(const buf_page_t *elem) const
Definition: buf0buf.h:2734
Functor to validate the LRU list.
Definition: buf0buf.h:2723
void operator()(const buf_page_t *elem) const
Definition: buf0buf.h:2724
static void validate(const buf_pool_t *buf_pool)
Definition: buf0buf.h:2726
Definition: buf0buf.h:2742
static void validate(const buf_pool_t *buf_pool)
Definition: buf0buf.h:2748
void operator()(const buf_block_t *elem) const
Definition: buf0buf.h:2743
Structure used by AHI to contain information on record prefixes to be considered in hash index subsys...
Definition: buf0buf.h:1734
bool operator==(const btr_search_prefix_info_t &other) const
Definition: buf0buf.h:1748
bool operator!=(const btr_search_prefix_info_t &other) const
Definition: buf0buf.h:1753
bool equals_without_left_side(const btr_search_prefix_info_t &other) const
Definition: buf0buf.h:1744
uint32_t n_bytes
recommended prefix: number of bytes in an incomplete field
Definition: buf0buf.h:1737
uint16_t n_fields
recommended prefix length for hash search: number of full fields
Definition: buf0buf.h:1739
bool left_side
true or false, depending on whether the leftmost record of several records with the same prefix shoul...
Definition: buf0buf.h:1742
Structure that holds most AHI-related fields.
Definition: buf0buf.h:1797
void assert_empty_on_init() const
Definition: buf0buf.h:1863
std::atomic< dict_index_t * > index
Index for which the adaptive hash index has been created, or nullptr if the page does not exist in th...
Definition: buf0buf.h:1816
void assert_empty() const
Definition: buf0buf.h:1861
void validate() const
Definition: buf0buf.h:1839
std::atomic< btr_search_prefix_info_t > prefix_info
Prefix info that was used for building hash index.
Definition: buf0buf.h:1815
std::atomic< uint16_t > n_pointers
Used in debugging.
Definition: buf0buf.h:1837
std::atomic< btr_search_prefix_info_t > recommended_prefix_info
Recommended prefix info for hash search.
Definition: buf0buf.h:1804
The buffer control block structure.
Definition: buf0buf.h:1759
rw_lock_t debug_latch
In the debug version, each thread which bufferfixes the block acquires an s-latch here; so we can use...
Definition: buf0buf.h:1898
uint64_t modify_clock
This clock is incremented every time a pointer to a record on the page may become obsolete; this is u...
Definition: buf0buf.h:1912
BPageLock lock
read-write lock of the buffer frame
Definition: buf0buf.h:1769
std::atomic< uint32_t > n_hash_helps
Counter which controls how many times the current prefix recommendation would help in searches.
Definition: buf0buf.h:1886
page_type_t get_page_type() const
Get the page type of the current buffer block.
Definition: buf0buf.h:1958
struct buf_block_t::ahi_t ahi
buf_page_t page
page information; this must be the first field, so that buf_pool->page_hash can point to buf_page_t o...
Definition: buf0buf.h:1765
page_no_t get_next_page_no() const
Get the next page number of the current buffer block.
Definition: buf0buf.h:1946
page_zip_des_t const * get_page_zip() const noexcept
Const version.
Definition: buf0buf.h:2002
const char * get_page_type_str() const noexcept
Get the page type of the current buffer block as string.
Definition: buf0buf.cc:6963
bool in_withdraw_list
Definition: buf0buf.h:1791
UT_LIST_NODE_T(buf_block_t) unzip_LRU
node of the decompressed LRU list; a block is in the unzip_LRU list if page.state == BUF_BLOCK_FILE_P...
page_no_t get_prev_page_no() const
Get the prev page number of the current buffer block.
Definition: buf0buf.h:1952
bool is_leaf() const
Definition: buf0buf.h:2013
void mark_for_read_io()
Mark the frame with jumbled page_id, while initiating i/o read (BUF_IO_READ).
Definition: buf0buf.h:1965
uint64_t get_modify_clock(bool single_threaded) const noexcept
Get the modified clock (version) value.
Definition: buf0buf.h:1925
bool in_unzip_LRU_list
true if the page is in the decompressed LRU list; used in debugging
Definition: buf0buf.h:1789
bool is_empty() const
Check if this index page is empty.
Definition: buf0buf.cc:6995
const page_id_t & get_page_id() const
Get the page number and space id of the current buffer block.
Definition: buf0buf.h:1938
BPageMutex mutex
mutex protecting this block: state (also protected by the buffer pool mutex), io_fix,...
Definition: buf0buf.h:1919
byte * frame
pointer to buffer frame which is of size UNIV_PAGE_SIZE, and aligned to an address divisible by UNIV_...
Definition: buf0buf.h:1781
page_no_t get_page_no() const
Get the page number of the current buffer block.
Definition: buf0buf.h:1942
bool is_index_page() const
Definition: buf0buf.h:2015
bool is_root() const
Definition: buf0buf.h:2009
bool was_freed() const
Check if the buffer block was freed.
Definition: buf0buf.h:1774
bool made_dirty_with_no_latch
true if block has been made dirty without acquiring X/SX latch as the block belongs to temporary tabl...
Definition: buf0buf.h:1890
page_zip_des_t * get_page_zip() noexcept
Gets the compressed page descriptor corresponding to an uncompressed page if applicable.
Definition: buf0buf.h:1996
bool is_memory() const noexcept
Definition: buf0buf.h:2006
uint16_t get_page_level() const
Definition: buf0buf.cc:6987
friend std::ostream & operator<<(std::ostream &outs, const buf_block_t &block)
Print control block information in JSON format: {"key":"value"}.
Definition: buf0buf.cc:7050
Struct that is embedded in the free zip blocks.
Definition: buf0buf.h:2160
UT_LIST_NODE_T(buf_buddy_free_t) list
Node of zip_free list.
ulint size
size of the block
Definition: buf0buf.h:2162
union buf_buddy_free_t::@200 stamp
byte bytes[FIL_PAGE_DATA]
stamp[FIL_PAGE_ARCH_LOG_NO_OR_SPACE_ID] == BUF_BUDDY_FREE_STAMP denotes a free block.
Definition: buf0buf.h:2163
buf_page_t bpage
Embedded bpage descriptor.
Definition: buf0buf.h:2174
Definition: buf0buf.h:2272
uint64_t relocated
Definition: buf0buf.h:2274
ulint used
Definition: buf0buf.h:2273
std::chrono::steady_clock::duration relocated_duration
Definition: buf0buf.h:2275
Statistics of buddy blocks of a given size.
Definition: buf0buf.h:2262
uint64_t relocated
Number of blocks relocated by the buddy system.
Definition: buf0buf.h:2267
snapshot_t take_snapshot()
Definition: buf0buf.h:2278
std::atomic< ulint > used
Number of blocks allocated from the buddy system.
Definition: buf0buf.h:2264
std::chrono::steady_clock::duration relocated_duration
Total duration of block relocations.
Definition: buf0buf.h:2270
A chunk of buffers.
Definition: buf0buf.ic:53
This structure defines information we will fetch from each buffer pool.
Definition: buf0buf.h:169
ulint young_making_delta
num of pages made young since last printout
Definition: buf0buf.h:222
std::array< size_t, BUF_FLUSH_N_TYPES > n_pending_flush
Number of pages pending flush of given type.
Definition: buf0buf.h:189
double pages_created_rate
num of pages create per second
Definition: buf0buf.h:218
ulint n_pages_read
buf_pool->n_pages_read
Definition: buf0buf.h:195
ulint pool_unique_id
Buffer Pool ID.
Definition: buf0buf.h:173
ulint n_pend_reads
buf_pool->n_pend_reads, pages pending read
Definition: buf0buf.h:187
ulint n_ra_pages_read_rnd
buf_pool->n_ra_pages_read_rnd, number of pages readahead
Definition: buf0buf.h:203
ulint lru_len
Length of buf_pool->LRU.
Definition: buf0buf.h:177
ulint unzip_cur
buf_LRU_stat_cur.unzip, num pages decompressed in current interval
Definition: buf0buf.h:243
ulint page_read_delta
num of pages read since last printout
Definition: buf0buf.h:220
double pages_written_rate
num of pages written per second
Definition: buf0buf.h:219
double page_made_young_rate
page made young rate in pages per second
Definition: buf0buf.h:213
ulint io_sum
buf_LRU_stat_sum.io
Definition: buf0buf.h:239
ulint io_cur
buf_LRU_stat_cur.io, num of IO for current interval
Definition: buf0buf.h:240
ulint old_lru_len
buf_pool->LRU_old_len
Definition: buf0buf.h:179
double pages_readahead_rnd_rate
random readahead rate in pages per second
Definition: buf0buf.h:228
ulint unzip_sum
buf_LRU_stat_sum.unzip
Definition: buf0buf.h:242
ulint n_pages_made_young
number of pages made young
Definition: buf0buf.h:191
ulint n_ra_pages_read
buf_pool->n_ra_pages_read, number of pages readahead
Definition: buf0buf.h:205
ulint n_pages_not_made_young
number of pages not made young
Definition: buf0buf.h:193
ulint n_ra_pages_evicted
buf_pool->n_ra_pages_evicted, number of readahead pages evicted without access
Definition: buf0buf.h:208
ulint n_pages_created
buf_pool->n_pages_created
Definition: buf0buf.h:197
ulint n_page_get_delta
num of buffer pool page gets since last printout
Definition: buf0buf.h:210
ulint free_list_len
Length of buf_pool->free list.
Definition: buf0buf.h:181
double pages_evicted_rate
rate of readahead page evicted without access, in pages per second
Definition: buf0buf.h:232
ulint not_young_making_delta
num of pages not make young since last printout
Definition: buf0buf.h:224
ulint n_pend_unzip
buf_pool->n_pend_unzip, pages pending decompress
Definition: buf0buf.h:185
double pages_readahead_rate
readahead rate in pages per second
Definition: buf0buf.h:230
ulint unzip_lru_len
length of buf_pool->unzip_LRU list
Definition: buf0buf.h:236
ulint pool_size
Buffer Pool size in pages.
Definition: buf0buf.h:175
ulint flush_list_len
Length of buf_pool->flush_list.
Definition: buf0buf.h:183
double page_not_made_young_rate
page not made young rate in pages per second
Definition: buf0buf.h:215
ulint n_page_gets
buf_pool->n_page_gets
Definition: buf0buf.h:201
double pages_read_rate
num of pages read per second
Definition: buf0buf.h:217
ulint n_pages_written
buf_pool->n_pages_written
Definition: buf0buf.h:199
The buffer pool statistics structure.
Definition: buf0buf.h:2180
uint64_t n_pages_not_made_young
Number of pages not made young because the first access was not long enough ago, in buf_page_peek_if_...
Definition: buf0buf.h:2213
std::atomic< uint64_t > n_pages_read
Number of read operations.
Definition: buf0buf.h:2189
std::atomic< uint64_t > n_pages_created
number of pages created in the pool with no read.
Definition: buf0buf.h:2195
uint64_t n_pages_made_young
Number of pages made young, in calls to buf_LRU_make_block_young().
Definition: buf0buf.h:2209
uint64_t n_ra_pages_evicted
Number of read ahead pages that are evicted without being accessed.
Definition: buf0buf.h:2205
std::atomic< uint64_t > n_ra_pages_read_rnd
Number of pages read in as part of random read ahead.
Definition: buf0buf.h:2198
uint64_t flush_list_bytes
Flush_list size in bytes.
Definition: buf0buf.h:2219
std::atomic< uint64_t > n_ra_pages_read
Number of pages read in as part of read ahead.
Definition: buf0buf.h:2201
Shards m_n_page_gets
Number of page gets performed; also successful searches through the adaptive hash index are counted a...
Definition: buf0buf.h:2186
uint64_t LRU_bytes
LRU size in bytes.
Definition: buf0buf.h:2216
void reset()
Definition: buf0buf.h:2245
static void copy(buf_pool_stat_t &dst, const buf_pool_stat_t &src) noexcept
Definition: buf0buf.h:2221
std::atomic< uint64_t > n_pages_written
Number of write operations.
Definition: buf0buf.h:2192
The buffer pool structure.
Definition: buf0buf.h:2288
UT_LIST_BASE_NODE_T(buf_buddy_free_t, list) zip_free[BUF_BUDDY_SIZES_MAX]
Buddy free lists.
UT_LIST_BASE_NODE_T(buf_page_t, list) free
Base node of the free block list.
buf_chunk_t * chunks_old
old buffer pool chunks to be freed after resizing buffer pool
Definition: buf0buf.h:2342
void change_flush_state(buf_flush_t flush_type, F &&change)
Executes change() which modifies fields protected by flush_state_mutex.
Definition: buf0buf.h:2553
hash_table_t * zip_hash
Hash table of buf_block_t blocks whose frames are allocated to the zip buddy system,...
Definition: buf0buf.h:2361
FlushHp flush_hp
"Hazard pointer" used during scan of flush_list while doing flush list batch.
Definition: buf0buf.h:2395
buf_buddy_stat_t buddy_stat[BUF_BUDDY_SIZES_MAX+1]
Statistics of buddy system, indexed by block size.
Definition: buf0buf.h:2374
LRUItr single_scan_itr
Iterator used to scan the LRU list when searching for single page flushing victim.
Definition: buf0buf.h:2464
buf_pool_stat_t old_stat
Old statistics.
Definition: buf0buf.h:2380
void deallocate_chunk(buf_chunk_t *chunk)
A wrapper for buf_pool_t::allocator.deallocate_large which also advices the OS that this chunk can be...
Definition: buf0buf.cc:974
bool try_LRU_scan
Set to false when an LRU scan for free block fails.
Definition: buf0buf.h:2426
ulint buddy_n_frames
Number of frames allocated from the buffer pool to the buddy system.
Definition: buf0buf.h:2329
std::atomic< ulint > n_pend_reads
Number of pending read operations.
Definition: buf0buf.h:2364
UT_LIST_BASE_NODE_T(buf_page_t, list) zip_clean
Unmodified compressed pages.
UT_LIST_BASE_NODE_T(buf_page_t, list) flush_list
Base node of the modified block list.
LRUHp lru_hp
"hazard pointer" used during scan of LRU while doing LRU list batch.
Definition: buf0buf.h:2456
bool allocate_chunk(ulonglong mem_size, buf_chunk_t *chunk)
A wrapper for buf_pool_t::allocator.alocate_large which also advices the OS that this chunk should no...
Definition: buf0buf.cc:940
bool is_tracking()
Check if the page modifications are tracked.
Definition: buf0buf.h:2433
UT_LIST_BASE_NODE_T(buf_block_t, unzip_LRU) unzip_LRU
Base node of the unzip_LRU list.
std::chrono::steady_clock::time_point last_printout_time
when buf_print_io was last time called.
Definition: buf0buf.h:2370
ulint LRU_old_ratio
Reserve this much of the buffer pool for "old" blocks.
Definition: buf0buf.h:2325
BufListMutex chunks_mutex
protects (de)allocation of chunks:
Definition: buf0buf.h:2297
lsn_t track_page_lsn
Page Tracking start LSN.
Definition: buf0buf.h:2429
BufListMutex zip_free_mutex
buddy allocator mutex
Definition: buf0buf.h:2306
volatile ulint n_chunks
Number of buffer pool chunks.
Definition: buf0buf.h:2333
LRUItr lru_scan_itr
Iterator used to scan the LRU list when searching for replaceable victim.
Definition: buf0buf.h:2460
bool madvise_dump()
Advices the OS that all chunks in this buffer pool instance can be dumped to a core file.
Definition: buf0buf.cc:985
ulint old_size
Previous pool size in pages.
Definition: buf0buf.h:2348
UT_LIST_BASE_NODE_T(buf_page_t, LRU) LRU
Base node of the LRU list.
FlushHp oldest_hp
Entry pointer to scan the oldest page except for system temporary.
Definition: buf0buf.h:2398
buf_page_t * LRU_old
Pointer to the about LRU_old_ratio/BUF_LRU_OLD_RATIO_DIV oldest blocks in the LRU list; NULL if LRU l...
Definition: buf0buf.h:2472
buf_page_t * watch
Sentinel records for buffer pool watches.
Definition: buf0buf.h:2501
BufListMutex flush_list_mutex
Mutex protecting the flush list access.
Definition: buf0buf.h:2391
ib_mutex_t flush_state_mutex
Flush state protection mutex.
Definition: buf0buf.h:2312
buf_chunk_t * chunks
buffer pool chunks
Definition: buf0buf.h:2339
BufListMutex LRU_list_mutex
LRU list mutex.
Definition: buf0buf.h:2300
hash_table_t * page_hash
Hash table of buf_page_t or buf_block_t file pages, buf_page_in_file() == true, indexed by (space_id,...
Definition: buf0buf.h:2357
ulint withdraw_target
Target length of withdraw block list, when withdrawing.
Definition: buf0buf.h:2452
os_event_t no_flush[BUF_FLUSH_N_TYPES]
This is in the set state when there is no flush batch of the given type running.
Definition: buf0buf.h:2413
buf_pool_stat_t stat
Current statistics.
Definition: buf0buf.h:2377
page_no_t read_ahead_area
Size in pages of the area which the read-ahead algorithms read if invoked.
Definition: buf0buf.h:2352
ulint curr_pool_size
Current pool size in bytes.
Definition: buf0buf.h:2322
bool init_flush[BUF_FLUSH_N_TYPES]
This is true when a flush of the given type is being initialized.
Definition: buf0buf.h:2405
ulint curr_size
Current pool size in pages.
Definition: buf0buf.h:2345
ulint instance_no
Array index of this buffer pool instance.
Definition: buf0buf.h:2319
ulint LRU_old_len
Length of the LRU list from the block to which LRU_old points onward, including that block; see buf0l...
Definition: buf0buf.h:2478
std::array< size_t, BUF_FLUSH_N_TYPES > n_flush
This is the number of pending writes in the given flush type.
Definition: buf0buf.h:2409
std::atomic< ulint > n_pend_unzip
number of pending decompressions.
Definition: buf0buf.h:2367
UT_LIST_BASE_NODE_T(buf_page_t, list) withdraw
base node of the withdraw block list.
lsn_t max_lsn_io
Maximum LSN for which write io has already started.
Definition: buf0buf.h:2436
ulint freed_page_clock
A sequence number used to count the number of buffer blocks removed from the end of the LRU list; NOT...
Definition: buf0buf.h:2420
BufListMutex free_list_mutex
free and withdraw list mutex
Definition: buf0buf.h:2303
BufPoolZipMutex zip_mutex
Zip mutex of this buffer pool instance, protects compressed only pages (of type buf_page_t,...
Definition: buf0buf.h:2316
bool madvise_dont_dump()
Advices the OS that all chunks in this buffer pool instance should not be dumped to a core file.
Definition: buf0buf.cc:995
volatile ulint n_chunks_new
New number of buffer pool chunks.
Definition: buf0buf.h:2336
BufListMutex zip_hash_mutex
zip_hash mutex
Definition: buf0buf.h:2309
bool is_flushing(buf_flush_t flush_type) const
Checks if the batch is running, which is basically equivalent to !os_event_is_set(no_flush[type]) if ...
Definition: buf0buf.h:2540
The occupied bytes of lists in all buffer pools.
Definition: buf0buf.h:249
ulint LRU_bytes
LRU size in bytes.
Definition: buf0buf.h:250
ulint unzip_LRU_bytes
unzip_LRU size in bytes
Definition: buf0buf.h:251
ulint flush_list_bytes
flush_list size in bytes
Definition: buf0buf.h:252
File space address.
Definition: fil0fil.h:1513
Mini-transaction handle and buffer.
Definition: mtr0mtr.h:174
InnoDB condition variable.
Definition: os0event.cc:63
Compressed page descriptor.
Definition: page0types.h:201
page_zip_t * data
Compressed page data.
Definition: page0types.h:203
The structure used in the spin lock implementation of a read-write lock.
Definition: sync0rw.h:362
Definition: ut0core.h:36
bool rw_lock_own(const rw_lock_t *lock, ulint lock_type)
Checks if the thread has locked the rw-lock in the specified mode, with the pass value == 0.
Definition: sync0rw.cc:858
rw_lock_type_t
Definition: sync0rw.h:96
@ RW_NO_LATCH
Definition: sync0rw.h:100
bool rw_lock_own_flagged(const rw_lock_t *lock, rw_lock_flags_t flags)
Checks if the thread has locked the rw-lock in the specified mode, with the pass value == 0.
Definition: sync0rw.cc:898
latch_level_t
Latching order levels.
Definition: sync0types.h:196
@ RW_LOCK_S
Definition: sync0types.h:203
@ RW_LOCK_X
Definition: sync0types.h:204
@ RW_LOCK_FLAG_X
Definition: sync0types.h:1213
@ RW_LOCK_FLAG_SX
Definition: sync0types.h:1214
@ RW_LOCK_FLAG_S
Definition: sync0types.h:1212
Version control for database, common definitions, and include files.
constexpr uint32_t UINT32_UNDEFINED
The 'undefined' value for a 32-bit unsigned integer.
Definition: univ.i:425
#define UNIV_PAGE_SIZE_SHIFT
The 2-logarithm of UNIV_PAGE_SIZE:
Definition: univ.i:288
#define IF_DEBUG(...)
Definition: univ.i:677
unsigned long int ulint
Definition: univ.i:403
#define UNIV_MEM_VALID(addr, size)
Definition: univ.i:594
constexpr uint32_t UNIV_ZIP_SIZE_MIN
Smallest compressed page size.
Definition: univ.i:327
Utilities for byte operations.
#define ut_ad(EXPR)
Debug assertion.
Definition: ut0dbg.h:109
#define ut_d(EXPR)
Debug statement.
Definition: ut0dbg.h:111
#define ut_a(EXPR)
Abort execution if EXPR does not evaluate to nonzero.
Definition: ut0dbg.h:97
void ut_list_validate(const List &list, Functor &functor)
Checks the consistency of a two-way list.
Definition: ut0lst.h:493
#define mutex_own(M)
Checks that the current thread owns the mutex.
Definition: ut0mutex.h:166
#define mutex_exit(M)
Definition: ut0mutex.h:122
#define mutex_enter(M)
Definition: ut0mutex.h:116
static uint64_t lsn
Definition: xcom_base.cc:446
unsigned long id[MAX_DEAD]
Definition: xcom_base.cc:510
int n
Definition: xcom_base.cc:509