43
44
#include <drizzled/replication_services.h>
44
45
#include <drizzled/check_stack_overrun.h>
45
46
#include <drizzled/lock.h>
46
#include <drizzled/plugin/listen.h>
47
#include "drizzled/cached_directory.h"
48
#include <drizzled/field/epoch.h>
49
#include <drizzled/field/null.h>
50
#include "drizzled/sql_table.h"
51
#include "drizzled/global_charset_info.h"
52
#include "drizzled/pthread_globals.h"
53
#include "drizzled/internal/iocache.h"
54
#include "drizzled/drizzled.h"
55
#include "drizzled/plugin/authorization.h"
56
#include "drizzled/table/temporary.h"
57
#include "drizzled/table/placeholder.h"
58
#include "drizzled/table/unused.h"
59
#include "drizzled/plugin/storage_engine.h"
61
#include <drizzled/refresh_version.h>
47
#include <drizzled/slot/listen.h>
48
#include <mysys/cached_directory.h>
63
50
using namespace std;
68
extern bool volatile shutdown_in_progress;
51
using namespace drizzled;
53
extern drizzled::ReplicationServices replication_services;
55
bool drizzle_rm_tmp_tables(slot::Listen &listen_handler);
58
@defgroup Data_Dictionary Data Dictionary
61
Table *unused_tables; /* Used by mysql_test */
62
HASH open_cache; /* Used by mysql_test */
63
static int open_unireg_entry(Session *session, Table *entry, TableList *table_list,
65
char *cache_key, uint32_t cache_key_length);
68
void free_cache_entry(void *entry);
69
unsigned char *table_cache_key(const unsigned char *record,
72
unsigned char *table_def_key(const unsigned char *record,
79
unsigned char *table_cache_key(const unsigned char *record,
83
Table *entry=(Table*) record;
84
*length= entry->s->table_cache_key.length;
85
return (unsigned char*) entry->s->table_cache_key.str;
70
89
bool table_cache_init(void)
75
uint32_t cached_open_tables(void)
77
return table::getCache().size();
91
return hash_init(&open_cache, &my_charset_bin,
92
(size_t) table_cache_size+16,
93
0, 0, table_cache_key,
80
97
void table_cache_free(void)
82
99
refresh_version++; // Force close of open tables
84
table::getUnused().clear();
85
table::getCache().clear();
101
while (unused_tables)
102
hash_delete(&open_cache,(unsigned char*) unused_tables);
104
if (!open_cache.records) // Safety first
105
hash_free(&open_cache);
108
uint32_t cached_open_tables(void)
110
return open_cache.records;
89
Close cursor handle, but leave the table in the table cache
115
Close file handle, but leave the table in the table cache
92
118
close_handle_and_leave_table_as_lock()
96
122
By leaving the table in the table cache, it disallows any other thread
99
session->getKilled() will be set if we run out of memory
125
session->killed will be set if we run out of memory
101
127
If closing a MERGE child, the calling function has to take care for
102
128
closing the parent too, if necessary.
106
132
void close_handle_and_leave_table_as_lock(Table *table)
134
TableShare *share, *old_share= table->s;
136
MEM_ROOT *mem_root= &table->mem_root;
108
138
assert(table->db_stat);
109
assert(table->getShare()->getType() == message::Table::STANDARD);
112
141
Make a local copy of the table share and free the current one.
113
142
This has to be done to ensure that the table share is removed from
114
143
the table defintion cache as soon as the last instance is removed
116
identifier::Table identifier(table->getShare()->getSchemaName(), table->getShare()->getTableName(), message::Table::INTERNAL);
117
const identifier::Table::Key &key(identifier.getKey());
118
TableShare *share= new TableShare(identifier.getType(),
120
const_cast<char *>(key.vector()), static_cast<uint32_t>(table->getShare()->getCacheKeySize()));
122
table->cursor->close();
123
table->db_stat= 0; // Mark cursor closed
124
table::instance::release(table->getMutableShare());
125
table->setShare(share);
145
if (multi_alloc_root(mem_root,
146
&share, sizeof(*share),
147
&key_buff, old_share->table_cache_key.length,
150
memset(share, 0, sizeof(*share));
151
share->set_table_cache_key(key_buff, old_share->table_cache_key.str,
152
old_share->table_cache_key.length);
153
share->tmp_table= INTERNAL_TMP_TABLE; // for intern_close_table()
156
table->file->close();
157
table->db_stat= 0; // Mark file closed
158
TableShare::release(table->s);
160
table->file->change_table_ptr(table, table->s);
166
Create a list for all open tables matching SQL expression
170
wild SQL like expression
173
One gets only a list of tables for which one has any kind of privilege.
174
db and table names are allocated in result struct, so one doesn't need
175
a lock on LOCK_open when traversing the return list.
181
bool list_open_tables(const char *db, const char *wild, bool(*func)(Table *table, open_table_list_st& open_list), Table *display)
183
vector<open_table_list_st> open_list;
184
vector<open_table_list_st>::iterator it;
185
open_table_list_st table;
187
/* What we really need is an optimization for knowing unique tables */
189
open_list.reserve(sizeof(open_table_list_st) * (open_cache.records % 2));
191
open_list.reserve(sizeof(open_table_list_st) * open_cache.records);
193
pthread_mutex_lock(&LOCK_open); /* List all open tables */
195
for (uint32_t idx= 0; idx < open_cache.records; idx++)
198
Table *entry=(Table*) hash_element(&open_cache,idx);
200
if (db && my_strcasecmp(system_charset_info, db, entry->s->db.str))
202
if (wild && wild_compare(entry->s->table_name.str, wild, 0))
205
for (it= open_list.begin(); it < open_list.end(); it++)
207
if (!(*it).table.compare(entry->s->table_name.str) &&
208
!(*it).db.compare(entry->s->db.str))
212
if (entry->locked_by_name)
224
table.db= entry->s->db.str;
225
table.table= entry->s->table_name.str;
226
open_list.push_back(table);
228
pthread_mutex_unlock(&LOCK_open);
230
for (it= open_list.begin(); it < open_list.end(); it++)
232
if (func(display, *it))
129
239
/*****************************************************************************
130
240
* Functions to free open table cache
173
310
bool result= false;
174
311
Session *session= this;
177
boost::mutex::scoped_lock scopedLock(table::Cache::singleton().mutex()); /* Optionally lock for remove tables from open_cahe if not in use */
181
refresh_version++; // Force close of open tables
183
table::getUnused().clear();
185
if (wait_for_refresh)
313
pthread_mutex_lock(&LOCK_open); /* Optionally lock for remove tables from open_cahe if not in use */
317
refresh_version++; // Force close of open tables
318
while (unused_tables)
319
hash_delete(&open_cache,(unsigned char*) unused_tables);
321
if (wait_for_refresh)
324
Other threads could wait in a loop in open_and_lock_tables(),
325
trying to lock one or more of our tables.
327
If they wait for the locks in thr_multi_lock(), their lock
328
request is aborted. They loop in open_and_lock_tables() and
329
enter open_table(). Here they notice the table is refreshed and
330
wait for COND_refresh. Then they loop again in
331
openTablesLock() and this time open_table() succeeds. At
332
this moment, if we (the FLUSH TABLES thread) are scheduled and
333
on another FLUSH TABLES enter close_cached_tables(), they could
334
awake while we sleep below, waiting for others threads (us) to
335
close their open tables. If this happens, the other threads
336
would find the tables unlocked. They would get the locks, one
337
after the other, and could do their destructive work. This is an
338
issue if we have LOCK TABLES in effect.
340
The problem is that the other threads passed all checks in
341
open_table() before we refresh the table.
343
The fix for this problem is to set some_tables_deleted for all
344
threads with open tables. These threads can still get their
345
locks, but will immediately release them again after checking
346
this variable. They will then loop in openTablesLock()
347
again. There they will wait until we update all tables version
350
Setting some_tables_deleted is done by remove_table_from_cache()
353
In other words (reviewer suggestion): You need this setting of
354
some_tables_deleted for the case when table was opened and all
355
related checks were passed before incrementing refresh_version
356
(which you already have) but attempt to lock the table happened
357
after the call to Session::close_old_data_files() i.e. after removal of
358
current thread locks.
360
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
362
Table *table=(Table*) hash_element(&open_cache,idx);
364
table->in_use->some_tables_deleted= false;
371
for (TableList *table= tables; table; table= table->next_local)
373
if (remove_table_from_cache(session, table->db, table->table_name,
374
RTFC_OWNED_BY_Session_FLAG))
378
wait_for_refresh= false; // Nothing to wait for
381
if (wait_for_refresh)
384
If there is any table that has a lower refresh_version, wait until
385
this is closed (or this thread is killed) before returning
387
session->mysys_var->current_mutex= &LOCK_open;
388
session->mysys_var->current_cond= &COND_refresh;
389
session->set_proc_info("Flushing tables");
391
session->close_old_data_files();
394
/* Wait until all threads has closed all the tables we had locked */
395
while (found && ! session->killed)
398
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
400
Table *table=(Table*) hash_element(&open_cache,idx);
401
/* Avoid a self-deadlock. */
402
if (table->in_use == session)
188
Other threads could wait in a loop in open_and_lock_tables(),
189
trying to lock one or more of our tables.
191
If they wait for the locks in thr_multi_lock(), their lock
192
request is aborted. They loop in open_and_lock_tables() and
193
enter open_table(). Here they notice the table is refreshed and
194
wait for COND_refresh. Then they loop again in
195
openTablesLock() and this time open_table() succeeds. At
196
this moment, if we (the FLUSH TABLES thread) are scheduled and
197
on another FLUSH TABLES enter close_cached_tables(), they could
198
awake while we sleep below, waiting for others threads (us) to
199
close their open tables. If this happens, the other threads
200
would find the tables unlocked. They would get the locks, one
201
after the other, and could do their destructive work. This is an
202
issue if we have LOCK TABLES in effect.
204
The problem is that the other threads passed all checks in
205
open_table() before we refresh the table.
207
The fix for this problem is to set some_tables_deleted for all
208
threads with open tables. These threads can still get their
209
locks, but will immediately release them again after checking
210
this variable. They will then loop in openTablesLock()
211
again. There they will wait until we update all tables version
214
Setting some_tables_deleted is done by table::Cache::singleton().removeTable()
217
In other words (reviewer suggestion): You need this setting of
218
some_tables_deleted for the case when table was opened and all
219
related checks were passed before incrementing refresh_version
220
(which you already have) but attempt to lock the table happened
221
after the call to Session::close_old_data_files() i.e. after removal of
222
current thread locks.
405
Note that we wait here only for tables which are actually open, and
406
not for placeholders with Table::open_placeholder set. Waiting for
407
latter will cause deadlock in the following scenario, for example:
409
conn1: lock table t1 write;
410
conn2: lock table t2 write;
414
It also does not make sense to wait for those of placeholders that
415
are employed by CREATE TABLE as in this case table simply does not
224
for (table::CacheMap::const_iterator iter= table::getCache().begin();
225
iter != table::getCache().end();
228
Table *table= (*iter).second;
230
table->in_use->some_tables_deleted= false;
237
for (TableList *table= tables; table; table= table->next_local)
239
identifier::Table identifier(table->getSchemaName(), table->getTableName());
240
if (table::Cache::singleton().removeTable(session, identifier,
241
RTFC_OWNED_BY_Session_FLAG))
418
if (table->needs_reopen_or_name_lock() && (table->db_stat ||
419
(table->open_placeholder && wait_for_placeholders)))
422
pthread_cond_wait(&COND_refresh,&LOCK_open);
247
wait_for_refresh= false; // Nothing to wait for
428
No other thread has the locked tables open; reopen them and get the
429
old locks. This should always succeed (unless some external process
430
has removed the tables)
432
result= session->reopen_tables(true, true);
250
if (wait_for_refresh)
434
/* Set version for table */
435
for (Table *table= session->open_tables; table ; table= table->next)
253
If there is any table that has a lower refresh_version, wait until
254
this is closed (or this thread is killed) before returning
256
session->mysys_var->current_mutex= &table::Cache::singleton().mutex();
257
session->mysys_var->current_cond= &COND_refresh;
258
session->set_proc_info("Flushing tables");
260
session->close_old_data_files();
263
/* Wait until all threads has closed all the tables we had locked */
264
while (found && ! session->getKilled())
267
for (table::CacheMap::const_iterator iter= table::getCache().begin();
268
iter != table::getCache().end();
271
Table *table= (*iter).second;
272
/* Avoid a self-deadlock. */
273
if (table->in_use == session)
276
Note that we wait here only for tables which are actually open, and
277
not for placeholders with Table::open_placeholder set. Waiting for
278
latter will cause deadlock in the following scenario, for example:
280
conn1-> lock table t1 write;
281
conn2-> lock table t2 write;
282
conn1-> flush tables;
283
conn2-> flush tables;
285
It also does not make sense to wait for those of placeholders that
286
are employed by CREATE TABLE as in this case table simply does not
289
if (table->needs_reopen_or_name_lock() && (table->db_stat ||
290
(table->open_placeholder && wait_for_placeholders)))
293
COND_refresh.wait(scopedLock);
299
No other thread has the locked tables open; reopen them and get the
300
old locks. This should always succeed (unless some external process
301
has removed the tables)
303
result= session->reopen_tables();
305
/* Set version for table */
306
for (Table *table= session->open_tables; table ; table= table->getNext())
309
Preserve the version (0) of write locked tables so that a impending
310
global read lock won't sneak in.
312
if (table->reginfo.lock_type < TL_WRITE_ALLOW_WRITE)
313
table->getMutableShare()->refreshVersion();
438
Preserve the version (0) of write locked tables so that a impending
439
global read lock won't sneak in.
441
if (table->reginfo.lock_type < TL_WRITE_ALLOW_WRITE)
442
table->s->version= refresh_version;
446
pthread_mutex_unlock(&LOCK_open);
318
448
if (wait_for_refresh)
320
boost_unique_lock_t scopedLock(session->mysys_var->mutex);
450
pthread_mutex_lock(&session->mysys_var->mutex);
321
451
session->mysys_var->current_mutex= 0;
322
452
session->mysys_var->current_cond= 0;
323
453
session->set_proc_info(0);
454
pthread_mutex_unlock(&session->mysys_var->mutex);
524
void Open_tables_state::doGetTableNames(const identifier::Schema &schema_identifier,
525
std::set<std::string>& set_of_names)
527
for (Table *table= getTemporaryTables() ; table ; table= table->getNext())
529
if (schema_identifier.compare(table->getShare()->getSchemaName()))
531
set_of_names.insert(table->getShare()->getTableName());
536
void Open_tables_state::doGetTableNames(CachedDirectory &,
537
const identifier::Schema &schema_identifier,
538
std::set<std::string> &set_of_names)
540
doGetTableNames(schema_identifier, set_of_names);
543
void Open_tables_state::doGetTableIdentifiers(const identifier::Schema &schema_identifier,
544
identifier::Table::vector &set_of_identifiers)
546
for (Table *table= getTemporaryTables() ; table ; table= table->getNext())
548
if (schema_identifier.compare(table->getShare()->getSchemaName()))
550
set_of_identifiers.push_back(identifier::Table(table->getShare()->getSchemaName(),
551
table->getShare()->getTableName(),
552
table->getShare()->getPath()));
557
void Open_tables_state::doGetTableIdentifiers(CachedDirectory &,
558
const identifier::Schema &schema_identifier,
559
identifier::Table::vector &set_of_identifiers)
561
doGetTableIdentifiers(schema_identifier, set_of_identifiers);
564
bool Open_tables_state::doDoesTableExist(const identifier::Table &identifier)
566
for (Table *table= getTemporaryTables() ; table ; table= table->getNext())
568
if (table->getShare()->getType() == message::Table::TEMPORARY)
570
if (identifier.getKey() == table->getShare()->getCacheKey())
580
int Open_tables_state::doGetTableDefinition(const identifier::Table &identifier,
581
message::Table &table_proto)
583
for (Table *table= getTemporaryTables() ; table ; table= table->getNext())
585
if (table->getShare()->getType() == message::Table::TEMPORARY)
587
if (identifier.getKey() == table->getShare()->getCacheKey())
589
table_proto.CopyFrom(*(table->getShare()->getTableMessage()));
599
Table *Open_tables_state::find_temporary_table(const identifier::Table &identifier)
601
for (Table *table= temporary_tables ; table ; table= table->getNext())
603
if (identifier.getKey() == table->getShare()->getCacheKey())
659
Table *Session::find_temporary_table(const char *new_db, const char *table_name)
661
char key[MAX_DBKEY_LENGTH];
665
key_length= TableShare::createKey(key, new_db, table_name);
667
for (table= temporary_tables ; table ; table= table->next)
669
if (table->s->table_cache_key.length == key_length &&
670
!memcmp(table->s->table_cache_key.str, key, key_length))
607
673
return NULL; // Not a temporary table
676
Table *Session::find_temporary_table(TableList *table_list)
678
return find_temporary_table(table_list->db, table_list->table_name);
612
683
Drop a temporary table.
634
705
@retval -1 the table is in use by a outer query
637
int Open_tables_state::drop_temporary_table(const drizzled::identifier::Table &identifier)
708
int Session::drop_temporary_table(TableList *table_list)
641
if (not (table= find_temporary_table(identifier)))
712
if (!(table= find_temporary_table(table_list)))
644
715
/* Table might be in use by some outer statement. */
645
if (table->query_id && table->query_id != getQueryId())
716
if (table->query_id && table->query_id != query_id)
647
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->getAlias());
718
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->alias);
651
close_temporary_table(table);
722
close_temporary_table(table, true, true);
728
/* move table first in unused links */
730
static void relink_unused(Table *table)
732
if (table != unused_tables)
734
table->prev->next=table->next; /* Remove from unused list */
735
table->next->prev=table->prev;
736
table->next=unused_tables; /* Link in unused tables */
737
table->prev=unused_tables->prev;
738
unused_tables->prev->next=table;
739
unused_tables->prev=table;
658
746
Remove all instances of table from thread's open list and
661
749
@param session Thread context
662
750
@param find Table to remove
664
@note because we risk the chance of deleting the share, we can't assume that it will exist past, this should be modified once we can use a TableShare::shared_ptr here.
667
753
void Session::unlink_open_table(Table *find)
669
const identifier::Table::Key find_key(find->getShare()->getCacheKey());
671
safe_mutex_assert_owner(table::Cache::singleton().mutex().native_handle());
755
char key[MAX_DBKEY_LENGTH];
756
uint32_t key_length= find->s->table_cache_key.length;
759
safe_mutex_assert_owner(&LOCK_open);
761
memcpy(key, find->s->table_cache_key.str, key_length);
674
Note that we need to hold table::Cache::singleton().mutex() while changing the
763
Note that we need to hold LOCK_open while changing the
675
764
open_tables list. Another thread may work on it.
676
(See: table::Cache::singleton().removeTable(), wait_completed_table())
765
(See: remove_table_from_cache(), mysql_wait_completed_table())
677
766
Closing a MERGE child before the parent would be fatal if the
678
767
other thread tries to abort the MERGE lock in between.
680
769
for (prev= &open_tables; *prev; )
684
if (list->getShare()->getCacheKey() == find_key)
773
if (list->s->table_cache_key.length == key_length &&
774
!memcmp(list->s->table_cache_key.str, key, key_length))
686
776
/* Remove table from open_tables list. */
687
*prev= list->getNext();
689
778
/* Close table. */
690
table::remove_table(static_cast<table::Concurrent *>(list));
779
hash_delete(&open_cache,(unsigned char*) list); // Close table
694
783
/* Step to next entry in open_tables list. */
695
prev= list->getNextPtr();
699
788
// Notify any 'refresh' threads
700
locking::broadcast_refresh();
746
836
wait_for_condition()
747
session Thread Cursor
837
session Thread handler
748
838
mutex mutex that is currently hold that is associated with condition
749
839
Will be unlocked on return
750
840
cond Condition to wait for
753
void Session::wait_for_condition(boost::mutex &mutex, boost::condition_variable_any &cond)
843
void Session::wait_for_condition(pthread_mutex_t *mutex, pthread_cond_t *cond)
755
845
/* Wait until the current table is up to date */
756
846
const char *saved_proc_info;
757
mysys_var->current_mutex= &mutex;
758
mysys_var->current_cond= &cond;
847
mysys_var->current_mutex= mutex;
848
mysys_var->current_cond= cond;
759
849
saved_proc_info= get_proc_info();
760
850
set_proc_info("Waiting for table");
763
We must unlock mutex first to avoid deadlock becasue conditions are
764
sent to this thread by doing locks in the following order:
765
lock(mysys_var->mutex)
766
lock(mysys_var->current_mutex)
768
One by effect of this that one can only use wait_for_condition with
769
condition variables that are guranteed to not disapper (freed) even if this
772
boost_unique_lock_t scopedLock(mutex, boost::adopt_lock_t());
775
cond.wait(scopedLock);
778
boost_unique_lock_t mysys_scopedLock(mysys_var->mutex);
852
(void) pthread_cond_wait(cond, mutex);
855
We must unlock mutex first to avoid deadlock becasue conditions are
856
sent to this thread by doing locks in the following order:
857
lock(mysys_var->mutex)
858
lock(mysys_var->current_mutex)
860
One by effect of this that one can only use wait_for_condition with
861
condition variables that are guranteed to not disapper (freed) even if this
865
pthread_mutex_unlock(mutex);
866
pthread_mutex_lock(&mysys_var->mutex);
779
867
mysys_var->current_mutex= 0;
780
868
mysys_var->current_cond= 0;
781
869
set_proc_info(saved_proc_info);
870
pthread_mutex_unlock(&mysys_var->mutex);
875
Open table which is already name-locked by this thread.
878
reopen_name_locked_table()
879
session Thread handle
880
table_list TableList object for table to be open, TableList::table
881
member should point to Table object which was used for
883
link_in true - if Table object for table to be opened should be
884
linked into Session::open_tables list.
885
false - placeholder used for name-locking is already in
886
this list so we only need to preserve Table::next
890
This function assumes that its caller already acquired LOCK_open mutex.
897
bool Session::reopen_name_locked_table(TableList* table_list, bool link_in)
899
Table *table= table_list->table;
901
char *table_name= table_list->table_name;
904
safe_mutex_assert_owner(&LOCK_open);
906
if (killed || !table)
911
if (open_unireg_entry(this, table, table_list, table_name,
912
table->s->table_cache_key.str,
913
table->s->table_cache_key.length))
915
table->intern_close_table();
917
If there was an error during opening of table (for example if it
918
does not exist) '*table' object can be wiped out. To be able
919
properly release name-lock in this case we should restore this
920
object to its original state.
928
We want to prevent other connections from opening this table until end
929
of statement as it is likely that modifications of table's metadata are
930
not yet finished (for example CREATE TRIGGER have to change .TRG file,
931
or we might want to drop table if CREATE TABLE ... SELECT fails).
932
This also allows us to assume that no other connection will sneak in
933
before we will get table-level lock on this table.
936
table->in_use = this;
940
table->next= open_tables;
946
Table object should be already in Session::open_tables list so we just
947
need to set Table::next correctly.
949
table->next= orig_table.next;
952
table->tablenr= current_tablenr++;
953
table->used_fields= 0;
954
table->const_table= 0;
955
table->null_row= false;
956
table->maybe_null= false;
957
table->force_index= false;
958
table->status= STATUS_NO_RECORD;
941
1141
if (table->query_id)
943
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->getAlias());
1143
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->alias);
946
table->query_id= getQueryId();
954
if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
956
my_error(ER_TABLE_UNKNOWN, identifier);
1146
table->query_id= query_id;
1151
if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
1153
my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->table_name);
1158
If it's the first table from a list of tables used in a query,
1159
remember refresh_version (the version of open_cache state).
1160
If the version changes while we're opening the remaining tables,
1161
we will have to back off, close all the tables opened-so-far,
1162
and try to reopen them.
1164
Note-> refresh_version is currently changed only during FLUSH TABLES.
1167
version= refresh_version;
1168
else if ((version != refresh_version) &&
1169
! (flags & DRIZZLE_LOCK_IGNORE_FLUSH))
1171
/* Someone did a refresh while thread was opening tables */
1179
Before we test the global cache, we test our local session cache.
1183
assert(false); /* Not implemented yet */
1187
Non pre-locked/LOCK TABLES mode, and the table is not temporary:
1188
this is the normal use case.
1190
- try to find the table in the table cache.
1191
- if one of the discovered Table instances is name-locked
1192
(table->s->version == 0) back off -- we have to wait
1193
until no one holds a name lock on the table.
1194
- if there is no such Table in the name cache, read the table definition
1195
and insert it into the cache.
1196
We perform all of the above under LOCK_open which currently protects
1197
the open cache (also known as table cache) and table definitions stored
1201
pthread_mutex_lock(&LOCK_open); /* Lock for FLUSH TABLES for open table */
1204
Actually try to find the table in the open_cache.
1205
The cache may contain several "Table" instances for the same
1206
physical table. The instances that are currently "in use" by
1207
some thread have their "in_use" member != NULL.
1208
There is no good reason for having more than one entry in the
1209
hash for the same physical table, except that we use this as
1210
an implicit "pending locks queue" - see
1211
wait_for_locked_table_names for details.
1213
for (table= (Table*) hash_first(&open_cache, (unsigned char*) key, key_length,
1215
table && table->in_use ;
1216
table= (Table*) hash_next(&open_cache, (unsigned char*) key, key_length,
961
If it's the first table from a list of tables used in a query,
962
remember refresh_version (the version of open_cache state).
963
If the version changes while we're opening the remaining tables,
964
we will have to back off, close all the tables opened-so-far,
965
and try to reopen them.
967
Note-> refresh_version is currently changed only during FLUSH TABLES.
1220
Here we flush tables marked for flush.
1221
Normally, table->s->version contains the value of
1222
refresh_version from the moment when this table was
1223
(re-)opened and added to the cache.
1224
If since then we did (or just started) FLUSH TABLES
1225
statement, refresh_version has been increased.
1226
For "name-locked" Table instances, table->s->version is set
1227
to 0 (see lock_table_name for details).
1228
In case there is a pending FLUSH TABLES or a name lock, we
1229
need to back off and re-start opening tables.
1230
If we do not back off now, we may dead lock in case of lock
1231
order mismatch with some other thread:
1232
c1: name lock t1; -- sort of exclusive lock
1233
c2: open t2; -- sort of shared lock
1234
c1: name lock t2; -- blocks
1235
c2: open t1; -- blocks
971
version= refresh_version;
973
else if ((version != refresh_version) &&
974
! (flags & DRIZZLE_LOCK_IGNORE_FLUSH))
976
/* Someone did a refresh while thread was opening tables */
1237
if (table->needs_reopen_or_name_lock())
1239
if (flags & DRIZZLE_LOCK_IGNORE_FLUSH)
1241
/* Force close at once after usage */
1242
version= table->s->version;
1246
/* Avoid self-deadlocks by detecting self-dependencies. */
1247
if (table->open_placeholder && table->in_use == this)
1249
pthread_mutex_unlock(&LOCK_open);
1250
my_error(ER_UPDATE_TABLE_USED, MYF(0), table->s->table_name.str);
1255
Back off, part 1: mark the table as "unused" for the
1256
purpose of name-locking by setting table->db_stat to 0. Do
1257
that only for the tables in this thread that have an old
1258
table->s->version (this is an optimization (?)).
1259
table->db_stat == 0 signals wait_for_locked_table_names
1260
that the tables in question are not used any more. See
1261
table_is_used call for details.
1263
close_old_data_files(false, false);
1266
Back-off part 2: try to avoid "busy waiting" on the table:
1267
if the table is in use by some other thread, we suspend
1268
and wait till the operation is complete: when any
1269
operation that juggles with table->s->version completes,
1270
it broadcasts COND_refresh condition variable.
1271
If 'old' table we met is in use by current thread we return
1272
without waiting since in this situation it's this thread
1273
which is responsible for broadcasting on COND_refresh
1274
(and this was done already in Session::close_old_data_files()).
1275
Good example of such situation is when we have statement
1276
that needs two instances of table and FLUSH TABLES comes
1277
after we open first instance but before we open second
1280
if (table->in_use != this)
1282
/* wait_for_conditionwill unlock LOCK_open for us */
1283
wait_for_condition(&LOCK_open, &COND_refresh);
1287
pthread_mutex_unlock(&LOCK_open);
1290
There is a refresh in progress for this table.
1291
Signal the caller that it has to try again.
984
Before we test the global cache, we test our local session cache.
988
assert(false); /* Not implemented yet */
1300
/* Unlink the table from "unused_tables" list. */
1301
if (table == unused_tables)
1303
unused_tables=unused_tables->next; // Remove from link
1304
if (table == unused_tables)
1305
unused_tables= NULL;
992
Non pre-locked/LOCK TABLES mode, and the table is not temporary:
993
this is the normal use case.
995
- try to find the table in the table cache.
996
- if one of the discovered Table instances is name-locked
997
(table->getShare()->version == 0) back off -- we have to wait
998
until no one holds a name lock on the table.
999
- if there is no such Table in the name cache, read the table definition
1000
and insert it into the cache.
1001
We perform all of the above under table::Cache::singleton().mutex() which currently protects
1002
the open cache (also known as table cache) and table definitions stored
1307
table->prev->next=table->next; /* Remove from unused list */
1308
table->next->prev=table->prev;
1309
table->in_use= this;
1313
/* Insert a new Table instance into the open cache */
1315
/* Free cache if too big */
1316
while (open_cache.records > table_cache_size && unused_tables)
1317
hash_delete(&open_cache,(unsigned char*) unused_tables); /* purecov: tested */
1319
if (table_list->create)
1007
boost::mutex::scoped_lock scopedLock(table::Cache::singleton().mutex());
1010
Actually try to find the table in the open_cache.
1011
The cache may contain several "Table" instances for the same
1012
physical table. The instances that are currently "in use" by
1013
some thread have their "in_use" member != NULL.
1014
There is no good reason for having more than one entry in the
1015
hash for the same physical table, except that we use this as
1016
an implicit "pending locks queue" - see
1017
wait_for_locked_table_names for details.
1019
ppp= table::getCache().equal_range(key);
1022
for (table::CacheMap::const_iterator iter= ppp.first;
1023
iter != ppp.second; ++iter, table= NULL)
1321
char path[FN_REFLEN];
1324
length= build_table_filename(path, sizeof(path),
1325
table_list->db, table_list->table_name,
1328
if (StorageEngine::getTableProto(path, NULL) != EEXIST)
1025
table= (*iter).second;
1027
if (not table->in_use)
1030
Here we flush tables marked for flush.
1031
Normally, table->getShare()->version contains the value of
1032
refresh_version from the moment when this table was
1033
(re-)opened and added to the cache.
1034
If since then we did (or just started) FLUSH TABLES
1035
statement, refresh_version has been increased.
1036
For "name-locked" Table instances, table->getShare()->version is set
1037
to 0 (see lock_table_name for details).
1038
In case there is a pending FLUSH TABLES or a name lock, we
1039
need to back off and re-start opening tables.
1040
If we do not back off now, we may dead lock in case of lock
1041
order mismatch with some other thread:
1042
c1-> name lock t1; -- sort of exclusive lock
1043
c2-> open t2; -- sort of shared lock
1044
c1-> name lock t2; -- blocks
1045
c2-> open t1; -- blocks
1331
Table to be created, so we need to create placeholder in table-cache.
1047
if (table->needs_reopen_or_name_lock())
1333
if (!(table= table_cache_insert_placeholder(key, key_length)))
1049
if (flags & DRIZZLE_LOCK_IGNORE_FLUSH)
1051
/* Force close at once after usage */
1052
version= table->getShare()->getVersion();
1056
/* Avoid self-deadlocks by detecting self-dependencies. */
1057
if (table->open_placeholder && table->in_use == this)
1059
my_error(ER_UPDATE_TABLE_USED, MYF(0), table->getShare()->getTableName());
1064
Back off, part 1: mark the table as "unused" for the
1065
purpose of name-locking by setting table->db_stat to 0. Do
1066
that only for the tables in this thread that have an old
1067
table->getShare()->version (this is an optimization (?)).
1068
table->db_stat == 0 signals wait_for_locked_table_names
1069
that the tables in question are not used any more. See
1070
table_is_used call for details.
1072
close_old_data_files(false, false);
1075
Back-off part 2: try to avoid "busy waiting" on the table:
1076
if the table is in use by some other thread, we suspend
1077
and wait till the operation is complete: when any
1078
operation that juggles with table->getShare()->version completes,
1079
it broadcasts COND_refresh condition variable.
1080
If 'old' table we met is in use by current thread we return
1081
without waiting since in this situation it's this thread
1082
which is responsible for broadcasting on COND_refresh
1083
(and this was done already in Session::close_old_data_files()).
1084
Good example of such situation is when we have statement
1085
that needs two instances of table and FLUSH TABLES comes
1086
after we open first instance but before we open second
1089
if (table->in_use != this)
1091
/* wait_for_conditionwill unlock table::Cache::singleton().mutex() for us */
1092
wait_for_condition(table::Cache::singleton().mutex(), COND_refresh);
1093
scopedLock.release();
1097
scopedLock.unlock();
1101
There is a refresh in progress for this table.
1102
Signal the caller that it has to try again.
1335
pthread_mutex_unlock(&LOCK_open);
1113
table::getUnused().unlink(static_cast<table::Concurrent *>(table));
1114
table->in_use= this;
1118
/* Insert a new Table instance into the open cache */
1120
/* Free cache if too big */
1121
table::getUnused().cull();
1123
if (table_list->isCreate())
1125
identifier::Table lock_table_identifier(table_list->getSchemaName(), table_list->getTableName(), message::Table::STANDARD);
1127
if (not plugin::StorageEngine::doesTableExist(*this, lock_table_identifier))
1130
Table to be created, so we need to create placeholder in table-cache.
1132
if (!(table= table_cache_insert_placeholder(lock_table_identifier)))
1137
Link placeholder to the open tables list so it will be automatically
1138
removed once tables are closed. Also mark it so it won't be ignored
1139
by other trying to take name-lock.
1141
table->open_placeholder= true;
1142
table->setNext(open_tables);
1147
/* Table exists. Let us try to open it. */
1150
/* make a new table */
1152
table::Concurrent *new_table= new table::Concurrent;
1154
if (new_table == NULL)
1159
error= new_table->open_unireg_entry(this, alias, identifier);
1165
(void)table::Cache::singleton().insert(new_table);
1172
table->setNext(open_tables); /* Link into simple list */
1175
table->reginfo.lock_type= TL_READ; /* Assume read */
1178
assert(table->getShare()->getTableCount() > 0 || table->getShare()->getType() != message::Table::STANDARD);
1339
Link placeholder to the open tables list so it will be automatically
1340
removed once tables are closed. Also mark it so it won't be ignored
1341
by other trying to take name-lock.
1343
table->open_placeholder= true;
1344
table->next= open_tables;
1346
pthread_mutex_unlock(&LOCK_open);
1350
/* Table exists. Let us try to open it. */
1353
/* make a new table */
1354
table= (Table *)malloc(sizeof(Table));
1357
pthread_mutex_unlock(&LOCK_open);
1361
error= open_unireg_entry(this, table, table_list, alias, key, key_length);
1365
pthread_mutex_unlock(&LOCK_open);
1368
my_hash_insert(&open_cache, (unsigned char*) table);
1371
pthread_mutex_unlock(&LOCK_open);
1374
table->next= open_tables; /* Link into simple list */
1377
table->reginfo.lock_type= TL_READ; /* Assume read */
1380
assert(table->s->ref_count > 0 || table->s->tmp_table != NO_TMP_TABLE);
1382
if (lex->need_correct_ident())
1383
table->alias_name_used= my_strcasecmp(table_alias_charset,
1384
table->s->table_name.str, alias);
1180
1385
/* Fix alias if table name changes */
1181
if (strcmp(table->getAlias(), alias))
1386
if (strcmp(table->alias, alias))
1183
table->setAlias(alias);
1388
uint32_t length=(uint32_t) strlen(alias)+1;
1389
table->alias= (char*) realloc((char*) table->alias, length);
1390
memcpy((void*) table->alias, alias, length);
1186
1393
/* These variables are also set in reopen_table() */
1515
1898
other threads trying to get the lock.
1518
void abort_locked_tables(Session *session, const drizzled::identifier::Table &identifier)
1901
void abort_locked_tables(Session *session,const char *db, const char *table_name)
1521
for (table= session->open_tables; table ; table= table->getNext())
1904
for (table= session->open_tables; table ; table= table->next)
1523
if (table->getShare()->getCacheKey() == identifier.getKey())
1906
if (!strcmp(table->s->table_name.str, table_name) &&
1907
!strcmp(table->s->db.str, db))
1525
1909
/* If MERGE child, forward lock handling to parent. */
1526
session->abortLock(table);
1910
mysql_lock_abort(session, table);
1917
Load a table definition from file and open unireg table
1921
session Thread handle
1922
entry Store open table definition here
1923
table_list TableList with db, table_name
1925
cache_key Key for share_cache
1926
cache_key_length length of cache_key
1929
Extra argument for open is taken from session->open_options
1930
One must have a lock on LOCK_open when calling this function
1937
static int open_unireg_entry(Session *session, Table *entry, TableList *table_list,
1939
char *cache_key, uint32_t cache_key_length)
1943
uint32_t discover_retry_count= 0;
1945
safe_mutex_assert_owner(&LOCK_open);
1947
if (!(share= TableShare::getShare(session, table_list, cache_key,
1949
table_list->i_s_requested_object,
1953
while ((error= open_table_from_share(session, share, alias,
1954
(uint32_t) (HA_OPEN_KEYFILE |
1959
session->open_options, entry, OTM_OPEN)))
1961
if (error == 7) // Table def changed
1963
share->version= 0; // Mark share as old
1964
if (discover_retry_count++) // Retry once
1969
Here we should wait until all threads has released the table.
1970
For now we do one retry. This may cause a deadlock if there
1971
is other threads waiting for other tables used by this thread.
1973
Proper fix would be to if the second retry failed:
1974
- Mark that table def changed
1975
- Return from open table
1976
- Close all tables used by this thread
1977
- Start waiting that the share is released
1978
- Retry by opening all tables again
1983
To avoid deadlock, only wait for release if no one else is
1986
if (share->ref_count != 1)
1988
/* Free share and wait until it's released by all threads */
1989
TableShare::release(share);
1991
if (!session->killed)
1993
drizzle_reset_errors(session, 1); // Clear warnings
1994
session->clear_error(); // Clear error message
1999
if (!entry->s || !entry->s->crashed)
2001
// Code below is for repairing a crashed file
2002
if ((error= lock_table_name(session, table_list, true)))
2006
if (wait_for_locked_table_names(session, table_list))
2008
unlock_table_name(table_list);
2012
pthread_mutex_unlock(&LOCK_open);
2013
session->clear_error(); // Clear error message
2015
if (open_table_from_share(session, share, alias,
2016
(uint32_t) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
2020
ha_open_options | HA_OPEN_FOR_REPAIR,
2021
entry, OTM_OPEN) || ! entry->file)
2023
/* Give right error message */
2024
session->clear_error();
2025
my_error(ER_NOT_KEYFILE, MYF(0), share->table_name.str, my_errno);
2026
errmsg_printf(ERRMSG_LVL_ERROR, _("Couldn't repair table: %s.%s"), share->db.str,
2027
share->table_name.str);
2029
entry->closefrm(false);
2033
session->clear_error(); // Clear error message
2034
pthread_mutex_lock(&LOCK_open);
2035
unlock_table_name(table_list);
2043
If we are here, there was no fatal error (but error may be still
2046
if (unlikely(entry->file->implicit_emptied))
2048
entry->file->implicit_emptied= 0;
2051
uint32_t query_buf_size= 20 + share->db.length + share->table_name.length +1;
2052
if ((query= (char*) malloc(query_buf_size)))
2055
"this DELETE FROM is needed even with row-based binlogging"
2057
We inherited this from MySQL. TODO: fix it to issue a propper truncate
2058
of the table (though that may not be completely right sematics).
2061
end+= sprintf(query, "DELETE FROM `%s`.`%s`", share->db.str,
2062
share->table_name.str);
2063
replication_services.rawStatement(session, query, (size_t)(end - query));
2068
errmsg_printf(ERRMSG_LVL_ERROR, _("When opening HEAP table, could not allocate memory "
2069
"to write 'DELETE FROM `%s`.`%s`' to replication"),
2070
table_list->db, table_list->table_name);
2071
my_error(ER_OUTOFMEMORY, MYF(0), query_buf_size);
2072
entry->closefrm(false);
2080
TableShare::release(share);
1535
2087
Open all tables in list
1539
session - thread Cursor
2091
session - thread handler
1540
2092
start - list of tables in/out
1541
2093
counter - number of opened tables will be return using this parameter
1542
2094
flags - bitmap of flags to modify how the tables will be open:
1802
Table *Open_tables_state::open_temporary_table(const identifier::Table &identifier,
2353
Table *Session::open_temporary_table(const char *path, const char *db_arg,
2354
const char *table_name_arg, bool link_in_list,
2355
open_table_mode open_mode)
1805
assert(identifier.isTmp());
1808
table::Temporary *new_tmp_table= new table::Temporary(identifier.getType(),
1810
const_cast<char *>(const_cast<identifier::Table&>(identifier).getPath().c_str()),
1811
static_cast<uint32_t>(identifier.getPath().length()));
1812
if (not new_tmp_table)
2357
Table *new_tmp_table;
2359
char cache_key[MAX_DBKEY_LENGTH], *saved_cache_key, *tmp_path;
2360
uint32_t key_length, path_length;
2361
TableList table_list;
2363
table_list.db= (char*) db_arg;
2364
table_list.table_name= (char*) table_name_arg;
2365
/* Create the cache_key for temporary tables */
2366
key_length= table_list.create_table_def_key(cache_key);
2367
path_length= strlen(path);
2369
if (!(new_tmp_table= (Table*) malloc(sizeof(*new_tmp_table) + sizeof(*share) +
2370
path_length + 1 + key_length)))
2373
share= (TableShare*) (new_tmp_table+1);
2374
tmp_path= (char*) (share+1);
2375
saved_cache_key= strcpy(tmp_path, path)+path_length+1;
2376
memcpy(saved_cache_key, cache_key, key_length);
2378
share->init(saved_cache_key, key_length, strchr(saved_cache_key, '\0')+1, tmp_path);
1816
2381
First open the share, and then open the table from the share we just opened.
1818
if (new_tmp_table->getMutableShare()->open_table_def(*static_cast<Session *>(this), identifier) ||
1819
new_tmp_table->getMutableShare()->open_table_from_share(static_cast<Session *>(this), identifier, identifier.getTableName().c_str(),
1820
(uint32_t) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
2383
if (open_table_def(this, share) ||
2384
open_table_from_share(this, share, table_name_arg,
2385
(open_mode == OTM_ALTER) ? 0 :
2386
(uint32_t) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
2388
(open_mode == OTM_ALTER) ?
2389
(EXTRA_RECORD | OPEN_FRM_FILE_ONLY)
2392
new_tmp_table, open_mode))
1825
2394
/* No need to lock share->mutex as this is not needed for tmp tables */
1826
delete new_tmp_table->getMutableShare();
1827
delete new_tmp_table;
2395
share->free_table_share();
2396
free((char*) new_tmp_table);
1832
2400
new_tmp_table->reginfo.lock_type= TL_WRITE; // Simulate locked
2401
if (open_mode == OTM_ALTER)
2404
Temporary table has been created with frm_only
2405
and has not been created in any storage engine
2407
share->tmp_table= TMP_TABLE_FRM_FILE_ONLY;
2410
share->tmp_table= (new_tmp_table->file->has_transactions() ?
2411
TRANSACTIONAL_TMP_TABLE : NON_TRANSACTIONAL_TMP_TABLE);
1834
2413
if (link_in_list)
1836
2415
/* growing temp list at the head */
1837
new_tmp_table->setNext(this->temporary_tables);
1838
if (new_tmp_table->getNext())
1840
new_tmp_table->getNext()->setPrev(new_tmp_table);
2416
new_tmp_table->next= this->temporary_tables;
2417
if (new_tmp_table->next)
2418
new_tmp_table->next->prev= new_tmp_table;
1842
2419
this->temporary_tables= new_tmp_table;
1843
this->temporary_tables->setPrev(0);
2420
this->temporary_tables->prev= 0;
1845
2422
new_tmp_table->pos_in_table_list= 0;
3885
4491
On INSERT or UPDATE fields are checked to be from the same table,
3886
4492
thus we safely can take table from the first field.
3888
table= (*ptr)->getTable();
4494
table= (*ptr)->table;
3889
4495
table->auto_increment_field_not_null= false;
3892
4497
while ((field = *ptr++) && ! session->is_error())
3895
table= field->getTable();
4500
table= field->table;
3897
4501
if (field == table->next_number_field)
3898
4502
table->auto_increment_field_not_null= true;
3900
4503
if (value->save_in_field(field, 0) < 0)
4505
tbl_list.push_back(table);
4507
/* Update virtual fields*/
4508
session->abort_on_warning= false;
4509
if (tbl_list.head())
4511
List_iterator_fast<Table> t(tbl_list);
4512
Table *prev_table= 0;
4513
while ((table= t++))
3903
table->auto_increment_field_not_null= false;
4516
Do simple optimization to prevent unnecessary re-generating
4517
values for virtual fields
4519
if (table != prev_table)
4525
session->abort_on_warning= abort_on_warning_saved;
3909
4526
return(session->is_error());
4529
session->abort_on_warning= abort_on_warning_saved;
4531
table->auto_increment_field_not_null= false;
3913
bool drizzle_rm_tmp_tables()
4536
bool drizzle_rm_tmp_tables(slot::Listen &listen_handler)
3916
assert(drizzle_tmpdir.size());
3917
Session::shared_ptr session= Session::make_shared(plugin::Listen::getNullClient(), catalog::local());
4538
char filePath[FN_REFLEN], filePathCopy[FN_REFLEN];
4541
assert(drizzle_tmpdir);
4543
if (!(session= new Session(listen_handler.getTmpProtocol())))
3921
session->thread_stack= (char*) session.get();
4545
session->thread_stack= (char*) &session;
3922
4546
session->storeGlobals();
3924
plugin::StorageEngine::removeLostTemporaryTables(*session, drizzle_tmpdir.c_str());
4548
CachedDirectory dir(drizzle_tmpdir);
4552
my_errno= dir.getError();
4553
my_error(ER_CANT_READ_DIR, MYF(0), drizzle_tmpdir, my_errno);
4557
CachedDirectory::Entries files= dir.getEntries();
4558
CachedDirectory::Entries::iterator fileIter= files.begin();
4560
/* Remove all temp tables in the tmpdir */
4561
while (fileIter != files.end())
4563
CachedDirectory::Entry *entry= *fileIter;
4564
string prefix= entry->filename.substr(0, TMP_FILE_PREFIX_LENGTH);
4566
if (prefix == TMP_FILE_PREFIX)
4568
char *ext= fn_ext(entry->filename.c_str());
4569
uint32_t ext_len= strlen(ext);
4570
uint32_t filePath_len= snprintf(filePath, sizeof(filePath),
4571
"%s%c%s", drizzle_tmpdir, FN_LIBCHAR,
4572
entry->filename.c_str());
4574
if (ext_len && !memcmp(".dfe", ext, ext_len))
4577
/* We should cut file extention before deleting of table */
4578
memcpy(filePathCopy, filePath, filePath_len - ext_len);
4579
filePathCopy[filePath_len - ext_len]= 0;
4580
share.init(NULL, filePathCopy);
4581
if (!open_table_def(session, &share))
4583
share.db_type()->deleteTable(session, filePathCopy);
4585
share.free_table_share();
4588
File can be already deleted by tmp_table.file->delete_table().
4589
So we hide error messages which happnes during deleting of these
4592
my_delete(filePath, MYF(0));
3932
4606
unireg support functions
3933
4607
*****************************************************************************/
4610
Invalidate any cache entries that are for some DB
4613
remove_db_from_cache()
4614
db Database name. This will be in lower case if
4615
lower_case_table_name is set
4618
We can't use hash_delete when looping hash_elements. We mark them first
4619
and afterwards delete those marked unused.
4622
void remove_db_from_cache(const char *db)
4624
safe_mutex_assert_owner(&LOCK_open);
4626
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
4628
Table *table=(Table*) hash_element(&open_cache,idx);
4629
if (!strcmp(table->s->db.str, db))
4631
table->s->version= 0L; /* Free when thread is ready */
4633
relink_unused(table);
4636
while (unused_tables && !unused_tables->s->version)
4637
hash_delete(&open_cache,(unsigned char*) unused_tables);
4642
Mark all entries with the table as deleted to force an reopen of the table
4644
The table will be closed (not stored in cache) by the current thread when
4645
close_thread_tables() is called.
4651
0 This thread now have exclusive access to this table and no other thread
4652
can access the table until close_thread_tables() is called.
4653
1 Table is in use by another thread
4656
bool remove_table_from_cache(Session *session, const char *db, const char *table_name,
4659
char key[MAX_DBKEY_LENGTH];
4661
uint32_t key_length;
4664
bool signalled= false;
4666
key_pos= strcpy(key_pos, db) + strlen(db);
4667
key_pos= strcpy(key_pos+1, table_name) + strlen(table_name);
4668
key_length= (uint32_t) (key_pos-key)+1;
4672
HASH_SEARCH_STATE state;
4673
result= signalled= false;
4675
for (table= (Table*) hash_first(&open_cache, (unsigned char*) key, key_length,
4678
table= (Table*) hash_next(&open_cache, (unsigned char*) key, key_length,
4683
table->s->version=0L; /* Free when thread is ready */
4684
if (!(in_use=table->in_use))
4686
relink_unused(table);
4688
else if (in_use != session)
4691
Mark that table is going to be deleted from cache. This will
4692
force threads that are in mysql_lock_tables() (but not yet
4693
in thr_multi_lock()) to abort it's locks, close all tables and retry
4695
in_use->some_tables_deleted= true;
4696
if (table->is_name_opened())
4701
Now we must abort all tables locks used by this thread
4702
as the thread may be waiting to get a lock for another table.
4703
Note that we need to hold LOCK_open while going through the
4704
list. So that the other thread cannot change it. The other
4705
thread must also hold LOCK_open whenever changing the
4706
open_tables list. Aborting the MERGE lock after a child was
4707
closed and before the parent is closed would be fatal.
4709
for (Table *session_table= in_use->open_tables;
4711
session_table= session_table->next)
4713
/* Do not handle locks of MERGE children. */
4714
if (session_table->db_stat) // If table is open
4715
signalled|= mysql_lock_abort_for_thread(session, session_table);
4719
result= result || (flags & RTFC_OWNED_BY_Session_FLAG);
4721
while (unused_tables && !unused_tables->s->version)
4722
hash_delete(&open_cache,(unsigned char*) unused_tables);
4724
/* Remove table from table definition cache if it's not in use */
4725
TableShare::release(key, key_length);
4727
if (result && (flags & RTFC_WAIT_OTHER_THREAD_FLAG))
4730
Signal any thread waiting for tables to be freed to
4733
broadcast_refresh();
4734
if (!(flags & RTFC_CHECK_KILLED_FLAG) || !session->killed)
4737
if (likely(signalled))
4738
(void) pthread_cond_wait(&COND_refresh, &LOCK_open);
4741
struct timespec abstime;
4743
It can happen that another thread has opened the
4744
table but has not yet locked any table at all. Since
4745
it can be locked waiting for a table that our thread
4746
has done LOCK Table x WRITE on previously, we need to
4747
ensure that the thread actually hears our signal
4748
before we go to sleep. Thus we wait for a short time
4749
and then we retry another loop in the
4750
remove_table_from_cache routine.
4752
set_timespec(abstime, 10);
4753
pthread_cond_timedwait(&COND_refresh, &LOCK_open, &abstime);