Commit f751ab1a authored by serg@serg.mysql.com's avatar serg@serg.mysql.com

fully functional HANDLER table CLOSE

parent 4fbab1d6
...@@ -430,6 +430,7 @@ bool send_fields(THD *thd,List<Item> &item,uint send_field_count); ...@@ -430,6 +430,7 @@ bool send_fields(THD *thd,List<Item> &item,uint send_field_count);
void free_io_cache(TABLE *entry); void free_io_cache(TABLE *entry);
void intern_close_table(TABLE *entry); void intern_close_table(TABLE *entry);
void close_thread_tables(THD *thd,bool locked=0); void close_thread_tables(THD *thd,bool locked=0);
bool close_thread_table(THD *thd, TABLE **table_ptr);
void close_temporary_tables(THD *thd); void close_temporary_tables(THD *thd);
TABLE **find_temporary_table(THD *thd, const char *db, const char *table_name); TABLE **find_temporary_table(THD *thd, const char *db, const char *table_name);
bool close_temporary_table(THD *thd, const char *db, const char *table_name); bool close_temporary_table(THD *thd, const char *db, const char *table_name);
......
...@@ -421,9 +421,34 @@ void close_thread_tables(THD *thd, bool locked) ...@@ -421,9 +421,34 @@ void close_thread_tables(THD *thd, bool locked)
DBUG_PRINT("info", ("thd->open_tables=%p", thd->open_tables)); DBUG_PRINT("info", ("thd->open_tables=%p", thd->open_tables));
for (table=thd->open_tables ; table ; table=next) while (thd->open_tables)
found_old_table|=close_thread_table(thd, &thd->open_tables);
/* Free tables to hold down open files */
while (open_cache.records > table_cache_size && unused_tables)
VOID(hash_delete(&open_cache,(byte*) unused_tables)); /* purecov: tested */
check_unused();
if (found_old_table)
{ {
next=table->next; /* Tell threads waiting for refresh that something has happened */
VOID(pthread_cond_broadcast(&COND_refresh));
}
if (!locked)
VOID(pthread_mutex_unlock(&LOCK_open));
/* VOID(pthread_sigmask(SIG_SETMASK,&thd->signals,NULL)); */
DBUG_VOID_RETURN;
}
/* move one table to free list */
bool close_thread_table(THD *thd, TABLE **table_ptr)
{
DBUG_ENTER("close_thread_table");
bool found_old_table=0;
TABLE *table=*table_ptr;
*table_ptr=table->next;
if (table->version != refresh_version || if (table->version != refresh_version ||
thd->version != refresh_version || !table->db_stat) thd->version != refresh_version || !table->db_stat)
{ {
...@@ -453,21 +478,7 @@ void close_thread_tables(THD *thd, bool locked) ...@@ -453,21 +478,7 @@ void close_thread_tables(THD *thd, bool locked)
else else
unused_tables=table->next=table->prev=table; unused_tables=table->next=table->prev=table;
} }
} DBUG_RETURN(found_old_table);
thd->open_tables=0;
/* Free tables to hold down open files */
while (open_cache.records > table_cache_size && unused_tables)
VOID(hash_delete(&open_cache,(byte*) unused_tables)); /* purecov: tested */
check_unused();
if (found_old_table)
{
/* Tell threads waiting for refresh that something has happened */
VOID(pthread_cond_broadcast(&COND_refresh));
}
if (!locked)
VOID(pthread_mutex_unlock(&LOCK_open));
/* VOID(pthread_sigmask(SIG_SETMASK,&thd->signals,NULL)); */
DBUG_VOID_RETURN;
} }
/* Close and delete temporary tables */ /* Close and delete temporary tables */
......
...@@ -43,7 +43,7 @@ ...@@ -43,7 +43,7 @@
thd->open_tables=thd->handler_tables; \ thd->open_tables=thd->handler_tables; \
thd->handler_tables=tmp; } thd->handler_tables=tmp; }
static TABLE *find_table_by_name(THD *thd, char *db, char *table_name); static TABLE **find_table_ptr_by_name(THD *thd, char *db, char *table_name);
int mysql_ha_open(THD *thd, TABLE_LIST *tables) int mysql_ha_open(THD *thd, TABLE_LIST *tables)
{ {
...@@ -59,11 +59,11 @@ int mysql_ha_open(THD *thd, TABLE_LIST *tables) ...@@ -59,11 +59,11 @@ int mysql_ha_open(THD *thd, TABLE_LIST *tables)
int mysql_ha_close(THD *thd, TABLE_LIST *tables) int mysql_ha_close(THD *thd, TABLE_LIST *tables)
{ {
/* Perhaps, we should close table here. TABLE **ptr=find_table_ptr_by_name(thd, tables->db, tables->name);
But it's not easy - *tables is a single-linked list, designed
to be closed at all once. if (*ptr)
So, why bother ? All the tables will be closed at thread exit. close_thread_table(thd, ptr);
*/
send_ok(&thd->net); send_ok(&thd->net);
return 0; return 0;
} }
...@@ -77,7 +77,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables, ...@@ -77,7 +77,7 @@ int mysql_ha_read(THD *thd, TABLE_LIST *tables,
ha_rows select_limit,ha_rows offset_limit) ha_rows select_limit,ha_rows offset_limit)
{ {
int err, keyno=-1; int err, keyno=-1;
TABLE *table=find_table_by_name(thd, tables->db, tables->name); TABLE *table=*find_table_ptr_by_name(thd, tables->db, tables->name);
if (!table) if (!table)
{ {
my_printf_error(ER_UNKNOWN_TABLE,ER(ER_UNKNOWN_TABLE),MYF(0), my_printf_error(ER_UNKNOWN_TABLE,ER(ER_UNKNOWN_TABLE),MYF(0),
...@@ -231,19 +231,22 @@ err: ...@@ -231,19 +231,22 @@ err:
/* Note: this function differs from find_locked_table() because we're looking /* Note: this function differs from find_locked_table() because we're looking
here for alias, not real table name here for alias, not real table name
*/ */
static TABLE *find_table_by_name(THD *thd, char *db, char *table_name) static TABLE **find_table_ptr_by_name(THD *thd, char *db, char *table_name)
{ {
int dblen; int dblen;
TABLE **ptr;
if (!db || ! *db) db=thd->db; if (!db || ! *db) db=thd->db;
if (!db || ! *db) db=""; if (!db || ! *db) db="";
dblen=strlen(db); dblen=strlen(db);
ptr=&(thd->handler_tables);
for (TABLE *table=thd->handler_tables; table ; table=table->next) for (TABLE *table=*ptr; table ; table=*ptr)
{ {
if (!memcmp(table->table_cache_key, db, dblen) && if (!memcmp(table->table_cache_key, db, dblen) &&
!my_strcasecmp(table->table_name,table_name)) !my_strcasecmp(table->table_name,table_name))
return table; break;
ptr=&(table->next);
} }
return(0); return ptr;
} }
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