Console View
|
Categories: connectors experimental galera main |
|
| connectors | experimental | galera | main | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-33480 Windows MSI installer, convert from WIX v3 to supported versions Custom actions : get rid of wcautil and dutil library dependencies They are not an official part of WiX distribution anymore. Replace the functionality with native MSI api, the Wix helpers we used were thin wrappers anyway. Also replace the VBScript FakeFailure custom action with a native one, VBScript is deprecated in Windows and scheduled for removal. Read MSI properties with a helper that handles any length and reports errors. Values are no longer silently truncated to MAX_PATH, e.g a long data directory could be cut to its parent, and then removed. Failed custom actions return ERROR_INSTALL_FAILURE, some failures were silently turned into success before. Use the W versions of MSI functions only. Log() is a function now, so that it works with any preprocessor. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-33480 Windows MSI installer, convert from WIX v3 to supported versions WiX v3 is out of support. Support legacy WiX v3.x (default) and modern WiX (wix.exe, newer than v3). WXS sources stay in v3 format, modern WiX (-DWITH_WIX3=OFF) builds them after on-the-fly 'wix convert'. Two WXS edits make the converted sources valid: ALLUSERS property is replaced by InstallScope='perMachine', and ProgramMenuFolder is moved from under INSTALLDIR to TARGETDIR. WIX_ACCEPT_EULA=ON accepts the EULA of WiX 7 and later, if WiX asks for it. A failed WiX step is reported by name. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CA: ERROR_INSTALL_FAILURE on failure, Log() as a function, W functions only; CMake: name the failed WiX step | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Thirunarayanan Balathandayuthapani
thiru@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-41494 Server aborts on crash recovery after an interrupted instant ALTER TABLE reorders/drops columns Problem: ======== After an instant ALTER TABLE that reorders or drops columns, innobase_instant_try() deletes/updates SYS_COLUMNS, SYS_VIRTUAL and SYS_TABLES.N_COLS, and only afterwards writes the hidden metadata record that describes the old column layout in the clustered index. These are separate mini-transactions within the same DDL transaction. If the server is killed after the SYS_COLUMNS/SYS_TABLES updates were made durable but before the metadata record was written, and recovery does not roll back the transaction then table's dictionary definition and its on-disk metadata record go out of sync. On the next load, btr_cur_instant_init_low() correctly detects this as "missing instant ALTER metadata" or "contains unrecognizable instant ALTER metadata" and sets table->corrupted, but it did not set table->file_unreadable. Since dict_table_t::is_readable() only tests file_unreadable, the table was left in an inconsistent corrupted-but-readable state. Solution: ========= btr_cur_instant_init_low(): Also set index->table->file_unreadable in the "missing instant ALTER metadata" and "incompatible instant ALTER metadata" error paths, consistent with every other corruption path in this function. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Oleksandr Byelkin
sanja@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-32401 expression cache lead to crash if table of wrong type created and the cache switched off 1) take into account TMP_TABLE_ALL_COLUMNS when we are modifying agg_item->result_field 2) remove unused now "bool materialized_subquery;" Co-Authored-By: Claude Opus 5.5 <[email protected]> |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CMake: drop EXTRA_WIX_BUILD_ARGS | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Marko Mäkelä
marko.makela@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fixup! 4898afa8c169aee679661e6848320a7f1c9d890a | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-33480 Windows MSI installer, convert from WIX v3 to supported versions WiX v3 is out of support. Support legacy WiX v3.x (default) and modern WiX (wix.exe, newer than v3). WXS sources stay in v3 format, modern WiX (-DWITH_WIX3=OFF) builds them after on-the-fly 'wix convert'. Two WXS edits make the converted sources valid: ALLUSERS property is replaced by InstallScope='perMachine', and ProgramMenuFolder is moved from under INSTALLDIR to TARGETDIR. WIX_ACCEPT_EULA=ON accepts the EULA of WiX 7 and later, if WiX asks for it. A failed WiX step is reported by name. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
bsrikanth-mariadb
srikanth.bondalapati@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-40598: Capture sequences used only in column DEFAULT expressions Problem: A sequence referenced only in a column's DEFAULT expression (e.g. "a INT DEFAULT NEXTVAL(s1)") is opened only when a statement evaluates DEFAULT values (INSERT, LOAD DATA, etc). A plain SELECT never opens it, so the sequence never appears in thd->lex->query_tables, and Optimizer_context_recorder:: dump_sql_script() had no way to see it. The dependent table's definition was then captured without the sequence it depends on, making the captured context unusable on replay. Fix: TABLE::internal_tables lists these sequences. dump_sql_script() walks it for each dumped table and calls the new dump_sequence_placeholder() for each entry, before the table's CREATE TABLE so that replay can recreate both in order. The sequence is not opened; only its database and name are used, so for now it is captured as a placeholder "CREATE SEQUENCE IF NOT EXISTS db.name" without its parameters or current value. The name is qualified with the sequence's own database, so a sequence in a different database than the table is recreated in that database. Such a placeholder is also remembered in a separate hash. If the query uses the same sequence directly as well, the main loop of dump_sql_script() reaches it later, finds the placeholder, emits "DROP SEQUENCE IF EXISTS db.name", and then dumps the sequence's real definition and current value (SETVAL) as for any sequence used in the query, regardless of the order the tables are listed in. To share code with the existing dump loop, the SETVAL logic of the loop is factored out into dump_sequence_current_value(). Even for the scenarios where sequence is dropped after table creation, a name is replaced by a view, or a user doesn't privilege on the sequence; The name is still captured as a sequence. Tests (opt_context_store_ddls.test): INSERT-opened sequence; plain SELECT; LOCK TABLES; a user without privilege on the sequence; two sequences in one table; dropped sequence; stored function in the query; name replaced by a view; re-execution as a prepared statement; sequence in a different database; sequence used both directly and as a DEFAULT dependency, in both orders. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-33480 Windows MSI installer, convert from WIX v3 to supported versions Custom actions : get rid of wcautil and dutil library dependencies They are not an official part of WiX distribution anymore. Replace the functionality with native MSI api, the Wix helpers we used were thin wrappers anyway. Also replace the VBScript FakeFailure custom action with a native one, VBScript is deprecated in Windows and scheduled for removal. Read MSI properties with a helper that handles any length and reports errors. Values are no longer silently truncated to MAX_PATH, e.g a long data directory could be cut to its parent, and then removed. A custom action that fails to read a property or to call a Windows API returns ERROR_INSTALL_FAILURE, it was silently ignored before. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Oleg Smirnov
olernov@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-32412 Pushdown from HAVING: Item_func is immutable while arguments are not Fix-up for commit e97560eac03 (MDEV-28958), which made set_extraction_flag() ignore basic constants so that the read-only Item_true/Item_false singletons are never written to. Because of that, the callers that mark a subtree with MARKER_IMMUTABLE before pushing a condition from HAVING into WHERE cannot mark basic constants inside it. Item::cleanup_excluding_immutables_processor() did not know about this exception and cleaned such items up, unfixing them while their marked parents stayed fixed. fix_fields() does not descend into fixed items, so the constant was left unfixed and Item_direct_view_ref::used_tables() later dereferenced a NULL null_ref_table. Skip basic constants there too. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Marko Mäkelä
marko.makela@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fixup! 4898afa8c169aee679661e6848320a7f1c9d890a | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Aleksey Midenkov
midenok@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-25176 Shutdown hangs if event scheduler is started during shutdown SET GLOBAL event_scheduler=1 executed by a connection during shutdown could start the scheduler thread after close_connections() called Events::stop(). Nothing stops this thread and close_connections() waits for it forever. Now it hangs instead of a crash since MDEV-30260 fix: it moved deinit() from close_connections() to clean_up(), so the scheduler is not freed under the running thread anymore. The fix makes Event_scheduler::start() do nothing when abort_loop is set. abort_loop is set before close_connections() and is checked under LOCK_scheduler_state, which stop() also takes, so the scheduler is either started before stop() and stopped by it, or not started at all. No error needed: the server is shutting down. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Alexey (Holyfoot) Botchkov
holyfoot@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-40394 XML schema fails on self-referencing type. A schema type that refers to itself, directly or through other types or groups, was validated with a single shared compositor state per type. A nested use of the type reset the state of the outer one, so XMLISVALID() gave wrong results for recursive schemas. Now every recursion level of an XMLSchema_user_type gets its own copy of the type's content (get_copy()/copy_tags()). Copies are kept on a per-type stack while validating, and released copies are put in m_c_free and reused, so memory doesn't grow with each validated row. reset_types() unwinds any state left by a validation that aborted. Other changes: - XMLSchema_item::is_validate_done() is replaced with ::end_validation(st). It is no longer a pure check: it pops the compositor stack and must be paired with validate_prepare(). - validate_prepare() can now fail, and the failure is propagated. - A recursion depth limit (MAX_RECURSION_DEPTH, 1024) is added, counted per type. When it is hit, or on OOM during validation, XMLISVALID() returns errors/warnings. - XMLSchema_group_def now derives from XMLSchema_user_type, so groups get the same copy mechanism. As a side effect <xs:group final=...> is accepted. - XMLSchema_group_reference now counts occurrences, so minOccurs and maxOccurs of a group reference are enforced. - XMLSchema_group_def::check_type() checks for circular groups, and XMLSchema_attribute::check_type() is removed (named types and groups are checked globally). - The circular-reference error names the construct: "complexType B has bad circular references" instead of "type B has ...". The affected .result lines are re-recorded. - Hook chains (m_next_tag) are replaced with List<> because tags are now copied. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-33480 Windows MSI installer, convert from WIX v3 to supported versions WiX v3 is out of support. Support legacy WiX v3.x (default) and modern WiX (wix.exe, newer than v3). WXS sources stay in v3 format, modern WiX (-DWITH_WIX3=OFF) builds them after on-the-fly 'wix convert'. Two WXS edits make the converted sources valid: ALLUSERS property is replaced by InstallScope='perMachine', and ProgramMenuFolder is moved from under INSTALLDIR to TARGETDIR. WIX_ACCEPT_EULA=ON accepts the EULA of WiX 7 and later, if WiX asks for it. A failed WiX step is reported by name. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CA: review fixes, WiX version message | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Khaled Riyad
khaled57.dev@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-41408 MTR prepared statement protocol skipping statements starting with '(' With --ps-protocol, mysqltest runs a SELECT a second time and compares the results. The regex ps2_re only matched a leading SELECT, so a statement starting with '(' was executed only once. Allow any number of '(', each optionally followed by spaces, before SELECT in ps2_re. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-33480 Windows MSI installer, convert from WIX v3 to supported versions Custom actions : get rid of wcautil and dutil library dependencies They are not an official part of WiX distribution anymore. Replace the functionality with native MSI api, the Wix helpers we used were thin wrappers anyway. Also replace the VBScript FakeFailure custom action with a native one, VBScript is deprecated in Windows and scheduled for removal. Read MSI properties with a helper that handles any length and reports errors. Values are no longer silently truncated to MAX_PATH, e.g a long data directory could be cut to its parent, and then removed. A custom action that fails to read a property or to call a Windows API returns ERROR_INSTALL_FAILURE, it was silently ignored before. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-33480 Windows MSI installer, convert from WIX v3 to supported versions Support legacy WiX v3.x (default) and modern WiX (wix.exe, v5 or later). WXS sources stay in v3 format, modern WiX (-DWITH_WIX3=OFF) builds them after on-the-fly 'wix convert'. WIX_ACCEPT_EULA=ON accepts the EULA of WiX 7 and later, if WiX asks for it. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Marko Mäkelä
marko.makela@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Merge 10.11 into 11.4 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Rex Johnston
rex.johnston@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-41179 MAX_KEY_PARTS ranges in select causing SEGV When a select containing 32 ranges is made on a table containing a compound key with 32 parts, the range optimizer can run off the end of a stack variable, invalidly overwriting subsequent stack variables. In the struct st_sel_arg_range_seq, we have an array RANGE_SEQ_ENTRY stack[MAX_REF_PARTS]; MAX_REF_PARTS is 32. check_quick_select / sel_arg_range_seq_init initialises stack[0] as NOT a key part / sel_arg_range_seq_next iterates through the key parts, adding key part n to stack[n+1] key part #32 gets referenced by step_down_to(), setting seq->i off the end of the array. Fix: RANGE_SEQ_ENTRY stack[MAX_REF_PARTS+1]; The above change exposed an issue with key length calculation on MS Windows. Calling make_prev_keypart_map(32) caused the resultant bitmap to be calculated as (1UL << 32) - 1. Using the MSVC compiler this resulted in an empty key length calculation during handler::index_read_map, causing an assertion in ha_innobase::index_read(). As we only need 32 bits to represent our key map, we change the type thus -typedef ulong key_part_map; +typedef uint32 key_part_map; We correct make_keypart_map() and make_prev_keypart_map() to call our overflow safe my_set_bits(). We also correct bka_range_seq_next() and bkah_range_seq_next() to use make_prev_keypart_map(). We also add some DBUG_ASSERTS in key_part_map processing elsewhere, exposing some issues in our BNLH implementation. We cap the number of keyuse parts here, altering the explain output of 2 of our tests. Numerous places needed bit shift operations altered to use make*keymap_part and various format strings needed to be corrected. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Kristian Nielsen
knielsen@knielsen-hq.org |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-41217: Inefficient memory management by parallel slave The rpl_group_info object is used to keep track of a lot of different state in an event group/transaction across events. It is also used in parallel replication for a small set of values that are enqueued by the SQL driver thread for worker threads to handle. This wastes a lot of memory when a large number of event groups are enqueued (eg. in case of slave lag), since most of the rpl_group_info is not used in the queue. This patch changes the queue to contain only the rgi_queued_part object (ie. rgi->q), not the full rgi, saving the memory for the parts of rgi that are not needed in the queue. With this patch, there is one rgi for every worker thread independent of the amount of queued event groups (as well as one serial_rgi in the SQL driver thread). Signed-off-by: Kristian Nielsen <[email protected]> |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Kristian Nielsen
knielsen@knielsen-hq.org |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-41217: Inefficient memory management by parallel slave Remove from rpl_parallel_thread::queued_event the names of relaylog and master binlog. Each one is an array of size FN_REFLEN, thus we save 1024 bytes of memory for each event queued for parallel replication worker threads. This can be a very large saving when the slave is lagging behind and many events are queued for worker threads. Instead, reference these names from the inuse_relaylog object. This already contains the relaylog name; this patch adds also the master binlog name in inuse_relaylog. Since we rotate the slave relaylog whenever we see a master binlog rotate, there can only ever be one master binlog file name associated with events in one relaylog. Signed-off-by: Kristian Nielsen <[email protected]> |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Jan Lindström
jan.lindstrom@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Merge 10.11 to 11.4. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Kristian Nielsen
knielsen@knielsen-hq.org |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Fix inuse_relaylog atomics memory ordering The inuse_relaylog is refcounted. The SQL driver thread first increments queued_count until everything in the relaylog has been queued, then sets completed=true. The worker threads increment dequeued_count, so that once completed==true and queued_count==dequeued_count we know the inuse_relaylog object can be safely de-allocated. The accounting is done with atomic counters; however everything with std::memory_order_relaxed ordering. This is not correct on weakly ordered CPU architectures. When we set completed==true, it most be done with release semantics so that we know that all increments to queued_count will be visible to other threads; this way another thread will not see completed==true with a too low queued_count value. Similarly, when we increment dequeued_count it must be done with release semantics so that previous accesses to inuse_relaylog will have completed before the dequeue is visible to other threads. And the check for completed==true must be done with matching acquire semantics. Signed-off-by: Kristian Nielsen <[email protected]> |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Kristian Nielsen
knielsen@knielsen-hq.org |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-41217: Inefficient memory management by parallel slave Remove from rpl_parallel_thread::queued_event the names of relaylog and master binlog. Each one is an array of size FN_REFLEN, thus we save 1024 bytes of memory for each event queued for parallel replication worker threads. This can be a very large saving when the slave is lagging behind and many events are queued for worker threads. Instead, reference these names from the inuse_relaylog object. This already contains the relaylog name; this patch adds also the master binlog name in inuse_relaylog. Since we rotate the slave relaylog whenever we see a master binlog rotate, there can only ever be one master binlog file name associated with events in one relaylog. Signed-off-by: Kristian Nielsen <[email protected]> |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CMake: link wixca with shell32 and advapi32 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Kristian Nielsen
knielsen@knielsen-hq.org |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Fix inuse_relaylog atomics memory ordering The inuse_relaylog is refcounted. The SQL driver thread first increments queued_count until everything in the relaylog has been queued, then sets completed=true. The worker threads increment dequeued_count, so that once completed==true and queued_count==dequeued_count we know the inuse_relaylog object can be safely de-allocated. The accounting is done with atomic counters; however everything with std::memory_order_relaxed ordering. This is not correct on weakly ordered CPU architectures. When we set completed==true, it most be done with release semantics so that we know that all increments to queued_count will be visible to other threads; this way another thread will not see completed==true with a too low queued_count value. Similarly, when we increment dequeued_count it must be done with release semantics so that previous accesses to inuse_relaylog will have completed before the dequeue is visible to other threads. And the check for completed==true must be done with matching acquire semantics. Signed-off-by: Kristian Nielsen <[email protected]> |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Rex Johnston
rex.johnston@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-41179 MAX_KEY_PARTS ranges in select causing SEGV When a select containing 32 ranges is made on a table containing a compound key with 32 parts, the range optimizer can run off the end of a stack variable, invalidly overwriting subsequent stack variables. In the struct st_sel_arg_range_seq, we have an array RANGE_SEQ_ENTRY stack[MAX_REF_PARTS]; MAX_REF_PARTS is 32. check_quick_select / sel_arg_range_seq_init initialises stack[0] as NOT a key part / sel_arg_range_seq_next iterates through the key parts, adding key part n to stack[n+1] key part #32 gets referenced by step_down_to(), setting seq->i off the end of the array. Fix: RANGE_SEQ_ENTRY stack[MAX_REF_PARTS+1]; The above change exposed an issue with key length calculation on MS Windows. Calling make_prev_keypart_map(32) caused the resultant bitmap to be calculated as (1UL << 32) - 1. Using the MSVC compiler this resulted in an empty key length calculation during handler::index_read_map, causing an assertion in ha_innobase::index_read(). As we only need 32 bits to represent our key map, we change the type thus -typedef ulong key_part_map; +typedef uint32 key_part_map; We correct make_keypart_map() and make_prev_keypart_map() to call our overflow safe my_set_bits(). We also correct bka_range_seq_next() and bkah_range_seq_next() to use make_prev_keypart_map(). We also add some DBUG_ASSERTS in key_part_map processing elsewhere, exposing some issues in our BNLH implementation. We cap the number of keyuse parts here, altering the explain output of 2 of our tests. Numerous places needed bit shift operations altered to use make*keymap_part and various format strings needed to be corrected. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Khaled Riyad
khaled57.dev@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-41408 MTR prepared statement protocol skipping statements starting with '(' With --ps-protocol, mysqltest runs a SELECT a second time and compares the results. The regex ps2_re only matched a leading SELECT, so a statement starting with '(' was executed only once. Allow any number of '(', each optionally followed by spaces, before SELECT in ps2_re. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-33480 Windows MSI installer, convert from WIX v3 to supported versions WiX v3 is out of support. Support legacy WiX v3.x (default) and modern WiX (wix.exe, v5 or later). WXS sources stay in v3 format, modern WiX (-DWITH_WIX3=OFF) builds them after on-the-fly 'wix convert'. WIX_ACCEPT_EULA=ON accepts the EULA of WiX 7 and later, if WiX asks for it. Modern WiX takes extra arguments from the EXTRA_WIX_BUILD_ARGS environment variable, instead of EXTRA_CANDLE_ARGS and EXTRA_LIGHT_ARGS. A failed WiX step is reported by name. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Kristian Nielsen
knielsen@knielsen-hq.org |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-41217: Inefficient memory management by parallel slave The rpl_group_info object is used to keep track of a lot of different state in an event group/transaction across events. It is also used in parallel replication for a small set of values that are enqueued by the SQL driver thread for worker threads to handle. This wastes a lot of memory when a large number of event groups are enqueued (eg. in case of slave lag), since most of the rpl_group_info is not used in the queue. This is a preparatory patch that splits out the part of rpl_group_info that is needed for the enqueueing into a separate rgi_queued_part object, without any functional or logic changes. This to separate a lot of mechanical changes from the actual logic modification for easier review: - Introduce struct rgi_queued_part and move a bunch of fields XXX into it from rpl_group_info. - Introduce rpl_group_info::q pointing to rgi_queued_part and allocate it in the constructor. - Change references like rgi->XXX into rgi->q->XXX. This refactoring provides the basis for a follow-up patch where parallel replication is changes so only the rgi_queued_part object is put in the queue, not the whole rpl_group_info. Signed-off-by: Kristian Nielsen <[email protected]> |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Rex Johnston
rex.johnston@mariadb.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-41179 MAX_KEY_PARTS ranges in select causing SEGV When a select containing 32 ranges is made on a table containing a compound key with 32 parts, the range optimizer can run off the end of a stack variable, invalidly overwriting subsequent stack variables. In the struct st_sel_arg_range_seq, we have an array RANGE_SEQ_ENTRY stack[MAX_REF_PARTS]; MAX_REF_PARTS is 32. check_quick_select / sel_arg_range_seq_init initialises stack[0] as NOT a key part / sel_arg_range_seq_next iterates through the key parts, adding key part n to stack[n+1] key part #32 gets referenced by step_down_to(), setting seq->i off the end of the array. Fix: RANGE_SEQ_ENTRY stack[MAX_REF_PARTS+1]; The above change exposed an issue with key length calculation on MS Windows. Calling make_prev_keypart_map(32) caused the resultant bitmap to be calculated as (1UL << 32) - 1. Using the MSVC compiler this resulted in an empty key length calculation during handler::index_read_map, causing an assertion in ha_innobase::index_read(). As we only need 32 bits to represent our key map, we change the type thus -typedef ulong key_part_map; +typedef uint32 key_part_map; We correct make_keypart_map() and make_prev_keypart_map() to call our overflow safe my_set_bits(). We also correct bka_range_seq_next() and bkah_range_seq_next() to use make_prev_keypart_map(). We also add some DBUG_ASSERTS in key_part_map processing elsewhere, exposing some issues in our BNLH implementation. We cap the number of keyuse parts here, altering the explain output of 2 of our tests. Numerous places needed bit shift operations altered to use make*keymap_part and various format strings needed to be corrected. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-33480 Windows MSI installer, convert from WIX v3 to supported versions Custom actions : get rid of wcautil and dutil library dependencies They are not an official part of WiX distribution anymore. Replace the functionality with native MSI api, the Wix helpers we used were thin wrappers anyway. Also replace the VBScript FakeFailure custom action with a native one, VBScript is deprecated in Windows and scheduled for removal. Read MSI properties with a helper that handles any length and reports errors. Values are no longer silently truncated to MAX_PATH, e.g a long data directory could be cut to its parent, and then removed. A custom action that fails to read a property or to call a Windows API returns ERROR_INSTALL_FAILURE, it was silently ignored before. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| CMake: drop EXTRA_WIX_BUILD_ARGS | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Aleksey Midenkov
midenok@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-30441 ASAN heap-use-after-free in Field_blob::pack/pack_row When InnoDB computes an indexed virtual column (e.g. the long unique hash), TABLE::update_virtual_field() walked its expression with update_vcol_processor() and recomputed every vcol it referenced, including STORED ones. innobase_allocate_row_for_vcol() saves and restores Field_blob::value only for non-stored blob vcols, so recomputing a STORED blob vcol in Field_blob::store_field() did val_str(&value) and freed the buffer that record[0] still pointed to. The row-format binlog then packed record[0] from freed memory. The buffer is allocated only when the value is converted, so the bug needs a character set conversion (e.g. BLOB to utf8mb3 TEXT). The fix skips STORED vcols in update_vcol_processor(). Their values are already in the record: InnoDB copies them as base columns of the virtual column, and the SQL layer computes them before writing. The test cases detect the bug only under ASAN or Valgrind. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-33480 Windows MSI installer, convert from WIX v3 to supported versions WiX v3 is out of support. Support legacy WiX v3.x (default) and modern WiX (wix.exe, v5 or later). WXS sources stay in v3 format, modern WiX (-DWITH_WIX3=OFF) builds them after on-the-fly 'wix convert'. WIX_ACCEPT_EULA=ON accepts the EULA of WiX 7 and later, if WiX asks for it. A failed WiX step is reported by name. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Vladislav Vaintroub
vvaintroub@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-33480 Windows MSI installer, convert from WIX v3 to supported versions WiX v3 is out of support. Support legacy WiX v3.x (default) and modern WiX (wix.exe, v5 or later). WXS sources stay in v3 format, modern WiX (-DWITH_WIX3=OFF) builds them after on-the-fly 'wix convert'. WIX_ACCEPT_EULA=ON accepts the EULA of WiX 7 and later, if WiX asks for it. A failed WiX step is reported by name. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Khaled Riyad
khaled57.dev@gmail.com |
|
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
MDEV-41408 MTR prepared statement protocol skipping statements starting with '(' With --ps-protocol, mysqltest runs a SELECT a second time and compares the results. The regex ps2_re only matched a leading SELECT, so a statement starting with '(' was executed only once. Allow any number of '(', each optionally followed by spaces, before SELECT in ps2_re. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||