If an undo log page is reused after upgrading from an earlier version to MariaDB 10.3 or 10.4, the TRX_UNDO_PAGE_HDR + TRX_UNDO_PAGE_TYPE in that page could contain the value 1 (TRX_UNDO_INSERT), identifying that undo log page as insert_undo. This would cause an assertion failure on subsequent InnoDB startup if a transaction that was logged to such a page was persisted in an incomplete state:
10.3 397b6b13d062b28d12e9263710224bfb2269f19f
|
mysqld: /mariadb/10.3/storage/innobase/trx/trx0roll.cc:1034: trx_undo_rec_t *trx_roll_pop_top_rec_of_trx(trx_t *, roll_ptr_t *, mem_heap_t *): Assertion `undo == update || undo == temp' failed.
|
This can be prevented by initializing the field in trx_undo_reuse_cached(). Unfortunately, we cannot initialize the entire undo log page, because multiple undo log headers may coexist in the same page.