WL #528: Faster free_tmp_table

parent 9b532768
...@@ -206,6 +206,7 @@ extern int heap_create(const char *name, uint keys, HP_KEYDEF *keydef, ...@@ -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) ...@@ -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: ...@@ -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) ...@@ -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: ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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);
......
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