MDEV-14773 DROP TABLE hangs for InnoDB table with FULLTEXT index
fts_sync(): If the dict_table_t::to_be_dropped flag is set,
do not "goto begin_sync".
Also, clean up the way how dict_index_t::index_fts_syncing
is cleared.
It looks like this regression was introduced by merging
Oracle Bug #24938374 MYSQL CRASHED AFTER LONG WAIT ON DICT OPERATION LOCK
WHILE SYNCING FTS INDEX
068f8261d4
from MySQL 5.6.38 into MariaDB 10.0.33, 10.1.29, 10.2.10.
The same hang is present in MySQL 5.7.20.
This commit is contained in:
parent
4a5c237c76
commit
4a35e76f64
@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2011, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2016, 2017, MariaDB Corporation.
|
||||
Copyright (c) 2016, 2018, MariaDB Corporation.
|
||||
|
||||
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 the Free Software
|
||||
@ -4627,6 +4627,7 @@ begin_sync:
|
||||
ib_vector_get(cache->indexes, i));
|
||||
|
||||
if (index_cache->index->to_be_dropped
|
||||
|| index_cache->index->table->to_be_dropped
|
||||
|| fts_sync_index_check(index_cache)) {
|
||||
continue;
|
||||
}
|
||||
@ -4637,17 +4638,6 @@ begin_sync:
|
||||
end_sync:
|
||||
if (error == DB_SUCCESS && !sync->interrupted) {
|
||||
error = fts_sync_commit(sync);
|
||||
if (error == DB_SUCCESS) {
|
||||
for (i = 0; i < ib_vector_size(cache->indexes); ++i) {
|
||||
fts_index_cache_t* index_cache;
|
||||
index_cache = static_cast<fts_index_cache_t*>(
|
||||
ib_vector_get(cache->indexes, i));
|
||||
if (index_cache->index->index_fts_syncing) {
|
||||
index_cache->index->index_fts_syncing
|
||||
= false;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fts_sync_rollback(sync);
|
||||
}
|
||||
@ -4656,12 +4646,9 @@ end_sync:
|
||||
/* Clear fts syncing flags of any indexes incase sync is
|
||||
interrupeted */
|
||||
for (i = 0; i < ib_vector_size(cache->indexes); ++i) {
|
||||
fts_index_cache_t* index_cache;
|
||||
index_cache = static_cast<fts_index_cache_t*>(
|
||||
ib_vector_get(cache->indexes, i));
|
||||
if (index_cache->index->index_fts_syncing == true) {
|
||||
index_cache->index->index_fts_syncing = false;
|
||||
}
|
||||
static_cast<fts_index_cache_t*>(
|
||||
ib_vector_get(cache->indexes, i))
|
||||
->index->index_fts_syncing = false;
|
||||
}
|
||||
|
||||
sync->interrupted = false;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*****************************************************************************
|
||||
|
||||
Copyright (c) 2011, 2017, Oracle and/or its affiliates. All Rights Reserved.
|
||||
Copyright (c) 2016, 2017, MariaDB Corporation.
|
||||
Copyright (c) 2016, 2018, MariaDB Corporation.
|
||||
|
||||
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 the Free Software
|
||||
@ -4627,6 +4627,7 @@ begin_sync:
|
||||
ib_vector_get(cache->indexes, i));
|
||||
|
||||
if (index_cache->index->to_be_dropped
|
||||
|| index_cache->index->table->to_be_dropped
|
||||
|| fts_sync_index_check(index_cache)) {
|
||||
continue;
|
||||
}
|
||||
@ -4637,17 +4638,6 @@ begin_sync:
|
||||
end_sync:
|
||||
if (error == DB_SUCCESS && !sync->interrupted) {
|
||||
error = fts_sync_commit(sync);
|
||||
if (error == DB_SUCCESS) {
|
||||
for (i = 0; i < ib_vector_size(cache->indexes); ++i) {
|
||||
fts_index_cache_t* index_cache;
|
||||
index_cache = static_cast<fts_index_cache_t*>(
|
||||
ib_vector_get(cache->indexes, i));
|
||||
if (index_cache->index->index_fts_syncing) {
|
||||
index_cache->index->index_fts_syncing
|
||||
= false;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fts_sync_rollback(sync);
|
||||
}
|
||||
@ -4656,12 +4646,9 @@ end_sync:
|
||||
/* Clear fts syncing flags of any indexes incase sync is
|
||||
interrupeted */
|
||||
for (i = 0; i < ib_vector_size(cache->indexes); ++i) {
|
||||
fts_index_cache_t* index_cache;
|
||||
index_cache = static_cast<fts_index_cache_t*>(
|
||||
ib_vector_get(cache->indexes, i));
|
||||
if (index_cache->index->index_fts_syncing == true) {
|
||||
index_cache->index->index_fts_syncing = false;
|
||||
}
|
||||
static_cast<fts_index_cache_t*>(
|
||||
ib_vector_get(cache->indexes, i))
|
||||
->index->index_fts_syncing = false;
|
||||
}
|
||||
|
||||
sync->interrupted = false;
|
||||
|
Loading…
x
Reference in New Issue
Block a user