- 28 Nov, 2022 7 commits
-
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
Marko Mäkelä authored
recv_log_recover_10_4(): Widen the operand of bitwise and to 64 bits, so that the upgrade check will work when the redo log record is located more than 4 gigabytes from the start of the first file.
-
Marko Mäkelä authored
ibuf_init_at_db_start(): Validate the change buffer root page. A later version may stop creating a change buffer, and this validation check will prevent a downgrade from such later versions. ibuf_max_size_update(): If the change buffer was not loaded, do nothing. dict_boot(): Merge the local variable "error" to "err". Ignore failures of ibuf_init_at_db_start() if innodb_force_recovery>=4.
-
Marko Mäkelä authored
In commit a03dd94b as well as mysql/mysql-server@6ef8c343445a26aaf9ebd76d72cf57db44b481f5 the iterations were changed so that the variable "scanned" would remain 0 when the first list item qualifies for eviction. buf_LRU_free_from_unzip_LRU_list(), buf_LRU_free_from_common_LRU_list(): Increment "scanned" when a block can be freed. buf_LRU_free_from_common_LRU_list(): Remove a redundant condition. Whenever this function is invoked, buf_pool.LRU should be nonempty, hence something should always be scanned. Thanks to Jean-François Gagné for reporting this.
-
Daniel Black authored
The very lightest of load would decimate any buffer pool loading to ~1 page per second. As seen in MDEV-29343 this resulting in a load taking over an hour on a high end system. Since MDEV-26547 the fetching is asynchronous, however the loading has equal access to the IO as the SQL queries.
-
Marko Mäkelä authored
This fixes up 0e6f2757 and 6f8fb41f which corrupted the Chinese and Spanish translations of the changed error message ER_PARTITION_WRONG_TYPE.
-
- 25 Nov, 2022 3 commits
-
-
Brandon Nesterenko authored
Problem: ======== There is a race condition in binlog.binlog_checkpoint between the binlog background thread creating a binlog checkpoint event, and the connection thread binlogging a query event for creating a table. Because the test outputs the events for validation, the order between these two events can be different, resulting in a failed test. Solution: ======== Instead of outputting the binlog events, use assert_grep to validate the content of the binlog is correct. Reviewed By: ============ Andrei Elkin <andrei.elkin@mariadb.com>
-
Daniel Black authored
A few query cache functions don't use THD pointer so its removed from their interface.
-
Daniel Black authored
Fix the regression introduced in dfb41fdd. In the restructure of mysql_rm_table_no_locks the early condition of !frm_error that enabled non_tmp_table_deleted, and hence the query cache invalidation, was removed. The query_cache_invalidate1(thd, dbnorm) called after mysql_rm_table_no_locks depends on the query cache removal (for unexamined reasons). Under DROP DATABASE, in mysql_rm_table_no_locks, dont_log_query is true preventing the late setting of non_tmp_table_deleted (which retained one of its purposes as a replication deletion of temporary tables, but not query cache invalidation). The non_temp_tables_count however can still be used to invalidate the query cache.
-
- 24 Nov, 2022 5 commits
-
-
Sergei Golubchik authored
it uses C client API, so needs RECOMPILE_FOR_EMBEDDED
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
Monty authored
-
- 23 Nov, 2022 2 commits
-
-
Marko Mäkelä authored
-
Marko Mäkelä authored
The InnoDB change buffer (ibuf.index, stored in the system tablespace) and the change buffer bitmaps in persistent tablespaces could get out of sync with each other: According to the bitmap, no changes exist for a page, while there actually exist buffered entries in ibuf.index. InnoDB performs lazy deletion of buffered changes. When a secondary index leaf page is freed (possibly as part of DROP INDEX), any buffered changes will not be deleted. Instead, they would be deleted on a subsequent buf_page_create_low(). One scenario where InnoDB failed to delete buffered changes is as follows: 1. Some changes were buffered for a secondary index leaf page. 2. The index page had been freed. 3. ibuf_read_merge_pages() invoked ibuf_merge_or_delete_for_page(), which noticed that the page had been freed, and reset the change buffer bits, but did not delete the records from ibuf.index. 4. The index page was reallocated for something else. 5. The index page was removed from the buffer pool. 6. Some changes were buffered for the newly created page. 7. Finally, the buffered changes from both 1. and 6. were merged. 8. The index is corrupted. An alternative outcome is: 4. Shutdown with innodb_fast_shutdown=0 gets into an infinite loop. An alternative scenario is: 3. ibuf_set_bitmap_for_bulk_load() reset the IBUF_BITMAP_BUFFERED bit but did not delete the ibuf.index records for that page number. The shutdown hang was already once fixed in commit d7a24017, refactored for 10.5 in commit 77e8a311 and disabled in commit 310dff5d due to corruption. We will fix this as follows: ibuf_delete_recs(): Delete all ibuf.index entries for the specified page. ibuf_merge_or_delete_for_page(): When the change buffer bitmap bits were set and the page had been freed, and the page does not belong to ibuf.index itself, invoke ibuf_delete_recs(). This prevents the corruption from occurring when a DML operation is allocating a previously freed page for which changes had been buffered. ibuf_set_bitmap_for_bulk_load(): When the change buffer bitmap bits were set, invoke ibuf_delete_recs(). This prevents the corruption from occurring when CREATE INDEX is reusing a previously freed page. ibuf_read_merge_pages(): On slow shutdown, remove the orphan records by invoking ibuf_delete_recs(). This fixes the hang when the change buffer had become corrupted. We also remove the dops[] accounting, because nothing can monitor it during shutdown. We invoke ibuf_delete_recs() if: (a) buf_page_get_gen() failed to load the page or merge changes (b) the page is not a valid index leaf page (c) the page number is out of tablespace bounds srv_shutdown(): Invoke ibuf_max_size_update(0) to ensure that the race condition that motivated us to disable the code in ibuf_read_merge_pages() in commit 310dff5d is no longer possible. That is, during slow shutdown, both the rollback of transactions and the purge of history will return early from ibuf_insert_low(). ibuf_merge_space(), ibuf_delete_for_discarded_space(): Cleanup: Do not allocate a memory heap. This was implemented by Thirunarayanan Balathandayuthapani and tested with innodb_change_buffering_debug=1 by Matthias Leich.
-
- 22 Nov, 2022 3 commits
-
-
Marko Mäkelä authored
-
Marko Mäkelä authored
fil_name_process(): If fil_ibd_load() returns FIL_LOAD_INVALID, display the file name and the tablespace identifier.
-
Marko Mäkelä authored
recv_sys_t::recover_deferred(): If the *.ibd file already exists, adjust the size to the tablespace metadata. It could be that in a multi-batch recovery, we will initially recover an all-zero *.ibd file to a smaller size, and then a fatal error would be reported during the last recovery batch. This bug could be worked around by executing the recovery again. During the initial (failed) recovery attempt, something should have been written to the first page of the file and the file size should be recovered by fil_node_t::read_page0().
-
- 21 Nov, 2022 8 commits
-
-
Marko Mäkelä authored
During crash recovery, recv_sys.apply(true) invokes mlog_init.mark_ibuf_exist(), which in turn may invoke recv_sys.apply(true) via the buf_flush_sync() call in buf_page_get_low(). The simplest fix is to disable the innodb_change_buffering_debug=1 instrumentation during crash recovery.
-
Vladislav Vaintroub authored
# Conflicts: # sql/sql_connect.cc
-
Vladislav Vaintroub authored
-
Vladislav Vaintroub authored
Remove DBUG_ASSERT that depends on timing.
-
Vladislav Vaintroub authored
Remove DBUG_ASSERT, that depends on timing/scheduling to succeed.
-
Marko Mäkelä authored
-
Marko Mäkelä authored
trx_mod_table_time_t::write_bulk(): Define non-inline. There are 2 callers, so this will avoid some code duplication. trx_t::bulk_insert_apply(): In the inline function, only check for the condition, and invoke the actual operation in the non-inline function trx_t::bulk_insert_apply_low().
-
Marko Mäkelä authored
InnoDB fails to remove bulk store when InnoDB bulk insert does partial rollback on multiple tables. This memory leak was revealed by a test case that was added in commit 505da21e (MDEV-27214). trx_t::bulk_rollback(): Delete the bulk_store. After this function finishes execution, trx_t::is_bulk_insert() will not hold and therefore trx_t::commit_cleanup() will not free the memory. Alternatively, we could define trx_mod_table_time_t::~trx_mod_table_time_t() { delete bulk_store; } but that would likely introduce a performance regression for the common transaction commit. Bulk insert is rarely used. This fix was developed by Thirunarayanan Balathandayuthapani.
-
- 20 Nov, 2022 4 commits
-
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
- 17 Nov, 2022 4 commits
-
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
Marko Mäkelä authored
The log overwrite warnings are not being reliably emitted in all debug-instrumented environments. It may be related to the scheduling of some InnoDB internal activity, such as the purging of committed transaction history.
-
Marko Mäkelä authored
btr_cur_t: Zero-initialize all fields in the default constructor. btr_cur_t::index: Remove; it duplicated page_cur.index. Many functions: Remove arguments that were duplicating page_cur_t::index and page_cur_t::block. page_cur_open_level(), btr_pcur_open_level(): Replaces btr_cur_open_at_index_side() for dict_stats_analyze_index(). At the end, release all latches except the dict_index_t::lock and the buf_page_t::lock on the requested page. dict_stats_analyze_index(): Rely on mtr_t::rollback_to_savepoint() to release all uninteresting page latches. btr_search_guess_on_hash(): Simplify the logic, and invoke mtr_t::rollback_to_savepoint(). We will use plain C++ std::vector<mtr_memo_slot_t> for mtr_t::m_memo. In this way, we can avoid setting mtr_memo_slot_t::object to nullptr and instead just remove garbage from m_memo. mtr_t::rollback_to_savepoint(): Shrink the vector. We will be needing this in dict_stats_analyze_index(), where we will release page latches and only retain the index->lock in mtr_t::m_memo. mtr_t::release_last_page(): Release the last acquired page latch. Replaces btr_leaf_page_release(). mtr_t::release(const buf_block_t&): Release a single page latch. Used in btr_pcur_move_backward_from_page(). mtr_t::memo_release(): Replaced with mtr_t::release(). mtr_t::upgrade_buffer_fix(): Acquire a latch for a buffer-fixed page. This replaces the double bookkeeping in btr_cur_t::open_leaf(). Reviewed by: Vladislav Lesin
-
- 16 Nov, 2022 4 commits
-
-
Sergei Golubchik authored
MDEV-25625 Test sys_vars.wsrep_on_without_provider fails: mysqltest: At line 8: query 'SET GLOBAL wsrep_on=ON' failed with wrong errno 1193: 'Unknown system variable 'wsrep_on'', instead of 1210...
-
Marko Mäkelä authored
btr_cur_t::open_leaf(): Replaces btr_cur_open_at_index_side() for most calls, except dict_stats_analyze_index(), which is the only place where we need to open a page at the non-leaf level. Use btr_block_get() for better error handling. Also, use the enumeration type btr_latch_mode wherever possible. Reviewed by: Vladislav Lesin
-
Marko Mäkelä authored
The Boolean field btr_pcur_t::old_stored mostly duplicates old_rec. Let us remove it.
-
Marko Mäkelä authored
btr_cur_search_to_nth_level(): Simply acquire a latch on the already buffer-fixed page. There is no need to release the buffer-fix and re-lookup the page.
-