Commit graph

197230 commits

Author SHA1 Message Date
Thirunarayanan Balathandayuthapani
b18241e059 MDEV-30122 mariabackup.skip_innodb crashes when innodb_undo_tablespaces > 0
- Assign srv_undo_space_id_start when InnoDB opens extra unused
InnoDB undo tablespaces in srv_all_undo_tablespaces_open().
Mariabackup can detect the undo tablespaces using
srv_undo_space_id_start variable
2022-11-29 16:28:40 +05:30
Marko Mäkelä
936436ef43 Merge 10.10 into 10.11 2022-11-28 13:44:42 +02:00
Marko Mäkelä
9e65287042 Merge 10.9 into 10.10 2022-11-28 13:43:41 +02:00
Marko Mäkelä
9abd70e390 Merge 10.8 into 10.9 2022-11-28 13:43:13 +02:00
Marko Mäkelä
6f854d7cfe Merge 10.7 into 10.8 2022-11-28 13:11:43 +02:00
Marko Mäkelä
f124d71ab7 Merge 10.6 into 10.7 2022-11-28 12:22:12 +02:00
Marko Mäkelä
fdc582fd98 Merge 10.5 into 10.6 2022-11-28 12:20:17 +02:00
Marko Mäkelä
bd694bb7b2 MDEV-24412 InnoDB: Upgrade after a crash is not supported
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.
2022-11-28 11:56:09 +02:00
Marko Mäkelä
db14eb16f9 MDEV-30106 InnoDB fails to validate the change buffer on startup
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.
2022-11-28 11:34:22 +02:00
Marko Mäkelä
e0d672f30b MDEV-30089 Metrics not incremented for 1st iteration in buf_LRU_free_from_common_LRU_list()
In commit a03dd94be8 as well as
mysql/mysql-server@6ef8c34344
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.
2022-11-28 11:34:00 +02:00
Daniel Black
183ca823bb MDEV-25417: Remove innodb buffer pool load throttling
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.
2022-11-28 11:25:47 +02:00
Marko Mäkelä
091ac53349 MDEV-29841 fixup: Correct error message translations
This fixes up 0e6f2757d1 and
6f8fb41f21 which corrupted the
Chinese and Spanish translations of the changed error message
ER_PARTITION_WRONG_TYPE.
2022-11-28 09:40:52 +02:00
Brandon Nesterenko
812443c251 MDEV-29607: binlog.binlog_checkpoint fails in buildbot with result content mismatch
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>
2022-11-25 12:45:35 -07:00
Daniel Black
7919b14387 Query cache: removed unused THD from few functions
A few query cache functions don't use THD pointer
so its removed from their interface.
2022-11-26 04:05:19 +11:00
Daniel Black
7141c26094 MDEV-29760: DROP DATABASE hangs when particular query cache is present
Fix the regression introduced in
dfb41fddf6.

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.
2022-11-26 04:05:19 +11:00
Marko Mäkelä
035c4dd3e9 MDEV-14425 fixup for MDEV-25312: Remove dead code
In commit cf552f5886 we removed the
function os_normalize_path() and started writing file names to the
InnoDB redo log always using the same path separator, even on
Microsoft Windows.

In commit 685d958e38 the ability to
recover from previous log file formats was removed. Thus, the log file
can never contain the Microsoft specific path separator and the
conversion code can be removed.

