1
0
mirror of https://github.com/MariaDB/server.git synced 2025-08-01 03:47:19 +03:00

MDEV-29013 ER_KEY_NOT_FOUND/lock timeout upon online alter with long unique

1. ER_KEY_NOT_FOUND
general replcation problem, already fixed earlier.
test added.

2. ER_LOCK_WAIT_TIMEOUT
This is a long unique specific problem.

Sometimes, lookup_handler is created for to->file. To properly free it,
ha_reset should be called. It is usually done by calling
close_thread_table, but ALTER TABLE makes it differently. Hence, a single
ha_reset call is added to mysql_alter_table.

Also, event_mem_root is removed. Normally, no per-event data should be
allocated on thd->mem_root, that would mean a leak. And otherwise,
lookup_handler is lazily allocated, but its lifetime matches statement,
not event.
This commit is contained in:
Nikita Malyavin
2022-06-29 23:32:19 +03:00
committed by Sergei Golubchik
parent d6e0d29f84
commit 6e0f456090
4 changed files with 89 additions and 12 deletions

View File

@ -11556,12 +11556,6 @@ public:
static int online_alter_read_from_binlog(THD *thd, rpl_group_info *rgi,
Cache_flip_event_log *log)
{
MEM_ROOT event_mem_root;
Query_arena backup_arena;
Query_arena event_arena(&event_mem_root, Query_arena::STMT_INITIALIZED);
init_sql_alloc(key_memory_gdl, &event_mem_root,
MEM_ROOT_BLOCK_SIZE, 0, MYF(0));
int error= 0;
IO_CACHE *log_file= log->flip();
@ -11578,13 +11572,9 @@ static int online_alter_read_from_binlog(THD *thd, rpl_group_info *rgi,
break;
ev->thd= thd;
thd->set_n_backup_active_arena(&event_arena, &backup_arena);
error= ev->apply_event(rgi);
thd->restore_active_arena(&event_arena, &backup_arena);
if (thd->is_error())
error= 1;
event_arena.free_items();
free_root(&event_mem_root, MYF(MY_KEEP_PREALLOC));
if (ev != rgi->rli->relay_log.description_event_for_exec)
delete ev;
thd_progress_report(thd, my_b_tell(log_file), thd->progress.max_counter);