- 05 Sep, 2023 3 commits
-
-
Monty authored
-
Dmitry Shulga authored
-
Dmitry Shulga authored
-
- 04 Sep, 2023 2 commits
-
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
- 02 Sep, 2023 5 commits
-
-
Dmitry Shulga authored
Fixed memory leak taken place on executing a prepared statement or a stored routine that querying a view and this view constructed on an information schema table. For example, Lets consider the following definition of the view 'v1' CREATE VIEW v1 AS SELECT table_name FROM information_schema.views ORDER BY table_name; Querying this view in PS mode result in hit of assert. PREPARE stmt FROM "SELECT * FROM v1"; EXECUTE stmt; EXECUTE stmt; (*) Running the statement marked with (*) leads to a crash in case server build with mode to control allocation of a memory from SP/PS memory root on the second and following executions of PS/SP. The reason of leaking the memory is that a memory allocated on processing of FRM file for the view requested from a PS/PS memory root meaning that this memory be released only when a stored routine be evicted from SP-cache or a prepared statement be deallocated that typically happens on termination of a user session. To fix the issue switch to a memory root specially created for allocation of short-lived objects that requested on parsing FRM.
-
Dmitry Shulga authored
In case a table accessed by a PS/SP is dropped after the first execution of PS/SP and a view created with the same name as a table just dropped then the second execution of PS/SP leads to allocation of a memory on SP/PS memory root already marked as read only on first execution. For example, the following test case: CREATE TABLE t1 (a INT); PREPARE stmt FROM "INSERT INTO t1 VALUES (1)"; EXECUTE stmt; DROP TABLE t1; CREATE VIEW t1 S SELECT 1; --error ER_NON_INSERTABLE_TABLE EXECUTE stmt; # (*) DROP VIEW t1; will hit assert on running the statement 'EXECUTE stmt' marked with (*) when allocation of a memory be performed on parsing the view. Memory allocation is requested inside the function mysql_make_view when a view definition being parsed. In order to avoid an assertion failure, call of the function mysql_make_view() must be moved after invocation of the function check_and_update_table_version(). It will result in re-preparing the whole PS statement or current SP instruction that will free currently allocated items and reset read_only flag for the memory root.
-
Dmitry Shulga authored
Moved call of the function check_and_update_table_version() just before the place where the function extend_table_list() is invoked in order to avoid allocation of memory on a PS/SP memory root marked as read only. It happens by the reason that the function extend_table_list() invokes sp_add_used_routine() to add a trigger created for the table in time frame between execution the statement EXECUTE `stmt_id` . For example, the following test case create table t1 (a int); prepare stmt from "insert into t1 (a) value (1)"; execute stmt; create trigger t1_bi before insert on t1 for each row set @message= new.a; execute stmt; # (*) adds the trigger t1_bi to a list of used routines that involves allocation of a memory on PS memory root that has been already marked as read only on first run of the statement 'execute stmt'. In result, when the statement marked with (*) is executed it results in assert hit. To fix the issue call the function check_and_update_table_version() before invocation of extend_table_list() to force re-compilation of PS/SP that resets read-only flag of its memory root.
-
Dmitry Shulga authored
It is done now before call of select_lex->setup_ref_array() in order to avoid allocation of SP/PS's memory on its second invocation.
-
Dmitry Shulga authored
This patch adds support for controlling of memory allocation done by SP/PS that could happen on second and following executions. As soon as SP or PS has been executed the first time its memory root is marked as read only since no further memory allocation should be performed on it. In case such allocation takes place it leads to the assert hit for invariant that force no new memory allocations takes place as soon as the SP/PS has been marked as read only. The feature for control of memory allocation made on behalf SP/PS is turned on when both debug build is on and the cmake option -DWITH_PROTECT_STATEMENT_MEMROOT is set. The reason for introduction of the new cmake option -DWITH_PROTECT_STATEMENT_MEMROOT to control memory allocation of second and following executions of SP/PS is that for the current server implementation there are too many places where such memory allocation takes place. As soon as all such incorrect allocations be fixed the cmake option -DWITH_PROTECT_STATEMENT_MEMROOT can be removed and control of memory allocation made on second and following executions can be turned on only for debug build. Before every incorrect memory allocation be fixed it makes sense to guard the checking of memory allocation on read only memory by extra cmake option else we would get a lot of failing test on buildbot. Moreover, fixing of all incorrect memory allocations could take pretty long period of time, so for introducing the feature without necessary to wait until all places throughout the source code be fixed it makes sense to add the new cmake option.
-
- 01 Sep, 2023 1 commit
-
-
Thirunarayanan Balathandayuthapani authored
- Server aborts when table doesn't have referenced index. This is caused by 5f09b53b (MDEV-31086). While iterating the foreign key constraints, we fail to consider that InnoDB doesn't have referenced index for it when foreign key check is disabled.
-
- 31 Aug, 2023 3 commits
-
-
Marko Mäkelä authored
-
Marko Mäkelä authored
The function log_free_check() is not supposed to be invoked while the caller is holding any InnoDB synchronization objects, such as buffer page latches, tablespace latches, index tree latches, or in this case, rseg->mutex (rseg->latch in 10.6 or later). A hang was reported in 10.6 where several threads were waiting for an rseg->latch that had been exclusively acquired in trx_purge_truncate_history(), which invoked log_free_check() inside trx_purge_truncate_rseg_history(). Because the threads that were waiting for the rseg->latch were holding exclusive latches on some index pages, log_free_check() was unable to advance the checkpoint because those index pages could not be written out. trx_purge_truncate_history(): Invoke log_free_check() before acquiring the rseg->mutex and invoking trx_purge_free_segment(). trx_purge_free_segment(): Do not invoke log_free_check() in order to avoid a deadlock.
-
Marko Mäkelä authored
This fixes the following test: set sql_mode=ORACLE; --source include/have_innodb.inc
-
- 30 Aug, 2023 3 commits
-
-
Marko Mäkelä authored
In commit 0d175968 (MDEV-31354) we only waited that no buf_pool.flush_list writes are in progress. The buf_flush_page_cleaner() thread could still initiate page writes from the buf_pool.LRU list while only holding buf_pool.mutex, not buf_pool.flush_list_mutex. This is something that was changed in commit a55b951e (MDEV-26827). log_sort_flush_list(): Wait for the buf_flush_page_cleaner() thread to be completely idle, including LRU flushing. buf_flush_page_cleaner(): Always broadcast buf_pool.done_flush_list when becoming idle, so that log_sort_flush_list() will be woken up. Also, ensure that buf_pool.n_flush_inc() or buf_pool.flush_list_set_active() has been invoked before any page writes are initiated. buf_flush_try_neighbors(): Release buf_pool.mutex here and not in the callers, to avoid code duplication. Make innodb_flush_neighbors=ON obey the innodb_io_capacity limit.
-
Marko Mäkelä authored
buf_page_init_for_read(): Test a condition before acquiring a latch, not while holding it. buf_read_ahead_linear(): Do not use a memory transaction, because it could be too large, leading to frequent retries. Release the hash_lock as early as possible.
-
Daniel Black authored
This reverts commit 38fe266e. The correct fix was pushed to the 10.4 branch (fbc157ab)
-
- 29 Aug, 2023 1 commit
-
-
Alexander Barkov authored
Summary: This patch enables possible index optimization when the WHERE clause has an IN condition of the form: signed_or_unsigned_column IN (signed_or_unsigned_constant, signed_or_unsigned_constant [,signed_or_unsigned_constant]*) when the IN list constants are of different signess, e.g.: WHERE signed_column IN (signed_constant, unsigned_constant ...) WHERE unsigned_column IN (signed_constant, unsigned_constant ...) Details: In a condition like: WHERE unsigned_predicant IN (1, LONGLONG_MAX + 1) comparison handlers for individual (predicant,value) pairs are calculated as follows: * unsigned_predicant and 1 produce &type_handler_newdecimal * unsigned_predicant and (LONGLONG_MAX + 1) produce &type_handler_slonglong The old code decided that it could not use bisection because the two pairs had different comparison handlers. As a result, bisection was not allowed, and, in case of an indexed integer column predicant the index on the column was not used. The new code catches special cases like: signed_predicant IN (signed_constant, unsigned_constant) unsigned_predicant IN (signed_constant, unsigned_constant) It enables bisection using in_longlong, which supports a mixture of predicant and values of different signess. In case when the predicant is an indexed column this change automatically enables index range optimization. Thanks to Vicențiu Ciorbaru for proposing the idea and for preparing MTR tests.
-
- 28 Aug, 2023 2 commits
-
-
Thirunarayanan Balathandayuthapani authored
Problem: ======== InnoDB fails to mark the page status as FREED during freeing of an extent of a segment. This behaviour affects scrubbing and doesn't write all zeroes in file even though pages are freed. Solution: ======== InnoDB should mark the page status as FREED before reinitialize the extent descriptor entry.
-
Dmitry Shulga authored
For clang compiler the compiler's flag -Wno-unused-but-set-variable was set based on compiler version. This approach could result in false positive detection for presence of compiler option since only first three groups of digits in compiler version taken into account and it could lead to inaccuracy in determining of supported compiler's features. Correct way to detect options supported by a compiler is to use the macros MY_CHECK_CXX_COMPILER_FLAG and to check the result of variable with prefix have_CXX__ So, to check whether compiler does support the option -Wno-unused-but-set-variable the macros MY_CHECK_CXX_COMPILER_FLAG(-Wno-unused-but-set-variable) should be called and the result variable have_CXX__Wno_unused_but_set_variable be tested for assigned value.
-
- 25 Aug, 2023 5 commits
-
-
Thirunarayanan Balathandayuthapani authored
- HA_EXTRA_IGNORE_INSERT call is being called for every inserted row, and on partitioned tables on every row * every partition. This leads to slowness during load..data operation - Under bulk operation, multiple insert statement error handling will end up emptying the table. This behaviour introduced by the commit 8ea923f5 (MDEV-24818). This makes the HA_EXTRA_IGNORE_INSERT call redundant. We can use the same behavior for insert..ignore statement as well. - Removed the extra call HA_EXTRA_IGNORE_INSERT as the solution to improve the performance of load command.
-
Marko Mäkelä authored
buf_LRU_block_remove_hashed(): Test for "not ROW_FORMAT=COMPRESSED" first, because in that case we can assume that an uncompressed page exists. This removes a condition from the likely code branch.
-
Marko Mäkelä authored
trx_t::commit_empty(): A special case of transaction "commit" when the transaction was actually rolled back or the persistent undo log is empty. In this case, we need to change the undo log header state to TRX_UNDO_CACHED and move the undo log from rseg->undo_list to rseg->undo_cached for fast reuse. Furthermore, unless this is the only undo log record in the page, we will remove the record and rewind TRX_UNDO_PAGE_START, TRX_UNDO_PAGE_FREE, TRX_UNDO_LAST_LOG. We must also ensure that the system-wide transaction identifier will be persisted up to this->id, so that there will not be warnings or errors due to a PAGE_MAX_TRX_ID being too large. We might have modified secondary index pages before being rolled back, and any changes of PAGE_MAX_TRX_ID are never rolled back. Even though it is not going to be written persistently anywhere, we will invoke trx_sys.assign_new_trx_no(this), so that in the test innodb.instant_alter everything will be purged as expected. trx_t::write_serialisation_history(): Renamed from trx_write_serialisation_history(). If there is no undo log, invoke commit_empty(). trx_purge_add_undo_to_history(): Simplify an assertion and remove a comment. This function will not be invoked on an empty undo log anymore. trx_undo_header_create(): Add a debug assertion. trx_undo_mem_create_at_db_start(): Remove a duplicated assignment. Reviewed by: Vladislav Lesin Tested by: Matthias Leich
-
Marko Mäkelä authored
trx_commit_complete_for_mysql(): Remove some conditions. We will rely on trx_t::commit_lsn. trx_t::must_flush_log_later: Remove. trx_commit_complete_for_mysql() can simply check for trx_t::flush_log_later. trx_t::commit_in_memory(): Set commit_lsn=0 if the log was written. trx_flush_log_if_needed_low(): Renamed to trx_flush_log_if_needed(). Assert that innodb_flush_log_at_trx_commit!=0 was checked by the caller and that the transaction is not in XA PREPARE state. Unconditionally flush the log for data dictionary transactions, to ensure the correct processing of ddl_recovery.log. trx_write_serialisation_history(): Move some code from trx_purge_add_undo_to_history(). trx_prepare(): Invoke log_write_up_to() directly if needed. innobase_commit_ordered_2(): Simplify some conditions. A read-write transaction will always carry nonzero trx_t::id. Let us unconditionally reset mysql_log_file_name, flush_log_later after trx_t::commit() was invoked.
-
Marko Mäkelä authored
trx_commit_cleanup(): Clean up any temporary undo log. Replaces trx_undo_commit_cleanup() and trx_undo_seg_free(). trx_write_serialisation_history(): Commit the mini-transaction. Do not touch temporary undo logs. Assume that a persistent rollback segment has been assigned. trx_serialise(): Merged into trx_write_serialisation_history(). trx_t::commit_low(): Correct some comments and assertions. trx_t::commit_persist(): Only invoke commit_low() on a mini-transaction if the persistent state needs to change.
-
- 24 Aug, 2023 3 commits
-
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
Marko Mäkelä authored
innodb_max_purge_lag_wait_update(): Return immediately if we are in high_level_read_only mode. srv_wake_purge_thread_if_not_active(): Relax a debug assertion. If srv_read_only_mode holds, purge_sys.enabled() will not hold and this function will do nothing. trx_t::commit_in_memory(): Remove a redundant condition before invoking srv_wake_purge_thread_if_not_active().
-
- 23 Aug, 2023 3 commits
-
-
Yuchen Pei authored
-
Yuchen Pei authored
-
Yuchen Pei authored
Spider connection string is a comma-separated parameter definitions, where each definition is of the form "<param_title> <param_value>", where <param_value> is quote delimited on both ends, with backslashes acting as an escaping prefix. Despite the simple syntax, the existing spider connection string parser was poorly-written, complex, hard to reason and error-prone, causing issues like the one described in MDEV-31117. For example it treated param title the same way as param value when assigning, and have nonsensical fields like delim_title_len and delim_title. Thus as part of the bugfix, we clean up the spider comment connection string parsing, including: - Factoring out some code from the parsing function - Simplify the struct `st_spider_param_string_parse` - And any necessary changes caused by the above changes
-
- 22 Aug, 2023 3 commits
-
-
Marko Mäkelä authored
-
Marko Mäkelä authored
-
Marko Mäkelä authored
The test innodb.row_size_error_log_warnings_3 that was added in commit 372b0e63 (MDEV-20194) failed to take into account the earlier adjustment in commit cf574cf5 (MDEV-27634) that is specific to many GNU/Linux distributions for the s390x.
-
- 21 Aug, 2023 5 commits
-
-
Marko Mäkelä authored
In commit 03ca6495 and commit ff5d306e we forgot to remove some Google copyright notices related to a contribution of using atomic memory access in the old InnoDB mutex_t and rw_lock_t implementation. The copyright notices had been mostly added in commit c6232c06 due to commit a1bb700f. The following Google contributions remain: * some logic related to the parameter innodb_io_capacity * innodb_encrypt_tables, added in MariaDB Server 10.1
-
Marko Mäkelä authored
Let us move some #include directives from buf0buf.inl to the compilation units where they are really used.
-
Marko Mäkelä authored
-
Oleksandr Byelkin authored
-
Marko Mäkelä authored
buf_LRU_block_remove_hashed(): Remove a comment that had been added in mysql/mysql-server@aad1c7d0dd8a152ef6bb685356c68ad9978d686a and apparently referring to buf_LRU_invalidate_tablespace(), which was later replaced with buf_LRU_flush_or_remove_pages() and ultimately with buf_flush_remove_pages() and buf_flush_list_space(). All that code is covered by buf_pool.mutex. The note about releasing the hash_lock for the buf_pool.page_hash slice would actually apply to the last reference to hash_lock in buf_LRU_free_page(), for the case zip=false (retaining a ROW_FORMAT=COMPRESSED page while discarding the uncompressed one).
-
- 18 Aug, 2023 1 commit
-
-
Monty authored
MDEV-29693 ANALYZE TABLE still flushes table definition cache when engine-independent statistics is used This commits enables reloading of engine-independent statistics without flushing the table from table definition cache. This is achieved by allowing multiple version of the TABLE_STATISTICS_CB object and having independent pointers to it in TABLE and TABLE_SHARE. The TABLE_STATISTICS_CB object have reference pointers and are freed when no one is pointing to it anymore. TABLE's TABLE_STATISTICS_CB pointer is updated to use the TABLE_SHARE's pointer when read_statistics_for_tables() is called at the beginning of a query. Main changes: - read_statistics_for_table() will allocate an new TABLE_STATISTICS_CB object. - All get_stat_values() functions has a new parameter that tells where collected data should be stored. get_stat_values() are not using the table_field object anymore to store data. - All get_stat_values() functions returns 1 if they found any data in the statistics tables. Other things: - Fixed INSERT DELAYED to not read statistics tables. - Removed Statistics_state from TABLE_STATISTICS_CB as this is not needed anymore as wer are not changing TABLE_SHARE->stats_cb while calculating or loading statistics. - Store values used with store_from_statistical_minmax_field() in TABLE_STATISTICS_CB::mem_root. This allowed me to remove the function delete_stat_values_for_table_share(). - Field_blob::store_from_statistical_minmax_field() is implemented but is not normally used as we do not yet support EIS statistics for blobs. For example Field_blob::update_min() and Field_blob::update_max() are not implemented. Note that the function can be called if there is an concurrent "ALTER TABLE MODIFY field BLOB" running because of a bug in ALTER TABLE where it deletes entries from column_stats before it has an exclusive lock on the table. - Use result of field->val_str(&val) as a pointer to the result instead of val (safetly fix). - Allocate memory for collected statistics in THD::mem_root, not in in TABLE::mem_root. This could cause the TABLE object to grow if a ANALYZE TABLE was run many times on the same table. This was done in allocate_statistics_for_table(), create_min_max_statistical_fields_for_table() and create_min_max_statistical_fields_for_table_share(). - Store in TABLE_STATISTICS_CB::stats_available which statistics was found in the statistics tables. - Removed index_table from class Index_prefix_calc as it was not used. - Added TABLE_SHARE::LOCK_statistics to ensure we don't load EITS in parallel. First thread will load it, others will reuse the loaded data. - Eliminate read_histograms_for_table(). The loading happens within read_statistics_for_tables() if histograms are needed. One downside is that if we have read statistics without histograms before and someone requires histograms, we have to read all statistics again (once) from the statistics tables. A smaller downside is the need to call alloc_root() for each individual histogram. Before we could allocate all the space for histograms with a single alloc_root. - Fixed bug in MyISAM and Aria where they did not properly notice that table had changed after analyze table. This was not a problem before this patch as then the MyISAM and Aria tables where flushed as part of ANALYZE table which did hide this issue. - Fixed a bug in ANALYZE table where table->records could be seen as 0 in collect_statistics_for_table(). The effect of this unlikely bug was that a full table scan could be done even if analyze_sample_percentage was not set to 1. - Changed multiple mallocs in a row to use multi_alloc_root(). - Added a mutex protection in update_statistics_for_table() to ensure that several tables are not updating the statistics at the same time. Some of the changes in sql_statistics.cc are based on a patch from Oleg Smirnov <olernov@gmail.com> Co-authored-by: Oleg Smirnov <olernov@gmail.com> Co-authored-by: Vicentiu Ciorbaru <cvicentiu@gmail.com> Reviewer: Sergei Petrunia <sergey@mariadb.com>
-