Note: *.isl files may still contain Microsoft Windows path separators.
They will be replaced with standard ones in read_link_file().
2022-11-25 17:20:29 +02:00
Sergei Golubchik
d43153e353 fix password_reuse_check plugin to link in embedded
it uses C client API, so needs RECOMPILE_FOR_EMBEDDED
2022-11-24 22:09:14 +01:00
Marko Mäkelä
05cd10b74c MDEV-29603 fixup: GCC -Wunused-but-set-variable 2022-11-24 16:46:34 +02:00
Marko Mäkelä
604e844944 MDEV-21452 fixup: Remove PFS_NOT_INSTRUMENTED 2022-11-24 15:04:25 +02:00
Marko Mäkelä
71dedd0ebc Merge 10.10 into 10.11 2022-11-24 08:40:16 +02:00
Marko Mäkelä
fc0120d184 Merge 10.9 into 10.10 2022-11-24 08:39:52 +02:00
Marko Mäkelä
d48db97d0a Merge 10.8 into 10.9 2022-11-24 08:35:36 +02:00
Marko Mäkelä
c0439b172a Merge 10.7 into 10.8 2022-11-24 08:35:11 +02:00
Marko Mäkelä
22ab79c430 Merge 10.6 into 10.7 2022-11-24 08:34:45 +02:00
Monty
36fcca635e Fixed a memory leak in aria_read_log 2022-11-24 02:28:36 +02:00
Marko Mäkelä
6d40274f65 Merge 10.5 into 10.6 2022-11-23 18:13:28 +02:00
Marko Mäkelä
165564d3c3 MDEV-30009 InnoDB shutdown hangs when the change buffer is corrupted
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 d7a2401750, refactored for
10.5 in commit 77e8a311e1 and
disabled in commit 310dff5d84
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 310dff5d84
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.
2022-11-23 17:34:05 +02:00
Marko Mäkelä
9d388192c7 Cleanup: Say "mariadbd" instead of "mysqld" in InnoDB messages 2022-11-22 15:32:47 +02:00
Marko Mäkelä
cff9939d09 MDEV-30068 Confusing error message when encryption is not available on recovery
fil_name_process(): If fil_ibd_load() returns FIL_LOAD_INVALID,
display the file name and the tablespace identifier.
2022-11-22 15:31:12 +02:00
Marko Mäkelä
46f8c46e94 MDEV-30069 InnoDB: Trying to write ... bytes at ... outside the bounds
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().
2022-11-22 15:00:26 +02:00
Marko Mäkelä
4e5e8166b4 MDEV-19514 fixup: Fix recovery with innodb_change_buffering_debug=1
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.
2022-11-21 17:55:35 +02:00
Vladislav Vaintroub
377ec1b5c9 Merge branch '10.5' into 10.6
# Conflicts:
#	sql/sql_connect.cc
2022-11-21 12:23:58 +01:00
Vladislav Vaintroub
faee972f18 Merge branch '10.4' into 10.5 2022-11-21 12:09:21 +01:00
Vladislav Vaintroub
3e0fd5e8a7 MDEV-30055 shutdown_now_windows.test fails with "Assertion `unix_sock.fd >= 0' failed."
Remove DBUG_ASSERT that depends on timing.
2022-11-21 11:57:19 +01:00
Vladislav Vaintroub
2a4bd038f7 MDEV-30055 - fix race condition in shutdown_debug.test
Remove DBUG_ASSERT, that depends on timing/scheduling to succeed.
2022-11-21 11:14:54 +01:00
Marko Mäkelä
7933367a27 Merge 10.10 into 10.11 2022-11-21 10:51:10 +02:00
Marko Mäkelä
bebe193979 Merge 10.9 into 10.10 2022-11-21 10:32:08 +02:00
Marko Mäkelä
b35a048ece Merge 10.8 into 10.9 2022-11-21 10:25:38 +02:00
Marko Mäkelä
5b1eb87b6f Merge 10.7 into 10.8 2022-11-21 09:31:12 +02:00
Marko Mäkelä
7f6ddce7eb Merge 10.6 into 10.7 2022-11-21 09:24:05 +02:00
Marko Mäkelä
7889aae886 Cleanup: Define less of bulk insert inline
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().
2022-11-21 09:23:56 +02:00
Marko Mäkelä
549e84b4d5 MDEV-30047 innodb.insert_into_empty fails to delete bulk_store
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 505da21e33 (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.
2022-11-21 09:05:09 +02:00
Marko Mäkelä
6b083ce851 Merge 10.5 into 10.6 2022-11-20 11:35:09 +02:00
Marko Mäkelä
c9ccd978eb Fix clang -Winconsistent-missing-override 2022-11-20 11:33:47 +02:00
Marko Mäkelä
5995ca3166 Merge 10.4 into 10.5 2022-11-20 11:32:59 +02:00
Marko Mäkelä
0d586d62e5 MDEV-29613 fixup: Fix Spider 2022-11-20 11:31:57 +02:00
Marko Mäkelä
f46efb4476 Merge 10.7 into 10.8 2022-11-17 21:35:12 +02:00
Marko Mäkelä
d5332086d7 Merge 10.6 into 10.7 2022-11-17 09:19:32 +02:00
Marko Mäkelä
9aea7d83c8 Merge 10.5 into 10.6 2022-11-17 08:37:35 +02:00
Marko Mäkelä
41028d70f6 MDEV-29982 fixup: Relax the test
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.
2022-11-17 08:33:05 +02:00