mirror of
https://github.com/MariaDB/server.git
synced 2025-02-02 20:11:42 +01:00
8a3ea85c92
------------------------------------------------------------------------ r5147 | marko | 2009-05-27 06:55:14 -0400 (Wed, 27 May 2009) | 1 line branches/zip: ibuf0ibuf.c: Improve a comment. ------------------------------------------------------------------------ r5149 | marko | 2009-05-27 07:46:42 -0400 (Wed, 27 May 2009) | 34 lines branches/zip: Merge revisions 4994:5148 from branches/5.1: ------------------------------------------------------------------------ r5126 | vasil | 2009-05-26 16:57:12 +0300 (Tue, 26 May 2009) | 9 lines branches/5.1: Preparation for the fix of Bug#45097 Hang during recovery, redo logs for doublewrite buffer pages Non-functional change: move FSP_* macros from fsp0fsp.h to a new file fsp0types.h. This is needed in order to be able to use FSP_EXTENT_SIZE in mtr0log.ic. ------------------------------------------------------------------------ r5127 | vasil | 2009-05-26 17:05:43 +0300 (Tue, 26 May 2009) | 9 lines branches/5.1: Preparation for the fix of Bug#45097 Hang during recovery, redo logs for doublewrite buffer pages Do not include unnecessary headers mtr0log.h and fut0lst.h in trx0sys.h and include fsp0fsp.h just before it is needed. This is needed in order to be able to use TRX_SYS_SPACE in mtr0log.ic. ------------------------------------------------------------------------ r5128 | vasil | 2009-05-26 17:26:37 +0300 (Tue, 26 May 2009) | 7 lines branches/5.1: Fix Bug#45097 Hang during recovery, redo logs for doublewrite buffer pages Do not write redo log for the pages in the doublewrite buffer. Also, do not make a dummy change to the page because this is not needed. ------------------------------------------------------------------------ ------------------------------------------------------------------------ r5169 | marko | 2009-05-28 03:21:55 -0400 (Thu, 28 May 2009) | 1 line branches/zip: mtr0mtr.h: Add Doxygen comments for the redo log entry types. ------------------------------------------------------------------------ r5176 | marko | 2009-05-28 07:14:02 -0400 (Thu, 28 May 2009) | 1 line branches/zip: Correct a debug assertion that was added in r5125. ------------------------------------------------------------------------ r5201 | marko | 2009-06-01 06:35:25 -0400 (Mon, 01 Jun 2009) | 2 lines branches/zip: Clean up some comments. Make the rec parameter of mlog_open_and_write_index() const. ------------------------------------------------------------------------ r5234 | marko | 2009-06-03 08:26:41 -0400 (Wed, 03 Jun 2009) | 44 lines branches/zip: Merge revisions 5148:5233 from branches/5.1: ------------------------------------------------------------------------ r5150 | vasil | 2009-05-27 18:56:03 +0300 (Wed, 27 May 2009) | 4 lines branches/5.1: Whitespace fixup. ------------------------------------------------------------------------ r5191 | vasil | 2009-05-30 17:46:05 +0300 (Sat, 30 May 2009) | 19 lines branches/5.1: Merge a change from MySQL (this fixes the failing innodb_mysql test): ------------------------------------------------------------ revno: 1810.3894.10 committer: Sergey Glukhov <Sergey.Glukhov@sun.com> branch nick: mysql-5.0-bugteam timestamp: Tue 2009-05-19 11:32:21 +0500 message: Bug#39793 Foreign keys not constructed when column has a '#' in a comment or default value Internal InnoDN FK parser does not recognize '\'' as quotation symbol. Suggested fix is to add '\'' symbol check for quotation condition (dict_strip_comments() function). modified: innobase/dict/dict0dict.c mysql-test/r/innodb_mysql.result mysql-test/t/innodb_mysql.test ------------------------------------------------------------------------ r5233 | marko | 2009-06-03 15:12:44 +0300 (Wed, 03 Jun 2009) | 11 lines branches/5.1: Merge the test case from r5232 from branches/5.0: ------------------------------------------------------------------------ r5232 | marko | 2009-06-03 14:31:04 +0300 (Wed, 03 Jun 2009) | 21 lines branches/5.0: Merge r3590 from branches/5.1 in order to fix Bug #40565 (Update Query Results in "1 Row Affected" But Should Be "Zero Rows"). Also, add a test case for Bug #40565. rb://128 approved by Heikki Tuuri ------------------------------------------------------------------------ ------------------------------------------------------------------------ ------------------------------------------------------------------------ r5250 | marko | 2009-06-04 02:58:23 -0400 (Thu, 04 Jun 2009) | 1 line branches/zip: Add Doxygen comments to the rest of buf0*. ------------------------------------------------------------------------ r5251 | marko | 2009-06-04 02:59:51 -0400 (Thu, 04 Jun 2009) | 1 line branches/zip: Replace <= in a function comment. ------------------------------------------------------------------------ r5253 | marko | 2009-06-04 06:37:35 -0400 (Thu, 04 Jun 2009) | 1 line branches/zip: Add missing Doxygen comments for page0zip. ------------------------------------------------------------------------ r5261 | vasil | 2009-06-05 11:13:31 -0400 (Fri, 05 Jun 2009) | 15 lines branches/zip: Fix Mantis Issue#244 fix bug in linear read ahead (no check on access pattern) The changes are: 1) Take into account access pattern when deciding whether or not to do linear read ahead. 2) Expose a knob innodb_read_ahead_factor = [0-64] default (8), dynamic, global to control linear read ahead behvior 3) Disable random read ahead. Keep the code for now. Submitted by: Inaam (rb://122) Approved by: Heikki (rb://122) ------------------------------------------------------------------------ r5262 | vasil | 2009-06-05 12:04:25 -0400 (Fri, 05 Jun 2009) | 22 lines branches/zip: Enable functionality to have multiple background io helper threads. This patch is based on percona contributions. More details about this patch will be written at: https://svn.innodb.com/innobase/MultipleBackgroundThreads The patch essentially does the following: expose following knobs: innodb_read_io_threads = [1 - 64] default 1 innodb_write_io_threads = [1 - 64] default 1 deprecate innodb_file_io_threads (this parameter was relevant only on windows) Internally it allows multiple segments for read and write IO request arrays where one thread works on one segement. Submitted by: Inaam (rb://124) Approved by: Heikki (rb://124) ------------------------------------------------------------------------ r5263 | vasil | 2009-06-05 12:19:37 -0400 (Fri, 05 Jun 2009) | 4 lines branches/zip: Whitespace cleanup. ------------------------------------------------------------------------ r5264 | vasil | 2009-06-05 12:26:58 -0400 (Fri, 05 Jun 2009) | 4 lines branches/zip: Add ChangeLog entry for r5261. ------------------------------------------------------------------------ r5265 | vasil | 2009-06-05 12:34:11 -0400 (Fri, 05 Jun 2009) | 4 lines branches/zip: Add ChangeLog entry for r5262. ------------------------------------------------------------------------ r5268 | inaam | 2009-06-08 12:18:21 -0400 (Mon, 08 Jun 2009) | 7 lines branches/zip Non functional change: Added legal notices acknowledging percona contribution to the multiple IO helper threads patch i.e.: r5262 ------------------------------------------------------------------------ r5283 | inaam | 2009-06-09 13:46:29 -0400 (Tue, 09 Jun 2009) | 9 lines branches/zip rb://130 Enable Group Commit functionality that was broken in 5.0 when distributed transactions were introduced. Reviewed by: Heikki ------------------------------------------------------------------------ r5319 | marko | 2009-06-11 04:40:33 -0400 (Thu, 11 Jun 2009) | 3 lines branches/zip: Declare os_thread_id_t as unsigned long, because ulint is wrong on Win64. Pointed out by Vladislav Vaintroub <wlad@sun.com>. ------------------------------------------------------------------------ r5320 | inaam | 2009-06-11 09:15:41 -0400 (Thu, 11 Jun 2009) | 14 lines branches/zip rb://131 This patch changes the following defaults: max_dirty_pages_pct: default from 90 to 75. max allowed from 100 to 99 additional_mem_pool_size: default from 1 to 8 MB buffer_pool_size: default from 8 to 128 MB log_buffer_size: default from 1 to 8 MB read_io_threads/write_io_threads: default from 1 to 4 The log file sizes are untouched because of upgrade issues Reviewed by: Heikki ------------------------------------------------------------------------ r5330 | marko | 2009-06-16 04:08:59 -0400 (Tue, 16 Jun 2009) | 2 lines branches/zip: buf_page_get_gen(): Reduce mutex holding time by adjusting buf_pool->n_pend_unzip while only holding buf_pool_mutex. ------------------------------------------------------------------------ r5331 | marko | 2009-06-16 05:00:48 -0400 (Tue, 16 Jun 2009) | 2 lines branches/zip: buf_page_get_zip(): Eliminate a buf_page_get_mutex() call. The function must switch on the block state anyway. ------------------------------------------------------------------------ r5332 | vasil | 2009-06-16 05:03:27 -0400 (Tue, 16 Jun 2009) | 4 lines branches/zip: Add ChangeLog entries for r5283 and r5320. ------------------------------------------------------------------------ r5333 | marko | 2009-06-16 05:27:46 -0400 (Tue, 16 Jun 2009) | 1 line branches/zip: buf_page_io_query(): Remove unused function. ------------------------------------------------------------------------ r5335 | marko | 2009-06-16 09:23:10 -0400 (Tue, 16 Jun 2009) | 2 lines branches/zip: innodb.test: Adjust the tolerance of innodb_buffer_pool_pages_total for r5320. ------------------------------------------------------------------------ r5342 | marko | 2009-06-17 06:15:32 -0400 (Wed, 17 Jun 2009) | 60 lines branches/zip: Merge revisions 5233:5341 from branches/5.1: ------------------------------------------------------------------------ r5233 | marko | 2009-06-03 15:12:44 +0300 (Wed, 03 Jun 2009) | 11 lines branches/5.1: Merge the test case from r5232 from branches/5.0: ------------------------------------------------------------------------ r5232 | marko | 2009-06-03 14:31:04 +0300 (Wed, 03 Jun 2009) | 21 lines branches/5.0: Merge r3590 from branches/5.1 in order to fix Bug #40565 (Update Query Results in "1 Row Affected" But Should Be "Zero Rows"). Also, add a test case for Bug #40565. rb://128 approved by Heikki Tuuri ------------------------------------------------------------------------ ------------------------------------------------------------------------ r5243 | sunny | 2009-06-04 03:17:14 +0300 (Thu, 04 Jun 2009) | 14 lines branches/5.1: When the InnoDB and MySQL data dictionaries go out of sync, before the bug fix we would assert on missing autoinc columns. With this fix we allow MySQL to open the table but set the next autoinc value for the column to the MAX value. This effectively disables the next value generation. INSERTs will fail with a generic AUTOINC failure. However, the user should be able to read/dump the table, set the column values explicitly, use ALTER TABLE to set the next autoinc value and/or sync the two data dictionaries to resume normal operations. Fix Bug#44030 Error: (1500) Couldn't read the MAX(ID) autoinc value from the index (PRIMARY) rb://118 ------------------------------------------------------------------------ r5252 | sunny | 2009-06-04 10:16:24 +0300 (Thu, 04 Jun 2009) | 2 lines branches/5.1: The version of the result file checked in was broken in r5243. ------------------------------------------------------------------------ r5259 | vasil | 2009-06-05 10:29:16 +0300 (Fri, 05 Jun 2009) | 7 lines branches/5.1: Remove the word "Error" from the printout because the mysqltest suite interprets it as an error and thus the innodb-autoinc test fails. Approved by: Sunny (via IM) ------------------------------------------------------------------------ r5339 | marko | 2009-06-17 11:01:37 +0300 (Wed, 17 Jun 2009) | 2 lines branches/5.1: Add missing #include "mtr0log.h" so that the code compiles with -DUNIV_MUST_NOT_INLINE. (null merge; this had already been committed in branches/zip) ------------------------------------------------------------------------ r5340 | marko | 2009-06-17 12:11:49 +0300 (Wed, 17 Jun 2009) | 4 lines branches/5.1: row_unlock_for_mysql(): When the clustered index is unknown, refuse to unlock the record. (Bug #45357, caused by the fix of Bug #39320). rb://132 approved by Sunny Bains. ------------------------------------------------------------------------ ------------------------------------------------------------------------ r5343 | vasil | 2009-06-17 08:56:12 -0400 (Wed, 17 Jun 2009) | 4 lines branches/zip: Add ChangeLog entry for r5342. ------------------------------------------------------------------------ r5344 | marko | 2009-06-17 09:03:45 -0400 (Wed, 17 Jun 2009) | 1 line branches/zip: row_merge_read_rec(): Fix a UNIV_DEBUG bug (Bug #45426) ------------------------------------------------------------------------ r5391 | marko | 2009-06-22 05:31:35 -0400 (Mon, 22 Jun 2009) | 2 lines branches/zip: buf_page_get_zip(): Fix a bogus warning about block_mutex being possibly uninitialized. ------------------------------------------------------------------------ r5392 | marko | 2009-06-22 07:58:20 -0400 (Mon, 22 Jun 2009) | 4 lines branches/zip: ha_innobase::check_if_incompatible_data(): When ROW_FORMAT=DEFAULT, do not compare to get_row_type(). Without this change, fast index creation will be disabled in recent versions of MySQL 5.1. ------------------------------------------------------------------------ r5393 | pekka | 2009-06-22 09:27:55 -0400 (Mon, 22 Jun 2009) | 4 lines branches/zip: Minor changes for Hot Backup to build correctly. (The code bracketed between #ifdef UNIV_HOTBACKUP and #endif /* UNIV_HOTBACKUP */). This change should not affect !UNIV_HOTBACKUP build. ------------------------------------------------------------------------ r5394 | pekka | 2009-06-22 09:46:34 -0400 (Mon, 22 Jun 2009) | 4 lines branches/zip: Add functions for checking the format of tablespaces for Hot Backup build (UNIV_HOTBACKUP defined). This change should not affect !UNIV_HOTBACKUP build. ------------------------------------------------------------------------ r5397 | calvin | 2009-06-23 16:59:42 -0400 (Tue, 23 Jun 2009) | 7 lines branches/zip: change the header file path. Change the header file path from ../storage/innobase/include/ to ../include/. In the planned 5.1 + plugin release, the source directory of the plugin will not be in storage/innobase. Approved by: Heikki (IM) ------------------------------------------------------------------------ r5407 | calvin | 2009-06-24 09:51:08 -0400 (Wed, 24 Jun 2009) | 4 lines branches/zip: remove relative path of header files. Suggested by Marko. ------------------------------------------------------------------------ r5412 | marko | 2009-06-25 06:27:08 -0400 (Thu, 25 Jun 2009) | 1 line branches/zip: Replace a DBUG_ASSERT with ut_a to track down Issue #290. ------------------------------------------------------------------------ r5415 | marko | 2009-06-25 06:45:57 -0400 (Thu, 25 Jun 2009) | 3 lines branches/zip: dict_index_find_cols(): Print diagnostic on name mismatch. This addresses Bug #44571 but does not fix it. rb://135 approved by Sunny Bains. ------------------------------------------------------------------------ r5417 | marko | 2009-06-25 08:20:56 -0400 (Thu, 25 Jun 2009) | 1 line branches/zip: ha_innodb.cc: Move the misplaced Doxygen @file comment. ------------------------------------------------------------------------ r5418 | marko | 2009-06-25 08:55:52 -0400 (Thu, 25 Jun 2009) | 5 lines branches/zip: Fix a race condition caused by SET GLOBAL innodb_commit_concurrency=DEFAULT. (Bug #45749) When innodb_commit_concurrency is initially set nonzero, DEFAULT would change it back to 0, triggering Bug #42101. rb://139 approved by Heikki Tuuri. ------------------------------------------------------------------------ r5423 | calvin | 2009-06-26 16:52:52 -0400 (Fri, 26 Jun 2009) | 2 lines branches/zip: Fix typos. ------------------------------------------------------------------------ r5425 | marko | 2009-06-29 04:52:30 -0400 (Mon, 29 Jun 2009) | 4 lines branches/zip: ha_innobase::add_index(), ha_innobase::final_drop_index(): Start prebuilt->trx before locking the table. This should fix Issue #293 and could fix Issue #229. Approved by Sunny (over IM). ------------------------------------------------------------------------ r5426 | marko | 2009-06-29 05:24:27 -0400 (Mon, 29 Jun 2009) | 3 lines branches/zip: buf_page_get_gen(): Fix a race condition when reading buf_fix_count. This could explain Issue #156. Tested by Michael. ------------------------------------------------------------------------ r5427 | marko | 2009-06-29 05:54:53 -0400 (Mon, 29 Jun 2009) | 5 lines branches/zip: lock_print_info_all_transactions(), buf_read_recv_pages(): Tolerate missing tablespaces (zip_size==ULINT_UNDEFINED). buf_page_get_gen(): Add ut_ad(ut_is_2pow(zip_size)). Issue #289, rb://136 approved by Sunny Bains ------------------------------------------------------------------------ r5428 | marko | 2009-06-29 07:06:29 -0400 (Mon, 29 Jun 2009) | 2 lines branches/zip: row_sel_store_mysql_rec(): Add missing pointer cast. Do not do arithmetics on void pointers. ------------------------------------------------------------------------ r5429 | marko | 2009-06-29 09:49:54 -0400 (Mon, 29 Jun 2009) | 13 lines branches/zip: Do not crash on SET GLOBAL innodb_file_format=DEFAULT or SET GLOBAL innodb_file_format_check=DEFAULT. innodb_file_format.test: New test for innodb_file_format and innodb_file_format_check. innodb_file_format_name_validate(): Store the string in *save. innodb_file_format_name_update(): Check the string again. innodb_file_format_check_validate(): Store the string in *save. innodb_file_format_check_update(): Check the string again. Issue #282, rb://140 approved by Heikki Tuuri ------------------------------------------------------------------------ r5430 | marko | 2009-06-29 09:58:07 -0400 (Mon, 29 Jun 2009) | 2 lines branches/zip: lock_rec_validate_page(): Add another assertion to track down Issue #289. ------------------------------------------------------------------------ r5431 | marko | 2009-06-29 09:58:40 -0400 (Mon, 29 Jun 2009) | 1 line branches/zip: Revert an accidentally made change in r5430 to univ.i. ------------------------------------------------------------------------ r5437 | marko | 2009-06-30 05:10:01 -0400 (Tue, 30 Jun 2009) | 1 line branches/zip: ibuf_dummy_index_free(): Beautify the comment. ------------------------------------------------------------------------ r5438 | marko | 2009-06-30 05:10:32 -0400 (Tue, 30 Jun 2009) | 1 line branches/zip: fseg_free(): Remove this unused function. ------------------------------------------------------------------------ r5439 | marko | 2009-06-30 05:15:22 -0400 (Tue, 30 Jun 2009) | 2 lines branches/zip: fseg_validate(): Enclose in #ifdef UNIV_DEBUG. This function is unused, but it could turn out to be a useful debugging aid. ------------------------------------------------------------------------ r5441 | marko | 2009-06-30 06:30:14 -0400 (Tue, 30 Jun 2009) | 2 lines branches/zip: ha_delete(): Remove this unused function that was very similar to ha_search_and_delete_if_found(). ------------------------------------------------------------------------ r5442 | marko | 2009-06-30 06:45:41 -0400 (Tue, 30 Jun 2009) | 1 line branches/zip: lock_is_on_table(), lock_table_unlock(): Unused, remove. ------------------------------------------------------------------------ r5443 | marko | 2009-06-30 07:03:00 -0400 (Tue, 30 Jun 2009) | 1 line branches/zip: os_event_create_auto(): Unused, remove. ------------------------------------------------------------------------ r5444 | marko | 2009-06-30 07:19:49 -0400 (Tue, 30 Jun 2009) | 1 line branches/zip: que_graph_try_free(): Unused, remove. ------------------------------------------------------------------------ r5445 | marko | 2009-06-30 07:28:11 -0400 (Tue, 30 Jun 2009) | 1 line branches/zip: row_build_row_ref_from_row(): Unused, remove. ------------------------------------------------------------------------ r5446 | marko | 2009-06-30 07:35:45 -0400 (Tue, 30 Jun 2009) | 1 line branches/zip: srv_que_round_robin(), srv_que_task_enqueue(): Unused, remove. ------------------------------------------------------------------------ r5447 | marko | 2009-06-30 07:37:58 -0400 (Tue, 30 Jun 2009) | 1 line branches/zip: srv_que_task_queue_check(): Unused, remove. ------------------------------------------------------------------------ r5448 | marko | 2009-06-30 07:56:36 -0400 (Tue, 30 Jun 2009) | 1 line branches/zip: mem_heap_cat(): Unused, remove. ------------------------------------------------------------------------ r5449 | marko | 2009-06-30 08:00:50 -0400 (Tue, 30 Jun 2009) | 2 lines branches/zip: innobase_start_or_create_for_mysql(): Invoke os_get_os_version() at most once. ------------------------------------------------------------------------ r5450 | marko | 2009-06-30 08:02:20 -0400 (Tue, 30 Jun 2009) | 1 line branches/zip: os_file_close_no_error_handling(): Unused, remove. ------------------------------------------------------------------------ r5451 | marko | 2009-06-30 08:09:49 -0400 (Tue, 30 Jun 2009) | 2 lines branches/zip: page_set_max_trx_id(): Make the code compile with UNIV_HOTBACKUP. ------------------------------------------------------------------------ r5452 | marko | 2009-06-30 08:10:26 -0400 (Tue, 30 Jun 2009) | 2 lines branches/zip: os_file_close_no_error_handling(): Restore, as this function is used within InnoDB Hot Backup. ------------------------------------------------------------------------ r5453 | marko | 2009-06-30 08:14:01 -0400 (Tue, 30 Jun 2009) | 1 line branches/zip: os_process_set_priority_boost(): Unused, remove. ------------------------------------------------------------------------ r5454 | marko | 2009-06-30 08:42:52 -0400 (Tue, 30 Jun 2009) | 2 lines branches/zip: Replace a non-ASCII character (ISO 8859-1 encoded U+00AD SOFT HYPHEN) with a cheap ASCII substitute. ------------------------------------------------------------------------ r5456 | inaam | 2009-06-30 14:21:09 -0400 (Tue, 30 Jun 2009) | 4 lines branches/zip Non functional change. s/Percona/Percona Inc./ ------------------------------------------------------------------------ r5470 | vasil | 2009-07-02 09:12:36 -0400 (Thu, 02 Jul 2009) | 16 lines branches/zip: Use PAUSE instruction inside spinloop if it is available. The patch was originally developed by Mikael Ronstrom <mikael@mysql.com> and can be found here: http://bazaar.launchpad.net/%7Emysql/mysql-server/mysql-5.4/revision/2768 http://bazaar.launchpad.net/%7Emysql/mysql-server/mysql-5.4/revision/2771 http://bazaar.launchpad.net/%7Emysql/mysql-server/mysql-5.4/revision/2772 http://bazaar.launchpad.net/%7Emysql/mysql-server/mysql-5.4/revision/2774 http://bazaar.launchpad.net/%7Emysql/mysql-server/mysql-5.4/revision/2777 http://bazaar.launchpad.net/%7Emysql/mysql-server/mysql-5.4/revision/2799 http://bazaar.launchpad.net/%7Emysql/mysql-server/mysql-5.4/revision/2800 Approved by: Heikki (rb://137) ------------------------------------------------------------------------ r5481 | vasil | 2009-07-06 13:16:32 -0400 (Mon, 06 Jul 2009) | 4 lines branches/zip: Remove unnecessary quotes and simplify plug.in. ------------------------------------------------------------------------ r5482 | calvin | 2009-07-06 18:36:35 -0400 (Mon, 06 Jul 2009) | 5 lines branches/zip: add COPYING files for Percona and Sun Micro. 1.0.4 contains patches based on contributions from Percona and Sun Microsystems. ------------------------------------------------------------------------ r5483 | calvin | 2009-07-07 05:36:43 -0400 (Tue, 07 Jul 2009) | 3 lines branches/zip: add IB_HAVE_PAUSE_INSTRUCTION to CMake. Windows will support PAUSE instruction by default. ------------------------------------------------------------------------ r5484 | inaam | 2009-07-07 18:57:14 -0400 (Tue, 07 Jul 2009) | 13 lines branches/zip rb://126 Based on contribution from Google Inc. This patch introduces a new parameter innodb_io_capacity to control the rate at which master threads performs various tasks. The default value is 200 and higher values imply more aggressive flushing and ibuf merges from within the master thread. This patch also changes the ibuf merge from synchronous to asynchronous. Another minor change is not to force the master thread to wait for a log flush to complete every second. Approved by: Heikki ------------------------------------------------------------------------ r5485 | inaam | 2009-07-07 19:00:49 -0400 (Tue, 07 Jul 2009) | 18 lines branches/zip rb://138 The current implementation is to try to flush the neighbors of every page that we flush. This patch makes the following distinction: 1) If the flush is from flush_list AND 2) If the flush is intended to move the oldest_modification LSN ahead (this happens when a user thread sees little space in the log file and attempts to flush pages from the buffer pool so that a checkpoint can be made) THEN Do not try to flush the neighbors. Just focus on flushing dirty pages at the end of flush_list Approved by: Heikki ------------------------------------------------------------------------ r5486 | inaam | 2009-07-08 12:11:40 -0400 (Wed, 08 Jul 2009) | 29 lines branches/zip rb://133 This patch introduces heuristics based flushing rate of dirty pages to avoid IO bursts at checkpoint. 1) log_capacity / log_generated per second gives us number of seconds in which ALL dirty pages need to be flushed. Based on this rough assumption we can say that n_dirty_pages / (log_capacity / log_generation_rate) = desired_flush_rate 2) We use weighted averages (hard coded to 20 seconds) of log_generation_rate to avoid resonance. 3) From the desired_flush_rate we subtract the number of pages that have been flushed due to LRU flushing. That gives us pages that we should flush as part of flush_list cleanup. And that is the number (capped by maximum io_capacity) that we try to flush from the master thread. Knobs: ====== innodb_adaptive_flushing: boolean, global, dynamic, default TRUE. Since this heuristic is very experimental and has the potential to dramatically change the IO pattern I think it is a good idea to leave a knob to turn it off. Approved by: Heikki ------------------------------------------------------------------------ r5487 | calvin | 2009-07-08 12:42:28 -0400 (Wed, 08 Jul 2009) | 7 lines branches/zip: fix PAUSE instruction patch on Windows The original PAUSE instruction patch (r5470) does not compile on Windows. Also, there is an elegant way of doing it on Windows - YieldProcessor(). Approved by: Heikki (on IM) ------------------------------------------------------------------------ r5489 | vasil | 2009-07-10 05:02:22 -0400 (Fri, 10 Jul 2009) | 9 lines branches/zip: Change the defaults for innodb_sync_spin_loops: 20 -> 30 innodb_spin_wait_delay: 5 -> 6 This change was proposed by Sun/MySQL based on their performance testing, see https://svn.innodb.com/innobase/Release_tasks_for_InnoDB_Plugin_V1.0.4 ------------------------------------------------------------------------ r5490 | vasil | 2009-07-10 05:04:20 -0400 (Fri, 10 Jul 2009) | 4 lines branches/zip: Add ChangeLog entry for 5489. ------------------------------------------------------------------------ r5491 | calvin | 2009-07-10 12:19:17 -0400 (Fri, 10 Jul 2009) | 6 lines branches/zip: add copyright info to files related to PAUSE instruction patch, contributed by Sun Microsystems. ------------------------------------------------------------------------ r5492 | calvin | 2009-07-10 17:47:34 -0400 (Fri, 10 Jul 2009) | 5 lines branches/zip: add ChangeLog entries for r5484-r5486. ------------------------------------------------------------------------ r5494 | vasil | 2009-07-13 03:37:35 -0400 (Mon, 13 Jul 2009) | 6 lines branches/zip: Restore the original value of innodb_sync_spin_loops at the end, previously the test assumed that setting it to 20 will do this, but now the default is 30 and MTR's internal check failed. ------------------------------------------------------------------------ r5495 | inaam | 2009-07-13 11:48:45 -0400 (Mon, 13 Jul 2009) | 5 lines branches/zip rb://138 (REVERT) Revert the flush neighbors patch as it shows regression in the benchmarks run by Michael. ------------------------------------------------------------------------ r5496 | inaam | 2009-07-13 14:04:57 -0400 (Mon, 13 Jul 2009) | 4 lines branches/zip Fixed warnings on windows where ulint != ib_uint64_t ------------------------------------------------------------------------ r5497 | calvin | 2009-07-13 15:01:00 -0400 (Mon, 13 Jul 2009) | 9 lines branches/zip: fix run-time symbols clash on Solaris. This patch is from Sergey Vojtovich of Sun Microsystems, to fix run-time symbols clash on Solaris with older C++ compiler: - when finding out a way to hide symbols, make decision basing on compiler, not operating system. - Sun Studio supports __hidden declaration specifier for this purpose. ------------------------------------------------------------------------ r5498 | vasil | 2009-07-14 03:16:18 -0400 (Tue, 14 Jul 2009) | 92 lines branches/zip: Merge r5341:5497 from branches/5.1, skipping: c5419 because it is merge from branches/zip into branches/5.1 c5466 because the source code has been adjusted to match the MySQL behavior and the innodb-autoinc test does not fail in branches/zip, if c5466 is merged, then innodb-autoinc starts failing, Sunny suggested not to merge c5466. and resolving conflicts in c5410, c5440, c5488: ------------------------------------------------------------------------ r5410 | marko | 2009-06-24 22:26:34 +0300 (Wed, 24 Jun 2009) | 2 lines Changed paths: M /branches/5.1/include/trx0sys.ic M /branches/5.1/trx/trx0purge.c M /branches/5.1/trx/trx0sys.c M /branches/5.1/trx/trx0undo.c branches/5.1: Add missing #include "mtr0log.h" to avoid warnings when compiling with -DUNIV_MUST_NOT_INLINE. ------------------------------------------------------------------------ r5419 | marko | 2009-06-25 16:11:57 +0300 (Thu, 25 Jun 2009) | 18 lines Changed paths: M /branches/5.1/handler/ha_innodb.cc M /branches/5.1/mysql-test/innodb_bug42101-nonzero.result M /branches/5.1/mysql-test/innodb_bug42101-nonzero.test M /branches/5.1/mysql-test/innodb_bug42101.result M /branches/5.1/mysql-test/innodb_bug42101.test branches/5.1: Merge r5418 from branches/zip: ------------------------------------------------------------------------ r5418 | marko | 2009-06-25 15:55:52 +0300 (Thu, 25 Jun 2009) | 5 lines Changed paths: M /branches/zip/ChangeLog M /branches/zip/handler/ha_innodb.cc M /branches/zip/mysql-test/innodb_bug42101-nonzero.result M /branches/zip/mysql-test/innodb_bug42101-nonzero.test M /branches/zip/mysql-test/innodb_bug42101.result M /branches/zip/mysql-test/innodb_bug42101.test branches/zip: Fix a race condition caused by SET GLOBAL innodb_commit_concurrency=DEFAULT. (Bug #45749) When innodb_commit_concurrency is initially set nonzero, DEFAULT would change it back to 0, triggering Bug #42101. rb://139 approved by Heikki Tuuri. ------------------------------------------------------------------------ ------------------------------------------------------------------------ r5440 | vasil | 2009-06-30 13:04:29 +0300 (Tue, 30 Jun 2009) | 8 lines Changed paths: M /branches/5.1/fil/fil0fil.c branches/5.1: Fix Bug#45814 URL reference in InnoDB server errors needs adjusting to match documentation by changing the URL from http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting.html to http://dev.mysql.com/doc/refman/5.1/en/innodb-troubleshooting-datadict.html ------------------------------------------------------------------------ r5466 | vasil | 2009-07-02 10:46:45 +0300 (Thu, 02 Jul 2009) | 6 lines Changed paths: M /branches/5.1/mysql-test/innodb-autoinc.result M /branches/5.1/mysql-test/innodb-autoinc.test branches/5.1: Adjust the failing innodb-autoinc test to conform to the latest behavior of the MySQL code. The idea and the comment in innodb-autoinc.test come from Sunny. ------------------------------------------------------------------------ r5488 | vasil | 2009-07-09 19:16:44 +0300 (Thu, 09 Jul 2009) | 13 lines Changed paths: M /branches/5.1/handler/ha_innodb.cc A /branches/5.1/mysql-test/innodb_bug21704.result A /branches/5.1/mysql-test/innodb_bug21704.test branches/5.1: Fix Bug#21704 Renaming column does not update FK definition by checking whether a column that participates in a FK definition is being renamed and denying the ALTER in this case. The patch was originally developed by Davi Arnaut <Davi.Arnaut@Sun.COM>: http://lists.mysql.com/commits/77714 and was later adjusted to conform to InnoDB coding style by me (Vasil), I also added some more comments and moved the bug specific mysql-test to a separate file to make it more manageable and flexible. ------------------------------------------------------------------------ ------------------------------------------------------------------------ r5499 | calvin | 2009-07-14 12:55:10 -0400 (Tue, 14 Jul 2009) | 3 lines branches/zip: add a missing file in Makefile.am This change was suggested by MySQL. ------------------------------------------------------------------------ r5500 | calvin | 2009-07-14 13:03:26 -0400 (Tue, 14 Jul 2009) | 3 lines branches/zip: minor change Remove an extra "with". ------------------------------------------------------------------------ r5501 | vasil | 2009-07-14 13:58:15 -0400 (Tue, 14 Jul 2009) | 5 lines branches/zip: Add @ZLIB_INCLUDES@ so that the InnoDB Plugin picks up the same zlib.h header file that is eventually used by mysqld. ------------------------------------------------------------------------ r5502 | vasil | 2009-07-14 13:59:59 -0400 (Tue, 14 Jul 2009) | 4 lines branches/zip: Add include/ut0auxconf.h to noinst_HEADERS ------------------------------------------------------------------------ r5503 | vasil | 2009-07-14 14:16:11 -0400 (Tue, 14 Jul 2009) | 8 lines branches/zip: Non-functional change: put files in noinst_HEADERS and libinnobase_a_SOURCES one per line and sort alphabetically, so it is easier to find if a file is there or not and also diffs show exactly the added or removed file instead of surrounding lines too. ------------------------------------------------------------------------ r5504 | calvin | 2009-07-15 04:58:44 -0400 (Wed, 15 Jul 2009) | 6 lines branches/zip: fix compile errors on Win64 Both srv_read_ahead_factor and srv_io_capacity should be defined as ulong. Approved by: Sunny ------------------------------------------------------------------------ r5508 | calvin | 2009-07-16 09:40:47 -0400 (Thu, 16 Jul 2009) | 16 lines branches/zip: Support inlining of functions and prefetch with Sun Studio Those changes are contributed by Sun/MySQL. Two sets of changes in this patch when Sun Studio is used: - Explicit inlining of functions - Prefetch Support This patch has been tested by Sunny with the plugin statically built in. Since we've never built the plugin as a dynamically loaded module on Solaris, it is a separate task to change plug.in. rb://142 Approved by: Heikki ------------------------------------------------------------------------ r5509 | calvin | 2009-07-16 09:45:28 -0400 (Thu, 16 Jul 2009) | 2 lines branches/zip: add ChangeLog entry for r5508. ------------------------------------------------------------------------ r5512 | sunny | 2009-07-19 19:52:48 -0400 (Sun, 19 Jul 2009) | 2 lines branches/zip: Remove unused extern ref to timed_mutexes. ------------------------------------------------------------------------ r5513 | sunny | 2009-07-19 19:58:43 -0400 (Sun, 19 Jul 2009) | 2 lines branches/zip: Undo r5512 ------------------------------------------------------------------------ r5514 | sunny | 2009-07-19 20:08:49 -0400 (Sun, 19 Jul 2009) | 2 lines branches/zip: Only use my_bool when UNIV_HOTBACKUP is not defined. ------------------------------------------------------------------------ r5515 | sunny | 2009-07-20 03:29:14 -0400 (Mon, 20 Jul 2009) | 2 lines branches/zip: The dict_table_t::autoinc_mutex field is not used in HotBackup. ------------------------------------------------------------------------ r5516 | sunny | 2009-07-20 03:46:05 -0400 (Mon, 20 Jul 2009) | 4 lines branches/zip: Make this file usable from within HotBackup. A new file has been introduced called hb_univ.i. This file should have all the HotBackup specific configuration. ------------------------------------------------------------------------ r5517 | sunny | 2009-07-20 03:55:11 -0400 (Mon, 20 Jul 2009) | 2 lines Add /* UNIV_HOTBACK */ ------------------------------------------------------------------------ r5519 | vasil | 2009-07-20 04:45:18 -0400 (Mon, 20 Jul 2009) | 31 lines branches/zip: Merge r5497:5518 from branches/5.1: ------------------------------------------------------------------------ r5518 | vasil | 2009-07-20 11:29:47 +0300 (Mon, 20 Jul 2009) | 22 lines Changed paths: M /branches/5.1/handler/ha_innodb.cc branches/5.1: Merge a change from MySQL: ------------------------------------------------------------ revno: 2874.2.1 committer: Anurag Shekhar <anurag.shekhar@sun.com> branch nick: mysql-5.1-bugteam-windows-warning timestamp: Wed 2009-05-13 15:41:24 +0530 message: Bug #39802 On Windows, 32-bit time_t should be enforced This patch fixes compilation warning, "conversion from 'time_t' to 'ulong', possible loss of data". The fix is to typecast time_t to ulong before assigning it to ulong. Backported this from 6.0-bugteam tree. modified: storage/archive/ha_archive.cc storage/federated/ha_federated.cc storage/innobase/handler/ha_innodb.cc storage/myisam/ha_myisam.cc ------------------------------------------------------------------------ ------------------------------------------------------------------------ r5520 | vasil | 2009-07-20 04:51:47 -0400 (Mon, 20 Jul 2009) | 4 lines branches/zip: Add ChangeLog entries for r5498 and r5519. ------------------------------------------------------------------------ r5524 | inaam | 2009-07-20 12:23:15 -0400 (Mon, 20 Jul 2009) | 9 lines branches/zip Change the read ahead parameter name to innodb_read_ahead_threshold. Change the meaning of this parameter to signify the number of pages that must be sequentially accessed for InnoDB to trigger a readahead request. Suggested by: Ken ------------------------------------------------------------------------
1584 lines
55 KiB
C
1584 lines
55 KiB
C
/*****************************************************************************
|
|
|
|
Copyright (c) 1995, 2009, Innobase Oy. All Rights Reserved.
|
|
|
|
This program is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free Software
|
|
Foundation; version 2 of the License.
|
|
|
|
This program is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along with
|
|
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
*****************************************************************************/
|
|
|
|
/**************************************************//**
|
|
@file include/buf0buf.h
|
|
The database buffer pool high-level routines
|
|
|
|
Created 11/5/1995 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
#ifndef buf0buf_h
|
|
#define buf0buf_h
|
|
|
|
#include "univ.i"
|
|
#include "fil0fil.h"
|
|
#include "mtr0types.h"
|
|
#include "buf0types.h"
|
|
#include "hash0hash.h"
|
|
#include "ut0byte.h"
|
|
#include "page0types.h"
|
|
#ifndef UNIV_HOTBACKUP
|
|
#include "ut0rbt.h"
|
|
#include "os0proc.h"
|
|
|
|
/** @name Modes for buf_page_get_gen */
|
|
/* @{ */
|
|
#define BUF_GET 10 /*!< get always */
|
|
#define BUF_GET_IF_IN_POOL 11 /*!< get if in pool */
|
|
#define BUF_GET_NO_LATCH 14 /*!< get and bufferfix, but
|
|
set no latch; we have
|
|
separated this case, because
|
|
it is error-prone programming
|
|
not to set a latch, and it
|
|
should be used with care */
|
|
#define BUF_GET_IF_IN_POOL_OR_WATCH 15
|
|
/*!< Get the page only if it's in the
|
|
buffer pool, if not then set a watch
|
|
on the page. */
|
|
/* @} */
|
|
/** @name Modes for buf_page_get_known_nowait */
|
|
/* @{ */
|
|
#define BUF_MAKE_YOUNG 51 /*!< Move the block to the
|
|
start of the LRU list if there
|
|
is a danger that the block
|
|
would drift out of the buffer
|
|
pool*/
|
|
#define BUF_KEEP_OLD 52 /*!< Preserve the current LRU
|
|
position of the block. */
|
|
/* @} */
|
|
|
|
extern buf_pool_t* buf_pool; /*!< The buffer pool of the database */
|
|
#ifdef UNIV_DEBUG
|
|
extern ibool buf_debug_prints;/*!< If this is set TRUE, the program
|
|
prints info whenever read or flush
|
|
occurs */
|
|
#endif /* UNIV_DEBUG */
|
|
extern ulint srv_buf_pool_write_requests; /*!< variable to count write request
|
|
issued */
|
|
#else /* !UNIV_HOTBACKUP */
|
|
extern buf_block_t* back_block1; /*!< first block, for --apply-log */
|
|
extern buf_block_t* back_block2; /*!< second block, for page reorganize */
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
|
|
/** Magic value to use instead of checksums when they are disabled */
|
|
#define BUF_NO_CHECKSUM_MAGIC 0xDEADBEEFUL
|
|
|
|
/** @brief States of a control block
|
|
@see buf_page_struct
|
|
|
|
The enumeration values must be 0..7. */
|
|
enum buf_page_state {
|
|
BUF_BLOCK_ZIP_FREE = 0, /*!< contains a free
|
|
compressed page */
|
|
BUF_BLOCK_ZIP_PAGE, /*!< contains a clean
|
|
compressed page */
|
|
BUF_BLOCK_ZIP_DIRTY, /*!< contains a compressed
|
|
page that is in the
|
|
buf_pool->flush_list */
|
|
|
|
BUF_BLOCK_NOT_USED, /*!< is in the free list;
|
|
must be after the BUF_BLOCK_ZIP_
|
|
constants for compressed-only pages
|
|
@see buf_block_state_valid() */
|
|
BUF_BLOCK_READY_FOR_USE, /*!< when buf_LRU_get_free_block
|
|
returns a block, it is in this state */
|
|
BUF_BLOCK_FILE_PAGE, /*!< contains a buffered file page */
|
|
BUF_BLOCK_MEMORY, /*!< contains some main memory
|
|
object */
|
|
BUF_BLOCK_REMOVE_HASH /*!< hash index should be removed
|
|
before putting to the free list */
|
|
};
|
|
|
|
#ifndef UNIV_HOTBACKUP
|
|
/********************************************************************//**
|
|
Creates the buffer pool.
|
|
@return own: buf_pool object, NULL if not enough memory or error */
|
|
UNIV_INTERN
|
|
buf_pool_t*
|
|
buf_pool_init(void);
|
|
/*===============*/
|
|
/********************************************************************//**
|
|
Frees the buffer pool at shutdown. This must not be invoked before
|
|
freeing all mutexes. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_pool_free(void);
|
|
/*===============*/
|
|
|
|
/********************************************************************//**
|
|
Drops the adaptive hash index. To prevent a livelock, this function
|
|
is only to be called while holding btr_search_latch and while
|
|
btr_search_enabled == FALSE. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_pool_drop_hash_index(void);
|
|
/*==========================*/
|
|
|
|
/********************************************************************//**
|
|
Relocate a buffer control block. Relocates the block on the LRU list
|
|
and in buf_pool->page_hash. Does not relocate bpage->list.
|
|
The caller must take care of relocating bpage->list. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_relocate(
|
|
/*=========*/
|
|
buf_page_t* bpage, /*!< in/out: control block being relocated;
|
|
buf_page_get_state(bpage) must be
|
|
BUF_BLOCK_ZIP_DIRTY or BUF_BLOCK_ZIP_PAGE */
|
|
buf_page_t* dpage) /*!< in/out: destination control block */
|
|
__attribute__((nonnull));
|
|
/********************************************************************//**
|
|
Resizes the buffer pool. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_pool_resize(void);
|
|
/*=================*/
|
|
/*********************************************************************//**
|
|
Gets the current size of buffer buf_pool in bytes.
|
|
@return size in bytes */
|
|
UNIV_INLINE
|
|
ulint
|
|
buf_pool_get_curr_size(void);
|
|
/*========================*/
|
|
/********************************************************************//**
|
|
Gets the smallest oldest_modification lsn for any page in the pool. Returns
|
|
zero if all modified pages have been flushed to disk.
|
|
@return oldest modification in pool, zero if none */
|
|
UNIV_INLINE
|
|
ib_uint64_t
|
|
buf_pool_get_oldest_modification(void);
|
|
/*==================================*/
|
|
/********************************************************************//**
|
|
Allocates a buffer block.
|
|
@return own: the allocated block, in state BUF_BLOCK_MEMORY */
|
|
UNIV_INLINE
|
|
buf_block_t*
|
|
buf_block_alloc(
|
|
/*============*/
|
|
ulint zip_size); /*!< in: compressed page size in bytes,
|
|
or 0 if uncompressed tablespace */
|
|
/********************************************************************//**
|
|
Frees a buffer block which does not contain a file page. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_block_free(
|
|
/*===========*/
|
|
buf_block_t* block); /*!< in, own: block to be freed */
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
/*********************************************************************//**
|
|
Copies contents of a buffer frame to a given buffer.
|
|
@return buf */
|
|
UNIV_INLINE
|
|
byte*
|
|
buf_frame_copy(
|
|
/*===========*/
|
|
byte* buf, /*!< in: buffer to copy to */
|
|
const buf_frame_t* frame); /*!< in: buffer frame */
|
|
#ifndef UNIV_HOTBACKUP
|
|
/**************************************************************//**
|
|
NOTE! The following macros should be used instead of buf_page_get_gen,
|
|
to improve debugging. Only values RW_S_LATCH and RW_X_LATCH are allowed
|
|
in LA! */
|
|
#define buf_page_get(SP, ZS, OF, LA, MTR) buf_page_get_gen(\
|
|
SP, ZS, OF, LA, NULL,\
|
|
BUF_GET, __FILE__, __LINE__, MTR)
|
|
/**************************************************************//**
|
|
Use these macros to bufferfix a page with no latching. Remember not to
|
|
read the contents of the page unless you know it is safe. Do not modify
|
|
the contents of the page! We have separated this case, because it is
|
|
error-prone programming not to set a latch, and it should be used
|
|
with care. */
|
|
#define buf_page_get_with_no_latch(SP, ZS, OF, MTR) buf_page_get_gen(\
|
|
SP, ZS, OF, RW_NO_LATCH, NULL,\
|
|
BUF_GET_NO_LATCH, __FILE__, __LINE__, MTR)
|
|
/**************************************************************//**
|
|
NOTE! The following macros should be used instead of
|
|
buf_page_optimistic_get_func, to improve debugging. Only values RW_S_LATCH and
|
|
RW_X_LATCH are allowed as LA! */
|
|
#define buf_page_optimistic_get(LA, BL, MC, MTR) \
|
|
buf_page_optimistic_get_func(LA, BL, MC, __FILE__, __LINE__, MTR)
|
|
/********************************************************************//**
|
|
This is the general function used to get optimistic access to a database
|
|
page.
|
|
@return TRUE if success */
|
|
UNIV_INTERN
|
|
ibool
|
|
buf_page_optimistic_get_func(
|
|
/*=========================*/
|
|
ulint rw_latch,/*!< in: RW_S_LATCH, RW_X_LATCH */
|
|
buf_block_t* block, /*!< in: guessed block */
|
|
ib_uint64_t modify_clock,/*!< in: modify clock value if mode is
|
|
..._GUESS_ON_CLOCK */
|
|
const char* file, /*!< in: file name */
|
|
ulint line, /*!< in: line where called */
|
|
mtr_t* mtr); /*!< in: mini-transaction */
|
|
/********************************************************************//**
|
|
This is used to get access to a known database page, when no waiting can be
|
|
done.
|
|
@return TRUE if success */
|
|
UNIV_INTERN
|
|
ibool
|
|
buf_page_get_known_nowait(
|
|
/*======================*/
|
|
ulint rw_latch,/*!< in: RW_S_LATCH, RW_X_LATCH */
|
|
buf_block_t* block, /*!< in: the known page */
|
|
ulint mode, /*!< in: BUF_MAKE_YOUNG or BUF_KEEP_OLD */
|
|
const char* file, /*!< in: file name */
|
|
ulint line, /*!< in: line where called */
|
|
mtr_t* mtr); /*!< in: mini-transaction */
|
|
|
|
/*******************************************************************//**
|
|
Given a tablespace id and page number tries to get that page. If the
|
|
page is not in the buffer pool it is not loaded and NULL is returned.
|
|
Suitable for using when holding the kernel mutex. */
|
|
UNIV_INTERN
|
|
const buf_block_t*
|
|
buf_page_try_get_func(
|
|
/*==================*/
|
|
ulint space_id,/*!< in: tablespace id */
|
|
ulint page_no,/*!< in: page number */
|
|
const char* file, /*!< in: file name */
|
|
ulint line, /*!< in: line where called */
|
|
mtr_t* mtr); /*!< in: mini-transaction */
|
|
|
|
/** Tries to get a page. If the page is not in the buffer pool it is
|
|
not loaded. Suitable for using when holding the kernel mutex.
|
|
@param space_id in: tablespace id
|
|
@param page_no in: page number
|
|
@param mtr in: mini-transaction
|
|
@return the page if in buffer pool, NULL if not */
|
|
#define buf_page_try_get(space_id, page_no, mtr) \
|
|
buf_page_try_get_func(space_id, page_no, __FILE__, __LINE__, mtr);
|
|
|
|
/********************************************************************//**
|
|
Get read access to a compressed page (usually of type
|
|
FIL_PAGE_TYPE_ZBLOB or FIL_PAGE_TYPE_ZBLOB2).
|
|
The page must be released with buf_page_release_zip().
|
|
NOTE: the page is not protected by any latch. Mutual exclusion has to
|
|
be implemented at a higher level. In other words, all possible
|
|
accesses to a given page through this function must be protected by
|
|
the same set of mutexes or latches.
|
|
@return pointer to the block, or NULL if not compressed */
|
|
UNIV_INTERN
|
|
buf_page_t*
|
|
buf_page_get_zip(
|
|
/*=============*/
|
|
ulint space, /*!< in: space id */
|
|
ulint zip_size,/*!< in: compressed page size */
|
|
ulint offset);/*!< in: page number */
|
|
/********************************************************************//**
|
|
This is the general function used to get access to a database page.
|
|
@return pointer to the block or NULL */
|
|
UNIV_INTERN
|
|
buf_block_t*
|
|
buf_page_get_gen(
|
|
/*=============*/
|
|
ulint space, /*!< in: space id */
|
|
ulint zip_size,/*!< in: compressed page size in bytes
|
|
or 0 for uncompressed pages */
|
|
ulint offset, /*!< in: page number */
|
|
ulint rw_latch,/*!< in: RW_S_LATCH, RW_X_LATCH, RW_NO_LATCH */
|
|
buf_block_t* guess, /*!< in: guessed block or NULL */
|
|
ulint mode, /*!< in: BUF_GET, BUF_GET_IF_IN_POOL,
|
|
BUF_GET_NO_LATCH, BUF_GET_NOWAIT or
|
|
BUF_GET_IF_IN_POOL_WATCH */
|
|
const char* file, /*!< in: file name */
|
|
ulint line, /*!< in: line where called */
|
|
mtr_t* mtr); /*!< in: mini-transaction */
|
|
/********************************************************************//**
|
|
Initializes a page to the buffer buf_pool. The page is usually not read
|
|
from a file even if it cannot be found in the buffer buf_pool. This is one
|
|
of the functions which perform to a block a state transition NOT_USED =>
|
|
FILE_PAGE (the other is buf_page_get_gen).
|
|
@return pointer to the block, page bufferfixed */
|
|
UNIV_INTERN
|
|
buf_block_t*
|
|
buf_page_create(
|
|
/*============*/
|
|
ulint space, /*!< in: space id */
|
|
ulint offset, /*!< in: offset of the page within space in units of
|
|
a page */
|
|
ulint zip_size,/*!< in: compressed page size, or 0 */
|
|
mtr_t* mtr); /*!< in: mini-transaction handle */
|
|
#else /* !UNIV_HOTBACKUP */
|
|
/********************************************************************//**
|
|
Inits a page to the buffer buf_pool, for use in ibbackup --restore. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_page_init_for_backup_restore(
|
|
/*=============================*/
|
|
ulint space, /*!< in: space id */
|
|
ulint offset, /*!< in: offset of the page within space
|
|
in units of a page */
|
|
ulint zip_size,/*!< in: compressed page size in bytes
|
|
or 0 for uncompressed pages */
|
|
buf_block_t* block); /*!< in: block to init */
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
|
|
#ifndef UNIV_HOTBACKUP
|
|
/********************************************************************//**
|
|
Releases a compressed-only page acquired with buf_page_get_zip(). */
|
|
UNIV_INLINE
|
|
void
|
|
buf_page_release_zip(
|
|
/*=================*/
|
|
buf_page_t* bpage); /*!< in: buffer block */
|
|
/********************************************************************//**
|
|
Decrements the bufferfix count of a buffer control block and releases
|
|
a latch, if specified. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_page_release(
|
|
/*=============*/
|
|
buf_block_t* block, /*!< in: buffer block */
|
|
ulint rw_latch, /*!< in: RW_S_LATCH, RW_X_LATCH,
|
|
RW_NO_LATCH */
|
|
mtr_t* mtr); /*!< in: mtr */
|
|
/********************************************************************//**
|
|
Moves a page to the start of the buffer pool LRU list. This high-level
|
|
function can be used to prevent an important page from from slipping out of
|
|
the buffer pool. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_page_make_young(
|
|
/*================*/
|
|
buf_page_t* bpage); /*!< in: buffer block of a file page */
|
|
/********************************************************************//**
|
|
Returns TRUE if the page can be found in the buffer pool hash table.
|
|
|
|
NOTE that it is possible that the page is not yet read from disk,
|
|
though.
|
|
|
|
@return TRUE if found in the page hash table */
|
|
UNIV_INLINE
|
|
ibool
|
|
buf_page_peek(
|
|
/*==========*/
|
|
ulint space, /*!< in: space id */
|
|
ulint offset);/*!< in: page number */
|
|
/********************************************************************//**
|
|
Resets the check_index_page_at_flush field of a page if found in the buffer
|
|
pool. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_reset_check_index_page_at_flush(
|
|
/*================================*/
|
|
ulint space, /*!< in: space id */
|
|
ulint offset);/*!< in: page number */
|
|
#ifdef UNIV_DEBUG_FILE_ACCESSES
|
|
/********************************************************************//**
|
|
Sets file_page_was_freed TRUE if the page is found in the buffer pool.
|
|
This function should be called when we free a file page and want the
|
|
debug version to check that it is not accessed any more unless
|
|
reallocated.
|
|
@return control block if found in page hash table, otherwise NULL */
|
|
UNIV_INTERN
|
|
buf_page_t*
|
|
buf_page_set_file_page_was_freed(
|
|
/*=============================*/
|
|
ulint space, /*!< in: space id */
|
|
ulint offset);/*!< in: page number */
|
|
/********************************************************************//**
|
|
Sets file_page_was_freed FALSE if the page is found in the buffer pool.
|
|
This function should be called when we free a file page and want the
|
|
debug version to check that it is not accessed any more unless
|
|
reallocated.
|
|
@return control block if found in page hash table, otherwise NULL */
|
|
UNIV_INTERN
|
|
buf_page_t*
|
|
buf_page_reset_file_page_was_freed(
|
|
/*===============================*/
|
|
ulint space, /*!< in: space id */
|
|
ulint offset); /*!< in: page number */
|
|
#endif /* UNIV_DEBUG_FILE_ACCESSES */
|
|
/********************************************************************//**
|
|
Reads the freed_page_clock of a buffer block.
|
|
@return freed_page_clock */
|
|
UNIV_INLINE
|
|
ulint
|
|
buf_page_get_freed_page_clock(
|
|
/*==========================*/
|
|
const buf_page_t* bpage) /*!< in: block */
|
|
__attribute__((pure));
|
|
/********************************************************************//**
|
|
Reads the freed_page_clock of a buffer block.
|
|
@return freed_page_clock */
|
|
UNIV_INLINE
|
|
ulint
|
|
buf_block_get_freed_page_clock(
|
|
/*===========================*/
|
|
const buf_block_t* block) /*!< in: block */
|
|
__attribute__((pure));
|
|
|
|
/********************************************************************//**
|
|
Recommends a move of a block to the start of the LRU list if there is danger
|
|
of dropping from the buffer pool. NOTE: does not reserve the buffer pool
|
|
mutex.
|
|
@return TRUE if should be made younger */
|
|
UNIV_INLINE
|
|
ibool
|
|
buf_page_peek_if_too_old(
|
|
/*=====================*/
|
|
const buf_page_t* bpage); /*!< in: block to make younger */
|
|
/********************************************************************//**
|
|
Returns the current state of is_hashed of a page. FALSE if the page is
|
|
not in the pool. NOTE that this operation does not fix the page in the
|
|
pool if it is found there.
|
|
@return TRUE if page hash index is built in search system */
|
|
UNIV_INTERN
|
|
ibool
|
|
buf_page_peek_if_search_hashed(
|
|
/*===========================*/
|
|
ulint space, /*!< in: space id */
|
|
ulint offset);/*!< in: page number */
|
|
/********************************************************************//**
|
|
Gets the youngest modification log sequence number for a frame.
|
|
Returns zero if not file page or no modification occurred yet.
|
|
@return newest modification to page */
|
|
UNIV_INLINE
|
|
ib_uint64_t
|
|
buf_page_get_newest_modification(
|
|
/*=============================*/
|
|
const buf_page_t* bpage); /*!< in: block containing the
|
|
page frame */
|
|
/********************************************************************//**
|
|
Increments the modify clock of a frame by 1. The caller must (1) own the
|
|
buf_pool mutex and block bufferfix count has to be zero, (2) or own an x-lock
|
|
on the block. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_block_modify_clock_inc(
|
|
/*=======================*/
|
|
buf_block_t* block); /*!< in: block */
|
|
/********************************************************************//**
|
|
Returns the value of the modify clock. The caller must have an s-lock
|
|
or x-lock on the block.
|
|
@return value */
|
|
UNIV_INLINE
|
|
ib_uint64_t
|
|
buf_block_get_modify_clock(
|
|
/*=======================*/
|
|
buf_block_t* block); /*!< in: block */
|
|
#else /* !UNIV_HOTBACKUP */
|
|
# define buf_block_modify_clock_inc(block) ((void) 0)
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
/********************************************************************//**
|
|
Calculates a page checksum which is stored to the page when it is written
|
|
to a file. Note that we must be careful to calculate the same value
|
|
on 32-bit and 64-bit architectures.
|
|
@return checksum */
|
|
UNIV_INTERN
|
|
ulint
|
|
buf_calc_page_new_checksum(
|
|
/*=======================*/
|
|
const byte* page); /*!< in: buffer page */
|
|
/********************************************************************//**
|
|
In versions < 4.0.14 and < 4.1.1 there was a bug that the checksum only
|
|
looked at the first few bytes of the page. This calculates that old
|
|
checksum.
|
|
NOTE: we must first store the new formula checksum to
|
|
FIL_PAGE_SPACE_OR_CHKSUM before calculating and storing this old checksum
|
|
because this takes that field as an input!
|
|
@return checksum */
|
|
UNIV_INTERN
|
|
ulint
|
|
buf_calc_page_old_checksum(
|
|
/*=======================*/
|
|
const byte* page); /*!< in: buffer page */
|
|
/********************************************************************//**
|
|
Checks if a page is corrupt.
|
|
@return TRUE if corrupted */
|
|
UNIV_INTERN
|
|
ibool
|
|
buf_page_is_corrupted(
|
|
/*==================*/
|
|
const byte* read_buf, /*!< in: a database page */
|
|
ulint zip_size); /*!< in: size of compressed page;
|
|
0 for uncompressed pages */
|
|
#ifndef UNIV_HOTBACKUP
|
|
/**********************************************************************//**
|
|
Gets the space id, page offset, and byte offset within page of a
|
|
pointer pointing to a buffer frame containing a file page. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_ptr_get_fsp_addr(
|
|
/*=================*/
|
|
const void* ptr, /*!< in: pointer to a buffer frame */
|
|
ulint* space, /*!< out: space id */
|
|
fil_addr_t* addr); /*!< out: page offset and byte offset */
|
|
/**********************************************************************//**
|
|
Gets the hash value of a block. This can be used in searches in the
|
|
lock hash table.
|
|
@return lock hash value */
|
|
UNIV_INLINE
|
|
ulint
|
|
buf_block_get_lock_hash_val(
|
|
/*========================*/
|
|
const buf_block_t* block) /*!< in: block */
|
|
__attribute__((pure));
|
|
#ifdef UNIV_DEBUG
|
|
/*********************************************************************//**
|
|
Finds a block in the buffer pool that points to a
|
|
given compressed page.
|
|
@return buffer block pointing to the compressed page, or NULL */
|
|
UNIV_INTERN
|
|
buf_block_t*
|
|
buf_pool_contains_zip(
|
|
/*==================*/
|
|
const void* data); /*!< in: pointer to compressed page */
|
|
#endif /* UNIV_DEBUG */
|
|
#if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
|
|
/*********************************************************************//**
|
|
Validates the buffer pool data structure.
|
|
@return TRUE */
|
|
UNIV_INTERN
|
|
ibool
|
|
buf_validate(void);
|
|
/*==============*/
|
|
#endif /* UNIV_DEBUG || UNIV_BUF_DEBUG */
|
|
#if defined UNIV_DEBUG_PRINT || defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
|
|
/*********************************************************************//**
|
|
Prints info of the buffer pool data structure. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_print(void);
|
|
/*============*/
|
|
#endif /* UNIV_DEBUG_PRINT || UNIV_DEBUG || UNIV_BUF_DEBUG */
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
/********************************************************************//**
|
|
Prints a page to stderr. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_page_print(
|
|
/*===========*/
|
|
const byte* read_buf, /*!< in: a database page */
|
|
ulint zip_size); /*!< in: compressed page size, or
|
|
0 for uncompressed pages */
|
|
/********************************************************************//**
|
|
Decompress a block.
|
|
@return TRUE if successful */
|
|
UNIV_INTERN
|
|
ibool
|
|
buf_zip_decompress(
|
|
/*===============*/
|
|
buf_block_t* block, /*!< in/out: block */
|
|
ibool check); /*!< in: TRUE=verify the page checksum */
|
|
#ifndef UNIV_HOTBACKUP
|
|
#ifdef UNIV_DEBUG
|
|
/*********************************************************************//**
|
|
Returns the number of latched pages in the buffer pool.
|
|
@return number of latched pages */
|
|
UNIV_INTERN
|
|
ulint
|
|
buf_get_latched_pages_number(void);
|
|
/*==============================*/
|
|
#endif /* UNIV_DEBUG */
|
|
/*********************************************************************//**
|
|
Returns the number of pending buf pool ios.
|
|
@return number of pending I/O operations */
|
|
UNIV_INTERN
|
|
ulint
|
|
buf_get_n_pending_ios(void);
|
|
/*=======================*/
|
|
/*********************************************************************//**
|
|
Prints info of the buffer i/o. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_print_io(
|
|
/*=========*/
|
|
FILE* file); /*!< in: file where to print */
|
|
/*********************************************************************//**
|
|
Returns the ratio in percents of modified pages in the buffer pool /
|
|
database pages in the buffer pool.
|
|
@return modified page percentage ratio */
|
|
UNIV_INTERN
|
|
ulint
|
|
buf_get_modified_ratio_pct(void);
|
|
/*============================*/
|
|
/**********************************************************************//**
|
|
Refreshes the statistics used to print per-second averages. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_refresh_io_stats(void);
|
|
/*======================*/
|
|
/*********************************************************************//**
|
|
Asserts that all file pages in the buffer are in a replaceable state.
|
|
@return TRUE */
|
|
UNIV_INTERN
|
|
ibool
|
|
buf_all_freed(void);
|
|
/*===============*/
|
|
/*********************************************************************//**
|
|
Checks that there currently are no pending i/o-operations for the buffer
|
|
pool.
|
|
@return TRUE if there is no pending i/o */
|
|
UNIV_INTERN
|
|
ibool
|
|
buf_pool_check_no_pending_io(void);
|
|
/*==============================*/
|
|
/*********************************************************************//**
|
|
Invalidates the file pages in the buffer pool when an archive recovery is
|
|
completed. All the file pages buffered must be in a replaceable state when
|
|
this function is called: not latched and not modified. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_pool_invalidate(void);
|
|
/*=====================*/
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
|
|
/*========================================================================
|
|
--------------------------- LOWER LEVEL ROUTINES -------------------------
|
|
=========================================================================*/
|
|
|
|
#ifdef UNIV_SYNC_DEBUG
|
|
/*********************************************************************//**
|
|
Adds latch level info for the rw-lock protecting the buffer frame. This
|
|
should be called in the debug version after a successful latching of a
|
|
page if we know the latching order level of the acquired latch. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_block_dbg_add_level(
|
|
/*====================*/
|
|
buf_block_t* block, /*!< in: buffer page
|
|
where we have acquired latch */
|
|
ulint level); /*!< in: latching order level */
|
|
#else /* UNIV_SYNC_DEBUG */
|
|
# define buf_block_dbg_add_level(block, level) /* nothing */
|
|
#endif /* UNIV_SYNC_DEBUG */
|
|
/*********************************************************************//**
|
|
Gets the state of a block.
|
|
@return state */
|
|
UNIV_INLINE
|
|
enum buf_page_state
|
|
buf_page_get_state(
|
|
/*===============*/
|
|
const buf_page_t* bpage); /*!< in: pointer to the control block */
|
|
/*********************************************************************//**
|
|
Gets the state of a block.
|
|
@return state */
|
|
UNIV_INLINE
|
|
enum buf_page_state
|
|
buf_block_get_state(
|
|
/*================*/
|
|
const buf_block_t* block) /*!< in: pointer to the control block */
|
|
__attribute__((pure));
|
|
/*********************************************************************//**
|
|
Sets the state of a block. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_page_set_state(
|
|
/*===============*/
|
|
buf_page_t* bpage, /*!< in/out: pointer to control block */
|
|
enum buf_page_state state); /*!< in: state */
|
|
/*********************************************************************//**
|
|
Sets the state of a block. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_block_set_state(
|
|
/*================*/
|
|
buf_block_t* block, /*!< in/out: pointer to control block */
|
|
enum buf_page_state state); /*!< in: state */
|
|
/*********************************************************************//**
|
|
Determines if a block is mapped to a tablespace.
|
|
@return TRUE if mapped */
|
|
UNIV_INLINE
|
|
ibool
|
|
buf_page_in_file(
|
|
/*=============*/
|
|
const buf_page_t* bpage) /*!< in: pointer to control block */
|
|
__attribute__((pure));
|
|
#ifndef UNIV_HOTBACKUP
|
|
/*********************************************************************//**
|
|
Determines if a block should be on unzip_LRU list.
|
|
@return TRUE if block belongs to unzip_LRU */
|
|
UNIV_INLINE
|
|
ibool
|
|
buf_page_belongs_to_unzip_LRU(
|
|
/*==========================*/
|
|
const buf_page_t* bpage) /*!< in: pointer to control block */
|
|
__attribute__((pure));
|
|
/*********************************************************************//**
|
|
Determine the approximate LRU list position of a block.
|
|
@return LRU list position */
|
|
UNIV_INLINE
|
|
ulint
|
|
buf_page_get_LRU_position(
|
|
/*======================*/
|
|
const buf_page_t* bpage) /*!< in: control block */
|
|
__attribute__((pure));
|
|
|
|
/*********************************************************************//**
|
|
Gets the mutex of a block.
|
|
@return pointer to mutex protecting bpage */
|
|
UNIV_INLINE
|
|
mutex_t*
|
|
buf_page_get_mutex(
|
|
/*===============*/
|
|
const buf_page_t* bpage) /*!< in: pointer to control block */
|
|
__attribute__((pure));
|
|
|
|
/*********************************************************************//**
|
|
Get the flush type of a page.
|
|
@return flush type */
|
|
UNIV_INLINE
|
|
enum buf_flush
|
|
buf_page_get_flush_type(
|
|
/*====================*/
|
|
const buf_page_t* bpage) /*!< in: buffer page */
|
|
__attribute__((pure));
|
|
/*********************************************************************//**
|
|
Set the flush type of a page. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_page_set_flush_type(
|
|
/*====================*/
|
|
buf_page_t* bpage, /*!< in: buffer page */
|
|
enum buf_flush flush_type); /*!< in: flush type */
|
|
/*********************************************************************//**
|
|
Map a block to a file page. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_block_set_file_page(
|
|
/*====================*/
|
|
buf_block_t* block, /*!< in/out: pointer to control block */
|
|
ulint space, /*!< in: tablespace id */
|
|
ulint page_no);/*!< in: page number */
|
|
/*********************************************************************//**
|
|
Gets the io_fix state of a block.
|
|
@return io_fix state */
|
|
UNIV_INLINE
|
|
enum buf_io_fix
|
|
buf_page_get_io_fix(
|
|
/*================*/
|
|
const buf_page_t* bpage) /*!< in: pointer to the control block */
|
|
__attribute__((pure));
|
|
/*********************************************************************//**
|
|
Gets the io_fix state of a block.
|
|
@return io_fix state */
|
|
UNIV_INLINE
|
|
enum buf_io_fix
|
|
buf_block_get_io_fix(
|
|
/*================*/
|
|
const buf_block_t* block) /*!< in: pointer to the control block */
|
|
__attribute__((pure));
|
|
/*********************************************************************//**
|
|
Sets the io_fix state of a block. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_page_set_io_fix(
|
|
/*================*/
|
|
buf_page_t* bpage, /*!< in/out: control block */
|
|
enum buf_io_fix io_fix);/*!< in: io_fix state */
|
|
/*********************************************************************//**
|
|
Sets the io_fix state of a block. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_block_set_io_fix(
|
|
/*=================*/
|
|
buf_block_t* block, /*!< in/out: control block */
|
|
enum buf_io_fix io_fix);/*!< in: io_fix state */
|
|
|
|
/********************************************************************//**
|
|
Determine if a buffer block can be relocated in memory. The block
|
|
can be dirty, but it must not be I/O-fixed or bufferfixed. */
|
|
UNIV_INLINE
|
|
ibool
|
|
buf_page_can_relocate(
|
|
/*==================*/
|
|
const buf_page_t* bpage) /*!< control block being relocated */
|
|
__attribute__((pure));
|
|
|
|
/*********************************************************************//**
|
|
Determine if a block has been flagged old.
|
|
@return TRUE if old */
|
|
UNIV_INLINE
|
|
ibool
|
|
buf_page_is_old(
|
|
/*============*/
|
|
const buf_page_t* bpage) /*!< in: control block */
|
|
__attribute__((pure));
|
|
/*********************************************************************//**
|
|
Flag a block old. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_page_set_old(
|
|
/*=============*/
|
|
buf_page_t* bpage, /*!< in/out: control block */
|
|
ibool old); /*!< in: old */
|
|
/*********************************************************************//**
|
|
Determine if a block has been accessed in the buffer pool.
|
|
@return TRUE if accessed */
|
|
UNIV_INLINE
|
|
ibool
|
|
buf_page_is_accessed(
|
|
/*=================*/
|
|
const buf_page_t* bpage) /*!< in: control block */
|
|
__attribute__((pure));
|
|
/*********************************************************************//**
|
|
Flag a block accessed. */
|
|
UNIV_INLINE
|
|
void
|
|
buf_page_set_accessed(
|
|
/*==================*/
|
|
buf_page_t* bpage, /*!< in/out: control block */
|
|
ibool accessed); /*!< in: accessed */
|
|
/*********************************************************************//**
|
|
Gets the buf_block_t handle of a buffered file block if an uncompressed
|
|
page frame exists, or NULL.
|
|
@return control block, or NULL */
|
|
UNIV_INLINE
|
|
buf_block_t*
|
|
buf_page_get_block(
|
|
/*===============*/
|
|
buf_page_t* bpage) /*!< in: control block, or NULL */
|
|
__attribute__((pure));
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
#ifdef UNIV_DEBUG
|
|
/*********************************************************************//**
|
|
Gets a pointer to the memory frame of a block.
|
|
@return pointer to the frame */
|
|
UNIV_INLINE
|
|
buf_frame_t*
|
|
buf_block_get_frame(
|
|
/*================*/
|
|
const buf_block_t* block) /*!< in: pointer to the control block */
|
|
__attribute__((pure));
|
|
#else /* UNIV_DEBUG */
|
|
# define buf_block_get_frame(block) (block)->frame
|
|
#endif /* UNIV_DEBUG */
|
|
/*********************************************************************//**
|
|
Gets the space id of a block.
|
|
@return space id */
|
|
UNIV_INLINE
|
|
ulint
|
|
buf_page_get_space(
|
|
/*===============*/
|
|
const buf_page_t* bpage) /*!< in: pointer to the control block */
|
|
__attribute__((pure));
|
|
/*********************************************************************//**
|
|
Gets the space id of a block.
|
|
@return space id */
|
|
UNIV_INLINE
|
|
ulint
|
|
buf_block_get_space(
|
|
/*================*/
|
|
const buf_block_t* block) /*!< in: pointer to the control block */
|
|
__attribute__((pure));
|
|
/*********************************************************************//**
|
|
Gets the page number of a block.
|
|
@return page number */
|
|
UNIV_INLINE
|
|
ulint
|
|
buf_page_get_page_no(
|
|
/*=================*/
|
|
const buf_page_t* bpage) /*!< in: pointer to the control block */
|
|
__attribute__((pure));
|
|
/*********************************************************************//**
|
|
Gets the page number of a block.
|
|
@return page number */
|
|
UNIV_INLINE
|
|
ulint
|
|
buf_block_get_page_no(
|
|
/*==================*/
|
|
const buf_block_t* block) /*!< in: pointer to the control block */
|
|
__attribute__((pure));
|
|
/*********************************************************************//**
|
|
Gets the compressed page size of a block.
|
|
@return compressed page size, or 0 */
|
|
UNIV_INLINE
|
|
ulint
|
|
buf_page_get_zip_size(
|
|
/*==================*/
|
|
const buf_page_t* bpage) /*!< in: pointer to the control block */
|
|
__attribute__((pure));
|
|
/*********************************************************************//**
|
|
Gets the compressed page size of a block.
|
|
@return compressed page size, or 0 */
|
|
UNIV_INLINE
|
|
ulint
|
|
buf_block_get_zip_size(
|
|
/*===================*/
|
|
const buf_block_t* block) /*!< in: pointer to the control block */
|
|
__attribute__((pure));
|
|
/*********************************************************************//**
|
|
Gets the compressed page descriptor corresponding to an uncompressed page
|
|
if applicable. */
|
|
#define buf_block_get_page_zip(block) \
|
|
(UNIV_LIKELY_NULL((block)->page.zip.data) ? &(block)->page.zip : NULL)
|
|
#ifndef UNIV_HOTBACKUP
|
|
/*******************************************************************//**
|
|
Gets the block to whose frame the pointer is pointing to.
|
|
@return pointer to block, never NULL */
|
|
UNIV_INTERN
|
|
buf_block_t*
|
|
buf_block_align(
|
|
/*============*/
|
|
const byte* ptr); /*!< in: pointer to a frame */
|
|
/********************************************************************//**
|
|
Find out if a pointer belongs to a buf_block_t. It can be a pointer to
|
|
the buf_block_t itself or a member of it
|
|
@return TRUE if ptr belongs to a buf_block_t struct */
|
|
UNIV_INTERN
|
|
ibool
|
|
buf_pointer_is_block_field(
|
|
/*=======================*/
|
|
const void* ptr); /*!< in: pointer not
|
|
dereferenced */
|
|
/** Find out if a pointer corresponds to a buf_block_t::mutex.
|
|
@param m in: mutex candidate
|
|
@return TRUE if m is a buf_block_t::mutex */
|
|
#define buf_pool_is_block_mutex(m) \
|
|
buf_pointer_is_block_field((const void*)(m))
|
|
/** Find out if a pointer corresponds to a buf_block_t::lock.
|
|
@param l in: rw-lock candidate
|
|
@return TRUE if l is a buf_block_t::lock */
|
|
#define buf_pool_is_block_lock(l) \
|
|
buf_pointer_is_block_field((const void*)(l))
|
|
|
|
#if defined UNIV_DEBUG || defined UNIV_ZIP_DEBUG
|
|
/*********************************************************************//**
|
|
Gets the compressed page descriptor corresponding to an uncompressed page
|
|
if applicable.
|
|
@return compressed page descriptor, or NULL */
|
|
UNIV_INLINE
|
|
const page_zip_des_t*
|
|
buf_frame_get_page_zip(
|
|
/*===================*/
|
|
const byte* ptr); /*!< in: pointer to the page */
|
|
#endif /* UNIV_DEBUG || UNIV_ZIP_DEBUG */
|
|
/********************************************************************//**
|
|
Function which inits a page for read to the buffer buf_pool. If the page is
|
|
(1) already in buf_pool, or
|
|
(2) if we specify to read only ibuf pages and the page is not an ibuf page, or
|
|
(3) if the space is deleted or being deleted,
|
|
then this function does nothing.
|
|
Sets the io_fix flag to BUF_IO_READ and sets a non-recursive exclusive lock
|
|
on the buffer frame. The io-handler must take care that the flag is cleared
|
|
and the lock released later.
|
|
@return pointer to the block or NULL */
|
|
UNIV_INTERN
|
|
buf_page_t*
|
|
buf_page_init_for_read(
|
|
/*===================*/
|
|
ulint* err, /*!< out: DB_SUCCESS or DB_TABLESPACE_DELETED */
|
|
ulint mode, /*!< in: BUF_READ_IBUF_PAGES_ONLY, ... */
|
|
ulint space, /*!< in: space id */
|
|
ulint zip_size,/*!< in: compressed page size, or 0 */
|
|
ibool unzip, /*!< in: TRUE=request uncompressed page */
|
|
ib_int64_t tablespace_version,/*!< in: prevents reading from a wrong
|
|
version of the tablespace in case we have done
|
|
DISCARD + IMPORT */
|
|
ulint offset);/*!< in: page number */
|
|
/********************************************************************//**
|
|
Completes an asynchronous read or write request of a file page to or from
|
|
the buffer pool. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_page_io_complete(
|
|
/*=================*/
|
|
buf_page_t* bpage); /*!< in: pointer to the block in question */
|
|
/********************************************************************//**
|
|
Calculates a folded value of a file page address to use in the page hash
|
|
table.
|
|
@return the folded value */
|
|
UNIV_INLINE
|
|
ulint
|
|
buf_page_address_fold(
|
|
/*==================*/
|
|
ulint space, /*!< in: space id */
|
|
ulint offset) /*!< in: offset of the page within space */
|
|
__attribute__((const));
|
|
/******************************************************************//**
|
|
Returns the control block of a file page, NULL if not found.
|
|
@return block, NULL if not found */
|
|
UNIV_INLINE
|
|
buf_page_t*
|
|
buf_page_hash_get(
|
|
/*==============*/
|
|
ulint space, /*!< in: space id */
|
|
ulint offset);/*!< in: offset of the page within space */
|
|
/******************************************************************//**
|
|
Returns the control block of a file page, NULL if not found
|
|
or an uncompressed page frame does not exist.
|
|
@return block, NULL if not found */
|
|
UNIV_INLINE
|
|
buf_block_t*
|
|
buf_block_hash_get(
|
|
/*===============*/
|
|
ulint space, /*!< in: space id */
|
|
ulint offset);/*!< in: offset of the page within space */
|
|
/*******************************************************************//**
|
|
Increments the pool clock by one and returns its new value. Remember that
|
|
in the 32 bit version the clock wraps around at 4 billion!
|
|
@return new clock value */
|
|
UNIV_INLINE
|
|
ulint
|
|
buf_pool_clock_tic(void);
|
|
/*====================*/
|
|
/*********************************************************************//**
|
|
Gets the current length of the free list of buffer blocks.
|
|
@return length of the free list */
|
|
UNIV_INTERN
|
|
ulint
|
|
buf_get_free_list_len(void);
|
|
/*=======================*/
|
|
/********************************************************************
|
|
Stop watching if the marked page is read in. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_pool_watch_clear(void);
|
|
/*======================*/
|
|
/************************************************************************
|
|
Set watch occurred flag. */
|
|
UNIV_INTERN
|
|
void
|
|
buf_pool_watch_notify(
|
|
/*==================*/
|
|
ulint space, /*!< in: space id of page read in */
|
|
ulint offset);/*!< in: offset of page read in */
|
|
/********************************************************************
|
|
Check if the given page is being watched and has been read to the buffer
|
|
pool.
|
|
@return TRUE if the given page is being watched and it has been read in */
|
|
UNIV_INTERN
|
|
ibool
|
|
buf_pool_watch_occurred(
|
|
/*====================*/
|
|
ulint space, /*!< in: space id */
|
|
ulint page_no); /*!< in: page number */
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
|
|
/** The common buffer control block structure
|
|
for compressed and uncompressed frames */
|
|
|
|
struct buf_page_struct{
|
|
/** @name General fields
|
|
None of these bit-fields must be modified without holding
|
|
buf_page_get_mutex() [buf_block_struct::mutex or
|
|
buf_pool_zip_mutex], since they can be stored in the same
|
|
machine word. Some of these fields are additionally protected
|
|
by buf_pool_mutex. */
|
|
/* @{ */
|
|
|
|
unsigned space:32; /*!< tablespace id; also protected
|
|
by buf_pool_mutex. */
|
|
unsigned offset:32; /*!< page number; also protected
|
|
by buf_pool_mutex. */
|
|
|
|
unsigned state:3; /*!< state of the control block; also
|
|
protected by buf_pool_mutex.
|
|
State transitions from
|
|
BUF_BLOCK_READY_FOR_USE to
|
|
BUF_BLOCK_MEMORY need not be
|
|
protected by buf_page_get_mutex().
|
|
@see enum buf_page_state */
|
|
#ifndef UNIV_HOTBACKUP
|
|
unsigned flush_type:2; /*!< if this block is currently being
|
|
flushed to disk, this tells the
|
|
flush_type.
|
|
@see enum buf_flush */
|
|
unsigned accessed:1; /*!< TRUE if the page has been accessed
|
|
while in the buffer pool: read-ahead
|
|
may read in pages which have not been
|
|
accessed yet; a thread is allowed to
|
|
read this for heuristic purposes
|
|
without holding any mutex or latch */
|
|
unsigned io_fix:2; /*!< type of pending I/O operation;
|
|
also protected by buf_pool_mutex
|
|
@see enum buf_io_fix */
|
|
unsigned buf_fix_count:24;/*!< count of how manyfold this block
|
|
is currently bufferfixed */
|
|
/* @} */
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
page_zip_des_t zip; /*!< compressed page; zip.data
|
|
(but not the data it points to) is
|
|
also protected by buf_pool_mutex */
|
|
#ifndef UNIV_HOTBACKUP
|
|
buf_page_t* hash; /*!< node used in chaining to
|
|
buf_pool->page_hash or
|
|
buf_pool->zip_hash */
|
|
#ifdef UNIV_DEBUG
|
|
ibool in_page_hash; /*!< TRUE if in buf_pool->page_hash */
|
|
ibool in_zip_hash; /*!< TRUE if in buf_pool->zip_hash */
|
|
#endif /* UNIV_DEBUG */
|
|
|
|
/** @name Page flushing fields
|
|
All these are protected by buf_pool_mutex. */
|
|
/* @{ */
|
|
|
|
UT_LIST_NODE_T(buf_page_t) list;
|
|
/*!< based on state, this is a
|
|
list node, protected only by
|
|
buf_pool_mutex, in one of the
|
|
following lists in buf_pool:
|
|
|
|
- BUF_BLOCK_NOT_USED: free
|
|
- BUF_BLOCK_FILE_PAGE: flush_list
|
|
- BUF_BLOCK_ZIP_DIRTY: flush_list
|
|
- BUF_BLOCK_ZIP_PAGE: zip_clean
|
|
- BUF_BLOCK_ZIP_FREE: zip_free[] */
|
|
#ifdef UNIV_DEBUG
|
|
ibool in_flush_list; /*!< TRUE if in buf_pool->flush_list;
|
|
when buf_pool_mutex is free, the
|
|
following should hold: in_flush_list
|
|
== (state == BUF_BLOCK_FILE_PAGE
|
|
|| state == BUF_BLOCK_ZIP_DIRTY) */
|
|
ibool in_free_list; /*!< TRUE if in buf_pool->free; when
|
|
buf_pool_mutex is free, the following
|
|
should hold: in_free_list
|
|
== (state == BUF_BLOCK_NOT_USED) */
|
|
#endif /* UNIV_DEBUG */
|
|
ib_uint64_t newest_modification;
|
|
/*!< log sequence number of
|
|
the youngest modification to
|
|
this block, zero if not
|
|
modified */
|
|
ib_uint64_t oldest_modification;
|
|
/*!< log sequence number of
|
|
the START of the log entry
|
|
written of the oldest
|
|
modification to this block
|
|
which has not yet been flushed
|
|
on disk; zero if all
|
|
modifications are on disk */
|
|
/* @} */
|
|
/** @name LRU replacement algorithm fields
|
|
These fields are protected by buf_pool_mutex only (not
|
|
buf_pool_zip_mutex or buf_block_struct::mutex). */
|
|
/* @{ */
|
|
|
|
UT_LIST_NODE_T(buf_page_t) LRU;
|
|
/*!< node of the LRU list */
|
|
#ifdef UNIV_DEBUG
|
|
ibool in_LRU_list; /*!< TRUE if the page is in
|
|
the LRU list; used in
|
|
debugging */
|
|
#endif /* UNIV_DEBUG */
|
|
unsigned old:1; /*!< TRUE if the block is in the old
|
|
blocks in the LRU list */
|
|
unsigned LRU_position:31;/*!< value which monotonically
|
|
decreases (or may stay
|
|
constant if old==TRUE) toward
|
|
the end of the LRU list, if
|
|
buf_pool->ulint_clock has not
|
|
wrapped around: NOTE that this
|
|
value can only be used in
|
|
heuristic algorithms, because
|
|
of the possibility of a
|
|
wrap-around! */
|
|
unsigned freed_page_clock:32;/*!< the value of
|
|
buf_pool->freed_page_clock
|
|
when this block was the last
|
|
time put to the head of the
|
|
LRU list; a thread is allowed
|
|
to read this for heuristic
|
|
purposes without holding any
|
|
mutex or latch */
|
|
/* @} */
|
|
# ifdef UNIV_DEBUG_FILE_ACCESSES
|
|
ibool file_page_was_freed;
|
|
/*!< this is set to TRUE when fsp
|
|
frees a page in buffer pool */
|
|
# endif /* UNIV_DEBUG_FILE_ACCESSES */
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
};
|
|
|
|
/** The buffer control block structure */
|
|
|
|
struct buf_block_struct{
|
|
|
|
/** @name General fields */
|
|
/* @{ */
|
|
|
|
buf_page_t page; /*!< page information; this must
|
|
be the first field, so that
|
|
buf_pool->page_hash can point
|
|
to buf_page_t or buf_block_t */
|
|
byte* frame; /*!< pointer to buffer frame which
|
|
is of size UNIV_PAGE_SIZE, and
|
|
aligned to an address divisible by
|
|
UNIV_PAGE_SIZE */
|
|
#ifndef UNIV_HOTBACKUP
|
|
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_PAGE
|
|
and page.zip.data != NULL */
|
|
#ifdef UNIV_DEBUG
|
|
ibool in_unzip_LRU_list;/*!< TRUE if the page is in the
|
|
decompressed LRU list;
|
|
used in debugging */
|
|
#endif /* UNIV_DEBUG */
|
|
mutex_t mutex; /*!< mutex protecting this block:
|
|
state (also protected by the buffer
|
|
pool mutex), io_fix, buf_fix_count,
|
|
and accessed; we introduce this new
|
|
mutex in InnoDB-5.1 to relieve
|
|
contention on the buffer pool mutex */
|
|
rw_lock_t lock; /*!< read-write lock of the buffer
|
|
frame */
|
|
unsigned lock_hash_val:32;/*!< hashed value of the page address
|
|
in the record lock hash table */
|
|
unsigned check_index_page_at_flush:1;
|
|
/*!< TRUE if we know that this is
|
|
an index page, and want the database
|
|
to check its consistency before flush;
|
|
note that there may be pages in the
|
|
buffer pool which are index pages,
|
|
but this flag is not set because
|
|
we do not keep track of all pages */
|
|
/* @} */
|
|
/** @name Optimistic search field */
|
|
/* @{ */
|
|
|
|
ib_uint64_t modify_clock; /*!< this clock is incremented every
|
|
time a pointer to a record on the
|
|
page may become obsolete; this is
|
|
used in the optimistic cursor
|
|
positioning: if the modify clock has
|
|
not changed, we know that the pointer
|
|
is still valid; this field may be
|
|
changed if the thread (1) owns the
|
|
pool mutex and the page is not
|
|
bufferfixed, or (2) the thread has an
|
|
x-latch on the block */
|
|
/* @} */
|
|
/** @name Hash search fields (unprotected)
|
|
NOTE that these fields are NOT protected by any semaphore! */
|
|
/* @{ */
|
|
|
|
ulint n_hash_helps; /*!< counter which controls building
|
|
of a new hash index for the page */
|
|
ulint n_fields; /*!< recommended prefix length for hash
|
|
search: number of full fields */
|
|
ulint n_bytes; /*!< recommended prefix: number of bytes
|
|
in an incomplete field */
|
|
ibool left_side; /*!< TRUE or FALSE, depending on
|
|
whether the leftmost record of several
|
|
records with the same prefix should be
|
|
indexed in the hash index */
|
|
/* @} */
|
|
|
|
/** @name Hash search fields
|
|
These 6 fields may only be modified when we have
|
|
an x-latch on btr_search_latch AND
|
|
- we are holding an s-latch or x-latch on buf_block_struct::lock or
|
|
- we know that buf_block_struct::buf_fix_count == 0.
|
|
|
|
An exception to this is when we init or create a page
|
|
in the buffer pool in buf0buf.c. */
|
|
|
|
/* @{ */
|
|
|
|
#if defined UNIV_AHI_DEBUG || defined UNIV_DEBUG
|
|
ulint n_pointers; /*!< used in debugging: the number of
|
|
pointers in the adaptive hash index
|
|
pointing to this frame */
|
|
#endif /* UNIV_AHI_DEBUG || UNIV_DEBUG */
|
|
unsigned is_hashed:1; /*!< TRUE if hash index has
|
|
already been built on this
|
|
page; note that it does not
|
|
guarantee that the index is
|
|
complete, though: there may
|
|
have been hash collisions,
|
|
record deletions, etc. */
|
|
unsigned curr_n_fields:10;/*!< prefix length for hash indexing:
|
|
number of full fields */
|
|
unsigned curr_n_bytes:15;/*!< number of bytes in hash
|
|
indexing */
|
|
unsigned curr_left_side:1;/*!< TRUE or FALSE in hash indexing */
|
|
dict_index_t* index; /*!< Index for which the adaptive
|
|
hash index has been created. */
|
|
/* @} */
|
|
# ifdef UNIV_SYNC_DEBUG
|
|
/** @name Debug fields */
|
|
/* @{ */
|
|
rw_lock_t debug_latch; /*!< in the debug version, each thread
|
|
which bufferfixes the block acquires
|
|
an s-latch here; so we can use the
|
|
debug utilities in sync0rw */
|
|
/* @} */
|
|
# endif
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
};
|
|
|
|
/** Check if a buf_block_t object is in a valid state
|
|
@param block buffer block
|
|
@return TRUE if valid */
|
|
#define buf_block_state_valid(block) \
|
|
(buf_block_get_state(block) >= BUF_BLOCK_NOT_USED \
|
|
&& (buf_block_get_state(block) <= BUF_BLOCK_REMOVE_HASH))
|
|
|
|
#ifndef UNIV_HOTBACKUP
|
|
/**********************************************************************//**
|
|
Compute the hash fold value for blocks in buf_pool->zip_hash. */
|
|
/* @{ */
|
|
#define BUF_POOL_ZIP_FOLD_PTR(ptr) ((ulint) (ptr) / UNIV_PAGE_SIZE)
|
|
#define BUF_POOL_ZIP_FOLD(b) BUF_POOL_ZIP_FOLD_PTR((b)->frame)
|
|
#define BUF_POOL_ZIP_FOLD_BPAGE(b) BUF_POOL_ZIP_FOLD((buf_block_t*) (b))
|
|
/* @} */
|
|
|
|
/** @brief The buffer pool structure.
|
|
|
|
NOTE! The definition appears here only for other modules of this
|
|
directory (buf) to see it. Do not use from outside! */
|
|
|
|
struct buf_pool_struct{
|
|
|
|
/** @name General fields */
|
|
/* @{ */
|
|
|
|
ulint n_chunks; /*!< number of buffer pool chunks */
|
|
buf_chunk_t* chunks; /*!< buffer pool chunks */
|
|
ulint curr_size; /*!< current pool size in pages */
|
|
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, offset) */
|
|
hash_table_t* zip_hash; /*!< hash table of buf_block_t blocks
|
|
whose frames are allocated to the
|
|
zip buddy system,
|
|
indexed by block->frame */
|
|
ulint n_pend_reads; /*!< number of pending read operations */
|
|
ulint n_pend_unzip; /*!< number of pending decompressions */
|
|
|
|
time_t last_printout_time; /*!< when buf_print was last time
|
|
called */
|
|
ulint n_pages_read; /*!< number read operations */
|
|
ulint n_pages_written;/*!< number write operations */
|
|
ulint n_pages_created;/*!< number of pages created
|
|
in the pool with no read */
|
|
ulint n_page_gets; /*!< number of page gets performed;
|
|
also successful searches through
|
|
the adaptive hash index are
|
|
counted as page gets; this field
|
|
is NOT protected by the buffer
|
|
pool mutex */
|
|
ulint n_page_gets_old;/*!< n_page_gets when buf_print was
|
|
last time called: used to calculate
|
|
hit rate */
|
|
ulint n_pages_read_old;/*!< n_pages_read when buf_print was
|
|
last time called */
|
|
ulint n_pages_written_old;/*!< number write operations */
|
|
ulint n_pages_created_old;/*!< number of pages created in
|
|
the pool with no read */
|
|
/* @} */
|
|
/** @name Page flushing algorithm fields */
|
|
/* @{ */
|
|
|
|
UT_LIST_BASE_NODE_T(buf_page_t) flush_list;
|
|
/*!< base node of the modified block
|
|
list */
|
|
ibool init_flush[BUF_FLUSH_N_TYPES];
|
|
/*!< this is TRUE when a flush of the
|
|
given type is being initialized */
|
|
ulint n_flush[BUF_FLUSH_N_TYPES];
|
|
/*!< this is the number of pending
|
|
writes in the given flush type */
|
|
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 */
|
|
ib_rbt_t* flush_rbt; /*!< a red-black tree is used
|
|
exclusively during recovery to
|
|
speed up insertions in the
|
|
flush_list. This tree contains
|
|
blocks in order of
|
|
oldest_modification LSN and is
|
|
kept in sync with the
|
|
flush_list.
|
|
Each member of the tree MUST
|
|
also be on the flush_list.
|
|
This tree is relevant only in
|
|
recovery and is set to NULL
|
|
once the recovery is over. */
|
|
ulint ulint_clock; /*!< a sequence number used to count
|
|
time. NOTE! This counter wraps
|
|
around at 4 billion (if ulint ==
|
|
32 bits)! */
|
|
ulint freed_page_clock;/*!< a sequence number used
|
|
to count the number of buffer
|
|
blocks removed from the end of
|
|
the LRU list; NOTE that this
|
|
counter may wrap around at 4
|
|
billion! A thread is allowed
|
|
to read this for heuristic
|
|
purposes without holding any
|
|
mutex or latch */
|
|
ulint LRU_flush_ended;/*!< when an LRU flush ends for a page,
|
|
this is incremented by one; this is
|
|
set to zero when a buffer block is
|
|
allocated */
|
|
/* @} */
|
|
/** @name Buffer pool watch
|
|
This is needed for implementing delete buffering. */
|
|
/* @{ */
|
|
/*--------------------------*/
|
|
ibool watch_active; /* if TRUE, set watch_occurred
|
|
when watch_space, watch_page_no
|
|
is read in. */
|
|
ulint watch_space; /* space id of watched page */
|
|
ulint watch_page_no; /* page number of watched page */
|
|
ibool watch_occurred; /* has watched page been read in */
|
|
/*--------------------------*/
|
|
/* @} */
|
|
/** @name LRU replacement algorithm fields */
|
|
/* @{ */
|
|
|
|
UT_LIST_BASE_NODE_T(buf_page_t) free;
|
|
/*!< base node of the free
|
|
block list */
|
|
UT_LIST_BASE_NODE_T(buf_page_t) LRU;
|
|
/*!< base node of the LRU list */
|
|
buf_page_t* LRU_old; /*!< pointer to the about 3/8 oldest
|
|
blocks in the LRU list; NULL if LRU
|
|
length less than BUF_LRU_OLD_MIN_LEN;
|
|
NOTE: when LRU_old != NULL, its length
|
|
should always equal LRU_old_len */
|
|
ulint LRU_old_len; /*!< length of the LRU list from
|
|
the block to which LRU_old points
|
|
onward, including that block;
|
|
see buf0lru.c for the restrictions
|
|
on this value; not defined if
|
|
LRU_old == NULL;
|
|
NOTE: LRU_old_len must be adjusted
|
|
whenever LRU_old shrinks or grows! */
|
|
|
|
UT_LIST_BASE_NODE_T(buf_block_t) unzip_LRU;
|
|
/*!< base node of the
|
|
unzip_LRU list */
|
|
|
|
/* @} */
|
|
/** @name Buddy allocator fields
|
|
The buddy allocator is used for allocating compressed page
|
|
frames and buf_page_t descriptors of blocks that exist
|
|
in the buffer pool only in compressed form. */
|
|
/* @{ */
|
|
UT_LIST_BASE_NODE_T(buf_page_t) zip_clean;
|
|
/*!< unmodified compressed pages */
|
|
UT_LIST_BASE_NODE_T(buf_page_t) zip_free[BUF_BUDDY_SIZES];
|
|
/*!< buddy free lists */
|
|
#if BUF_BUDDY_HIGH != UNIV_PAGE_SIZE
|
|
# error "BUF_BUDDY_HIGH != UNIV_PAGE_SIZE"
|
|
#endif
|
|
#if BUF_BUDDY_LOW > PAGE_ZIP_MIN_SIZE
|
|
# error "BUF_BUDDY_LOW > PAGE_ZIP_MIN_SIZE"
|
|
#endif
|
|
/* @} */
|
|
};
|
|
|
|
/** mutex protecting the buffer pool struct and control blocks, except the
|
|
read-write lock in them */
|
|
extern mutex_t buf_pool_mutex;
|
|
/** mutex protecting the control blocks of compressed-only pages
|
|
(of type buf_page_t, not buf_block_t) */
|
|
extern mutex_t buf_pool_zip_mutex;
|
|
|
|
/** @name Accessors for buf_pool_mutex.
|
|
Use these instead of accessing buf_pool_mutex directly. */
|
|
/* @{ */
|
|
|
|
/** Test if buf_pool_mutex is owned. */
|
|
#define buf_pool_mutex_own() mutex_own(&buf_pool_mutex)
|
|
/** Acquire the buffer pool mutex. */
|
|
#define buf_pool_mutex_enter() do { \
|
|
ut_ad(!mutex_own(&buf_pool_zip_mutex)); \
|
|
mutex_enter(&buf_pool_mutex); \
|
|
} while (0)
|
|
|
|
#if defined UNIV_DEBUG || defined UNIV_BUF_DEBUG
|
|
/** Flag to forbid the release of the buffer pool mutex.
|
|
Protected by buf_pool_mutex. */
|
|
extern ulint buf_pool_mutex_exit_forbidden;
|
|
/** Forbid the release of the buffer pool mutex. */
|
|
# define buf_pool_mutex_exit_forbid() do { \
|
|
ut_ad(buf_pool_mutex_own()); \
|
|
buf_pool_mutex_exit_forbidden++; \
|
|
} while (0)
|
|
/** Allow the release of the buffer pool mutex. */
|
|
# define buf_pool_mutex_exit_allow() do { \
|
|
ut_ad(buf_pool_mutex_own()); \
|
|
ut_a(buf_pool_mutex_exit_forbidden); \
|
|
buf_pool_mutex_exit_forbidden--; \
|
|
} while (0)
|
|
/** Release the buffer pool mutex. */
|
|
# define buf_pool_mutex_exit() do { \
|
|
ut_a(!buf_pool_mutex_exit_forbidden); \
|
|
mutex_exit(&buf_pool_mutex); \
|
|
} while (0)
|
|
#else
|
|
/** Forbid the release of the buffer pool mutex. */
|
|
# define buf_pool_mutex_exit_forbid() ((void) 0)
|
|
/** Allow the release of the buffer pool mutex. */
|
|
# define buf_pool_mutex_exit_allow() ((void) 0)
|
|
/** Release the buffer pool mutex. */
|
|
# define buf_pool_mutex_exit() mutex_exit(&buf_pool_mutex)
|
|
#endif
|
|
#endif /* !UNIV_HOTBACKUP */
|
|
/* @} */
|
|
|
|
/**********************************************************************
|
|
Let us list the consistency conditions for different control block states.
|
|
|
|
NOT_USED: is in free list, not in LRU list, not in flush list, nor
|
|
page hash table
|
|
READY_FOR_USE: is not in free list, LRU list, or flush list, nor page
|
|
hash table
|
|
MEMORY: is not in free list, LRU list, or flush list, nor page
|
|
hash table
|
|
FILE_PAGE: space and offset are defined, is in page hash table
|
|
if io_fix == BUF_IO_WRITE,
|
|
pool: no_flush[flush_type] is in reset state,
|
|
pool: n_flush[flush_type] > 0
|
|
|
|
(1) if buf_fix_count == 0, then
|
|
is in LRU list, not in free list
|
|
is in flush list,
|
|
if and only if oldest_modification > 0
|
|
is x-locked,
|
|
if and only if io_fix == BUF_IO_READ
|
|
is s-locked,
|
|
if and only if io_fix == BUF_IO_WRITE
|
|
|
|
(2) if buf_fix_count > 0, then
|
|
is not in LRU list, not in free list
|
|
is in flush list,
|
|
if and only if oldest_modification > 0
|
|
if io_fix == BUF_IO_READ,
|
|
is x-locked
|
|
if io_fix == BUF_IO_WRITE,
|
|
is s-locked
|
|
|
|
State transitions:
|
|
|
|
NOT_USED => READY_FOR_USE
|
|
READY_FOR_USE => MEMORY
|
|
READY_FOR_USE => FILE_PAGE
|
|
MEMORY => NOT_USED
|
|
FILE_PAGE => NOT_USED NOTE: This transition is allowed if and only if
|
|
(1) buf_fix_count == 0,
|
|
(2) oldest_modification == 0, and
|
|
(3) io_fix == 0.
|
|
*/
|
|
|
|
#ifndef UNIV_NONINL
|
|
#include "buf0buf.ic"
|
|
#endif
|
|
|
|
#endif
|