WL #528: Faster free_tmp_table
This commit is contained in:
parent
efe3703aac
commit
89288fac18
@ -206,6 +206,7 @@ extern int heap_create(const char *name, uint keys, HP_KEYDEF *keydef,
|
|||||||
uint reclength, ulong max_records, ulong min_records,
|
uint reclength, ulong max_records, ulong min_records,
|
||||||
HP_CREATE_INFO *create_info);
|
HP_CREATE_INFO *create_info);
|
||||||
extern int heap_delete_table(const char *name);
|
extern int heap_delete_table(const char *name);
|
||||||
|
extern void heap_drop_table(HP_INFO *info);
|
||||||
extern int heap_extra(HP_INFO *info,enum ha_extra_function function);
|
extern int heap_extra(HP_INFO *info,enum ha_extra_function function);
|
||||||
extern int heap_rename(const char *old_name,const char *new_name);
|
extern int heap_rename(const char *old_name,const char *new_name);
|
||||||
extern int heap_panic(enum ha_panic_function flag);
|
extern int heap_panic(enum ha_panic_function flag);
|
||||||
|
@ -477,6 +477,14 @@ int ha_heap::delete_table(const char *name)
|
|||||||
return error == ENOENT ? 0 : error;
|
return error == ENOENT ? 0 : error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ha_heap::drop_table(const char *name)
|
||||||
|
{
|
||||||
|
heap_drop_table(file);
|
||||||
|
close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int ha_heap::rename_table(const char * from, const char * to)
|
int ha_heap::rename_table(const char * from, const char * to)
|
||||||
{
|
{
|
||||||
return heap_rename(from,to);
|
return heap_rename(from,to);
|
||||||
|
@ -94,6 +94,7 @@ public:
|
|||||||
int indexes_are_disabled(void);
|
int indexes_are_disabled(void);
|
||||||
ha_rows records_in_range(uint inx, key_range *min_key, key_range *max_key);
|
ha_rows records_in_range(uint inx, key_range *min_key, key_range *max_key);
|
||||||
int delete_table(const char *from);
|
int delete_table(const char *from);
|
||||||
|
void drop_table(const char *name);
|
||||||
int rename_table(const char * from, const char * to);
|
int rename_table(const char * from, const char * to);
|
||||||
int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info);
|
int create(const char *name, TABLE *form, HA_CREATE_INFO *create_info);
|
||||||
void update_create_info(HA_CREATE_INFO *create_info);
|
void update_create_info(HA_CREATE_INFO *create_info);
|
||||||
|
@ -2062,6 +2062,14 @@ int handler::rename_table(const char * from, const char * to)
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void handler::drop_table(const char *name)
|
||||||
|
{
|
||||||
|
close();
|
||||||
|
delete_table(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Tell the storage engine that it is allowed to "disable transaction" in the
|
Tell the storage engine that it is allowed to "disable transaction" in the
|
||||||
handler. It is a hint that ACID is not required - it is used in NDB for
|
handler. It is a hint that ACID is not required - it is used in NDB for
|
||||||
|
@ -1288,6 +1288,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual int rename_table(const char *from, const char *to);
|
virtual int rename_table(const char *from, const char *to);
|
||||||
virtual int delete_table(const char *name);
|
virtual int delete_table(const char *name);
|
||||||
|
virtual void drop_table(const char *name);
|
||||||
|
|
||||||
virtual int create(const char *name, TABLE *form, HA_CREATE_INFO *info)=0;
|
virtual int create(const char *name, TABLE *form, HA_CREATE_INFO *info)=0;
|
||||||
virtual int create_handler_files(const char *name) { return FALSE;}
|
virtual int create_handler_files(const char *name) { return FALSE;}
|
||||||
|
@ -8848,16 +8848,8 @@ free_tmp_table(THD *thd, TABLE *entry)
|
|||||||
if (entry->file)
|
if (entry->file)
|
||||||
{
|
{
|
||||||
if (entry->db_stat)
|
if (entry->db_stat)
|
||||||
{
|
entry->file->drop_table(entry->s->table_name);
|
||||||
(void) entry->file->close();
|
else
|
||||||
}
|
|
||||||
/*
|
|
||||||
We can't call ha_delete_table here as the table may created in mixed case
|
|
||||||
here and we have to ensure that delete_table gets the table name in
|
|
||||||
the original case.
|
|
||||||
*/
|
|
||||||
if (!(test_flags & TEST_KEEP_TMP_TABLES) ||
|
|
||||||
entry->s->db_type == DB_TYPE_HEAP)
|
|
||||||
entry->file->delete_table(entry->s->table_name);
|
entry->file->delete_table(entry->s->table_name);
|
||||||
delete entry->file;
|
delete entry->file;
|
||||||
}
|
}
|
||||||
|
@ -234,6 +234,16 @@ static void init_block(HP_BLOCK *block, uint reclength, ulong min_records,
|
|||||||
HP_PTRS_IN_NOD * block->level_info[i - 1].records_under_level);
|
HP_PTRS_IN_NOD * block->level_info[i - 1].records_under_level);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static inline void heap_try_free(HP_SHARE *share)
|
||||||
|
{
|
||||||
|
if (share->open_count == 0)
|
||||||
|
hp_free(share);
|
||||||
|
else
|
||||||
|
share->delete_on_close= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int heap_delete_table(const char *name)
|
int heap_delete_table(const char *name)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
@ -243,10 +253,7 @@ int heap_delete_table(const char *name)
|
|||||||
pthread_mutex_lock(&THR_LOCK_heap);
|
pthread_mutex_lock(&THR_LOCK_heap);
|
||||||
if ((share= hp_find_named_heap(name)))
|
if ((share= hp_find_named_heap(name)))
|
||||||
{
|
{
|
||||||
if (share->open_count == 0)
|
heap_try_free(share);
|
||||||
hp_free(share);
|
|
||||||
else
|
|
||||||
share->delete_on_close= 1;
|
|
||||||
result= 0;
|
result= 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -257,6 +264,17 @@ int heap_delete_table(const char *name)
|
|||||||
DBUG_RETURN(result);
|
DBUG_RETURN(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void heap_drop_table(HP_INFO *info)
|
||||||
|
{
|
||||||
|
DBUG_ENTER("heap_drop_table");
|
||||||
|
pthread_mutex_lock(&THR_LOCK_heap);
|
||||||
|
heap_try_free(info->s);
|
||||||
|
pthread_mutex_unlock(&THR_LOCK_heap);
|
||||||
|
DBUG_VOID_RETURN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void hp_free(HP_SHARE *share)
|
void hp_free(HP_SHARE *share)
|
||||||
{
|
{
|
||||||
heap_share_list= list_delete(heap_share_list, &share->open_list);
|
heap_share_list= list_delete(heap_share_list, &share->open_list);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user