Commit acba7d2f authored by Michael Widenius's avatar Michael Widenius

Fixed MDEV-306 / LP:1007967 - Assertion `table->file->stats.records > 0 ||...

Fixed MDEV-306 / LP:1007967 - Assertion `table->file->stats.records > 0 || error' failed join_read_const_table on concurrent SELECT and DROP/ADD INDEX


sql/sql_table.cc:
  Added comment
storage/maria/ma_close.c:
  Don't store history if it's visible to all.
  This fixed the MDEV-306 bug
storage/maria/ma_delete_table.c:
  Removed old comment
  Delete history state for deleted tables
storage/maria/ma_info.c:
  More DBUG_PRINT
storage/maria/ma_open.c:
  More DBUG_PRINT
parent 28b4aba4
......@@ -7360,7 +7360,10 @@ copy_data_between_tables(THD *thd, TABLE *from,TABLE *to,
thd_progress_next_stage(thd);
if (error > 0)
{
/* We are going to drop the temporary table */
to->file->extra(HA_EXTRA_PREPARE_FOR_DROP);
}
if (errpos >= 3 && to->file->ha_end_bulk_insert() && error <= 0)
{
to->file->print_error(my_errno,MYF(0));
......
......@@ -193,9 +193,10 @@ int maria_close(register MARIA_HA *info)
else
share_can_be_freed= TRUE;
if (share->state_history)
if (share->state_history && share->state_history->trid)
{
MARIA_STATE_HISTORY_CLOSED *history;
DBUG_PRINT("info", ("Storing state history"));
/*
Here we ignore the unlikely case that we don't have memory to
store the state. In the worst case what happens is that any transaction
......
......@@ -38,14 +38,8 @@ int maria_delete_table(const char *name)
/** @todo LOCK take X-lock on table */
/*
We need to know if this table is transactional.
When built with RAID support, we also need to determine if this table
makes use of the raid feature. If yes, we need to remove all raid
chunks. This is done with my_raid_delete(). Unfortunately it is
necessary to open the table just to check this. We use
'open_for_repair' to be able to open even a crashed table. If even
this open fails, we assume no raid configuration for this table
and try to remove the normal data file only. This may however
leave the raid chunks behind.
Unfortunately it is necessary to open the table just to check this. We use
'open_for_repair' to be able to open even a crashed table.
*/
if (!(info= maria_open(name, O_RDONLY, HA_OPEN_FOR_REPAIR)))
{
......@@ -56,6 +50,8 @@ int maria_delete_table(const char *name)
sync_dir= (info->s->now_transactional && !info->s->temporary &&
!maria_in_recovery) ?
MY_SYNC_DIR : 0;
/* Remove history for table */
_ma_reset_state(info);
maria_close(info);
}
......
......@@ -42,6 +42,7 @@ int maria_status(MARIA_HA *info, register MARIA_INFO *x, uint flag)
MY_STAT state;
MARIA_SHARE *share= info->s;
DBUG_ENTER("maria_status");
DBUG_PRINT("info", ("records: %lld", info->state->records));
x->recpos= info->cur_row.lastpos;
if (flag == HA_STATUS_POS)
......
......@@ -866,6 +866,9 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
_ma_remove_not_visible_states(history->state_history, 0, 0);
history->state_history= 0;
(void) my_hash_delete(&maria_stored_state, (uchar*) history);
DBUG_PRINT("info", ("Reading state history. trid: %lu records: %lld",
(ulong) share->state_history->trid,
share->state_history->state.records));
}
else
{
......@@ -988,6 +991,7 @@ MARIA_HA *maria_open(const char *name, int mode, uint open_flags)
mysql_mutex_unlock(&THR_LOCK_maria);
m_info->open_flags= open_flags;
DBUG_PRINT("exit", ("table: %p name: %s",m_info, name));
DBUG_RETURN(m_info);
err:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment