MDEV-5141: Failing assertion: ib_table->stat_initialized in file ha_innodb.cc line 11042 on concurrent ALTER and SELECT from I_S

Analysis: After ALTER TABLE the table statistics needs to be rebuilt and therefore stat_initialized is set false.  It will be rebuilt when the table is loaded again and table is closed when alter table is completed. However, during alter table table could be used by concurrent SELECT from I_S. Therefore, we need to rebuild transient table statistics meanwhile until table can be reloaded.
This commit is contained in:
Jan Lindström 2013-10-17 12:17:32 +03:00
parent 4ceb813970
commit c75e92fd6f
2 changed files with 16 additions and 6 deletions

View File

@ -5004,9 +5004,14 @@ end:
} else {
if (old_is_tmp && !new_is_tmp) {
/* After ALTER TABLE the table statistics
needs to be rebuilt. It will be rebuilt
when the table is loaded again. */
table->stat_initialized = FALSE;
needs to be rebuilt. Even if we close
table below there could be other
transactions using this table (e.g.
SELECT * FROM INFORMATION_SCHEMA.`TABLE_CONSTRAINTS`),
thus we can't remove table from dictionary cache
here. Therefore, we initialize the
transient statistics here. */
dict_stats_update_transient(table);
}
}
}

View File

@ -4295,9 +4295,14 @@ end:
} else {
if (old_is_tmp && !new_is_tmp) {
/* After ALTER TABLE the table statistics
needs to be rebuilt. It will be rebuilt
when the table is loaded again. */
table->stat_initialized = FALSE;
needs to be rebuilt. Even if we close
table below there could be other
transactions using this table (e.g.
SELECT * FROM INFORMATION_SCHEMA.`TABLE_CONSTRAINTS`),
thus we can't remove table from dictionary cache
here. Therefore, we initialize the
transient statistics here. */
dict_stats_update_transient(table);
}
}
}