mariadb/mysql-test/suite
Vlad Lesin 9c6017474f MDEV-36845 InnoDB: Failing assertion: tail.trx_no <= last_trx_no
The scenario of the bug is the following. Before killing the server some
transaction A starts undo log writing in some undo segment U of rseg R.
It writes its trx_id into the undo log header. Then new trx_id is assigned
to transaction B, but undo log hasn't been started yet. Then transaction
A commits and writes trx_no into its undo log header. Transaction B
starts writing undo log into the undo segment U. So we have the
following undo logs in the undo segments U:

... undo log 1...
... undo log 2...
      ...
undo log A, trx_id: L, trx_no: M, ...
undo log B, trx_id: N, trx_no: 0, ...

Where L < N < M.

Then server is killed.

On recovery the maximum trx_no is extracted from each rseg, and the
maximum trx_no among all rsegs plus one is considered as a new value
for server-wide transaction id/no counter.

For each undo segment of each rseg we read the last undo log header. If
the last undo log is committed, then we read trx_no from the header,
otherwise we treat trx_id as trx_no. The maximum trx_no from all undo
log segments of the current rseg is treated as the maximum trx_no of the
rseg.

For the above case the undo log of transaction B is not committed and
its trx_no is 0. So we read trx_id and treat it as trx_no. But M < N. If
U is the last modified undo segment in rseg R, and trx_(id/no) N is the
maximum trx_no among all rsegs, then there can be the case when after
recovery some transaction with trx_no_C, such as N < trx_no_C <= M, is
committed.

During a purging we store trx_no of the last parsed undo log of a
committed transaction in purge_sys.tail.trx_no. So if the last parsed
undo log is the undo log of transaction A(transaction B was rolled back
on recovery and its undo log was also removed from the undo segment U),
then purse_sys.tail.trx_no = M. Than if some other transaction C with
trx_no_C <= M is being committed and purged, we hit
"tail.trx_no <= last_trx_no" assertion failure in
purge_sys_t::choose_next_log(), because purge queue is min-heap of
(trx_no, trx_sys.rseg_array index) pairs, where the key is trx_no, and it
must not be that trx_no of the last parsed undo log of a committed
transaction is greater than the last trx_no of the rseg at the top of
the queue.

The fix is to read the trx_no of the previous to last undo log in undo
segment, if the last undo log in that undo segment is not committed, and
set trx_no=max(trx_id of the last undo log, trx_no of the previous to
last undo log) during recovery.

We can do this because we need to extract the maximum
value of trx_no or trx_id of the undo log segment, and the maximum value
is either trx_id of the last undo log or trx_no of the previous to
last undo log, because undo segment can be assigned only to the one
transaction at time, and undo logs in the undo segment are ordered by
trx_id.

Reviewed by Marko Mäkelä.
2025-11-19 10:47:07 +03:00
..
archive Merge branch '10.6' into '10.11' 2025-04-16 03:34:40 +02:00
atomic Merge branch '10.6' into 10.11 2025-04-26 10:47:03 +02:00
binlog Merge branch '10.6' into 10.11 2025-10-22 09:44:15 +02:00
binlog_encryption cleanup: select ... into tests 2025-07-17 09:18:18 +02:00
client
compat Merge branch '10.6' into 10.11 2025-01-30 11:55:13 +01:00
csv
encryption MDEV-37299 fixup: cmake -DPLUGIN_PERFSCHEMA=NO 2025-09-30 16:42:58 +03:00
engines MDEV-37375 engines/iuds suite fails with ps-protocol 2025-09-15 11:00:02 +02:00
federated MDEV-29874: FederatedX error 10000 on multi-table UPDATE/DELETE 2025-10-22 15:35:54 +07:00
funcs_1 cleanup: select ... into tests 2025-07-17 09:18:18 +02:00
funcs_2 Merge 10.5 into 10.6 2025-03-26 17:09:57 +02:00
galera MDEV-38073: Always use tx_read_only=false for Wsrep system threads 2025-11-18 11:10:59 +02:00
galera_3nodes MDEV-37816: galera tests failing with Table performance_schema.xxx doesn't exist 2025-10-09 16:01:09 +11:00
galera_3nodes_sr galera mtr tests: synchronization between branches and editions 2025-04-02 04:50:11 +02:00
galera_sr MDEV-34117 : Assertion `! thd->in_sub_stmt' failed in bool trans_rollback_stmt(THD*) 2025-11-03 10:45:56 +02:00
gcol cleanup: select ... into tests 2025-07-17 09:18:18 +02:00
handler Merge branch '10.5' into 10.6 2024-12-17 11:06:09 +11:00
heap Merge branch '10.6' into 10.11 2025-01-30 11:55:13 +01:00
innodb MDEV-36845 InnoDB: Failing assertion: tail.trx_no <= last_trx_no 2025-11-19 10:47:07 +03:00
innodb_fts Merge 10.6 into 10.11 2025-11-11 10:29:45 +02:00
innodb_gis Merge 10.6 into 10.11 2025-10-23 10:38:55 +03:00
innodb_i_s
innodb_zip MDEV-37138: Innochecksum fails to handle doublewrite buffer and 2025-10-13 13:04:53 +05:30
jp
json MDEV-34081: View containing JSON_TABLE does not return JSON 2025-10-22 22:49:26 +05:30
large_tests
maria Merge branch '10.6' into bb-10.11-release 2025-10-27 14:34:43 +01:00
mariabackup MDEV-37520 Failure to detect corruption during backups of Aria table 2025-09-04 18:08:39 +03:00
mtr/t Remove dates from all rdiff files 2025-01-05 16:40:11 +02:00
mtr2
multi_source MDEV-7611: create multi_source.mariadb-dump_slave 2025-07-10 18:31:36 -06:00
optimizer_unfixed_bugs
parts MDEV-37328 Assertion failure in make_empty_rec upon CONVERT PARTITION 2025-07-28 18:06:11 +02:00
perfschema Merge branch '10.6' into bb-10.11-release 2025-10-27 14:34:43 +01:00
perfschema_stress
period Merge branch '10.6' into 10.11 2025-09-12 13:08:40 +02:00
plugins Merge 10.6 into 10.11 2025-10-23 10:38:55 +03:00
roles Merge branch '10.6' into 10.11 2025-01-30 11:55:13 +01:00
rpl Merge branch '10.6' into 10.11 2025-10-22 09:44:15 +02:00
s3 Merge branch '10.6' into 10.11 2025-06-04 14:09:23 +02:00
sql_sequence MDEV-37345 temporary table, ALTER, recreate sequence 2025-10-28 17:49:51 +01:00
storage_engine
stress MDEV-34453 Trying to read 16384 bytes at 70368744161280 outside the bounds of the file: ./ibdata1 2024-09-20 20:26:43 +05:30
sys_vars Merge 10.6 into 10.11 2025-10-23 10:38:55 +03:00
sysschema MDEV-37083: Fixed type mismatch in sys views 2025-07-25 17:02:59 +05:30
unit
vcol Improvements for myisamchk 2025-09-04 18:08:39 +03:00
versioning Merge 10.6 into 10.11 2025-11-11 10:29:45 +02:00
wsrep MDEV-34117 : Assertion `! thd->in_sub_stmt' failed in bool trans_rollback_stmt(THD*) 2025-11-03 10:45:56 +02:00