Skip to content
/ server Public

MDEV-38832 Assertion `!commit_lsn' failed in void trx_t::free()#4650

Open
Thirunarayanan wants to merge 1 commit into11.8from
MDEV-38832
Open

MDEV-38832 Assertion `!commit_lsn' failed in void trx_t::free()#4650
Thirunarayanan wants to merge 1 commit into11.8from
MDEV-38832

Conversation

@Thirunarayanan
Copy link
Member

Problem:

When creating tables with vector indexes, if the secondary table creation fails after the main table is successfully created, the server was not properly cleaning up the main table's .ibd file. When we try to do DROP DATABASE, the server sees an orphaned file and attempts to clean up a "stale" handle. If
innodb_flush_log_later trx_commit=0 is set then the log buffer is written to the file and flushed to disk only once per second. Due to this reason, InnoDB doesn't reset trx->commit_lsn to 0. This lead to assertion failure in trx_t::free()

Reason:

This occurred because create_table_impl() always called ddl_log_complete() on any error, which disables DDL log entries instead of executing them for cleanup. The main table would be left behind even though the overall CREATE TABLE operation failed.

Solution:

ha_create_table(): Return error code 2 specifically when secondary table creation for high-level indexes fails

create_table_impl(): Call ddl_log_revert() when error code is 2 to properly clean up the main table files.

innodb_drop_database(): Add debug assertion reset to clear commit_lsn before freeing the transaction.

@CLAassistant
Copy link

CLA assistant check
Thank you for your submission! We really appreciate it. Like many open source projects, we ask that you sign our Contributor License Agreement before we can accept your contribution.
You have signed the CLA already but the status is still pending? Let us recheck it.

Problem:
========
When creating tables with vector indexes, if the secondary table
creation fails after the main table is successfully created,
the server was not properly cleaning up the main table's .ibd file.
When we try to do DROP DATABASE, the server sees an orphaned file
and attempts to clean up a "stale" handle. If
innodb_flush_log_later trx_commit=0 is set then the log buffer
is written to the file and flushed to disk only once per second.
Due to this reason, InnoDB doesn't reset trx->commit_lsn to 0.
This lead to assertion failure in trx_t::free()

Reason:
=======
This occurred because create_table_impl() always called
ddl_log_complete() on any error, which disables DDL log entries
instead of executing them for cleanup. The main table would be
left behind even though the overall CREATE TABLE operation failed.

Solution:
=========
ha_create_table(): Return error code 2 specifically when
secondary table creation for high-level indexes fails

create_table_impl(): Call ddl_log_revert() when error code is 2
to properly clean up the main table files.

innodb_drop_database(): Add debug assertion reset to clear
commit_lsn before freeing the transaction.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Development

Successfully merging this pull request may close these issues.

2 participants