mirror of
https://github.com/MariaDB/server.git
synced 2025-07-18 23:03:28 +03:00
MDEV-26127 Assertion `err != DB_DUPLICATE_KEY' failed or InnoDB: Failing assertion: id != 0 on ALTER ... REBUILD PARTITION
During rebuild of partition, the partitioning engine calls alter_close_table(), which does not unlock and close some table instances of the target table. Then, the engine fails to rename partitions because there are table instances that are still locked. Closing all the table instance of the target table fixes the bug.
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2005, 2017, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2018, MariaDB
|
||||
Copyright (c) 2009, 2022, MariaDB
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -6929,14 +6929,29 @@ static void alter_partition_lock_handling(ALTER_PARTITION_PARAM_TYPE *lpt)
|
||||
|
||||
static int alter_close_table(ALTER_PARTITION_PARAM_TYPE *lpt)
|
||||
{
|
||||
THD *thd= lpt->thd;
|
||||
TABLE_SHARE *share= lpt->table->s;
|
||||
DBUG_ENTER("alter_close_table");
|
||||
|
||||
if (lpt->table->db_stat)
|
||||
{
|
||||
mysql_lock_remove(lpt->thd, lpt->thd->lock, lpt->table);
|
||||
lpt->table->file->ha_close();
|
||||
lpt->table->db_stat= 0; // Mark file closed
|
||||
}
|
||||
TABLE *table= thd->open_tables;
|
||||
do {
|
||||
table= find_locked_table(table, share->db.str, share->table_name.str);
|
||||
if (!table)
|
||||
{
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
if (table->db_stat)
|
||||
{
|
||||
mysql_lock_remove(thd, thd->lock, table);
|
||||
if (int error= table->file->ha_close())
|
||||
{
|
||||
DBUG_RETURN(error);
|
||||
}
|
||||
table->db_stat= 0; // Mark file closed
|
||||
}
|
||||
} while ((table= table->next));
|
||||
|
||||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user