68
63
extern bool volatile shutdown_in_progress;
65
TableOpenCache &get_open_cache()
67
static TableOpenCache open_cache; /* Used by mysql_test */
72
static void free_cache_entry(Table *entry);
74
void remove_table(Table *arg)
76
TableOpenCacheRange ppp;
77
ppp= get_open_cache().equal_range(arg->getShare()->getCacheKey());
79
for (TableOpenCache::const_iterator iter= ppp.first;
80
iter != ppp.second; ++iter)
82
Table *found_table= (*iter).second;
84
if (found_table == arg)
86
free_cache_entry(arg);
87
get_open_cache().erase(iter);
93
static bool add_table(Table *arg)
95
TableOpenCache &open_cache(get_open_cache());
97
TableOpenCache::iterator returnable= open_cache.insert(make_pair(arg->getShare()->getCacheKey(), arg));
99
return not (returnable == open_cache.end());
103
Table *tables; /* Used by mysql_test */
105
Table *getTable() const
110
Table *setTable(Table *arg)
119
/* Free cache if too big */
120
while (cached_open_tables() > table_cache_size && getTable())
121
remove_table(getTable());
126
while (getTable() && not getTable()->getShare()->getVersion())
127
remove_table(getTable());
130
void link(Table *table)
134
table->setNext(getTable()); /* Link in last */
135
table->setPrev(getTable()->getPrev());
136
getTable()->setPrev(table);
137
table->getPrev()->setNext(table);
141
table->setPrev(setTable(table));
142
table->setNext(table->getPrev());
143
assert(table->getNext() == table && table->getPrev() == table);
148
void unlink(Table *table)
152
/* Unlink the table from "unused_tables" list. */
153
if (table == getTable())
155
setTable(getTable()->getNext()); // Remove from link
156
if (table == getTable())
161
/* move table first in unused links */
163
void relink(Table *table)
165
if (table != getTable())
169
table->setNext(getTable()); /* Link in unused tables */
170
table->setPrev(getTable()->getPrev());
171
getTable()->getPrev()->setNext(table);
172
getTable()->setPrev(table);
181
remove_table(getTable());
193
static UnusedTables unused_tables;
194
static int open_unireg_entry(Session *session,
197
TableIdentifier &identifier);
199
unsigned char *table_cache_key(const unsigned char *record,
204
static bool reopen_table(Table *table);
207
unsigned char *table_cache_key(const unsigned char *record,
211
Table *entry=(Table*) record;
212
*length= entry->getShare()->getCacheKey().size();
213
return (unsigned char*) &entry->getShare()->getCacheKey()[0];
70
216
bool table_cache_init(void)
173
343
bool result= false;
174
344
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)
346
LOCK_open.lock(); /* Optionally lock for remove tables from open_cahe if not in use */
350
refresh_version++; // Force close of open tables
352
unused_tables.clear();
354
if (wait_for_refresh)
357
Other threads could wait in a loop in open_and_lock_tables(),
358
trying to lock one or more of our tables.
360
If they wait for the locks in thr_multi_lock(), their lock
361
request is aborted. They loop in open_and_lock_tables() and
362
enter open_table(). Here they notice the table is refreshed and
363
wait for COND_refresh. Then they loop again in
364
openTablesLock() and this time open_table() succeeds. At
365
this moment, if we (the FLUSH TABLES thread) are scheduled and
366
on another FLUSH TABLES enter close_cached_tables(), they could
367
awake while we sleep below, waiting for others threads (us) to
368
close their open tables. If this happens, the other threads
369
would find the tables unlocked. They would get the locks, one
370
after the other, and could do their destructive work. This is an
371
issue if we have LOCK TABLES in effect.
373
The problem is that the other threads passed all checks in
374
open_table() before we refresh the table.
376
The fix for this problem is to set some_tables_deleted for all
377
threads with open tables. These threads can still get their
378
locks, but will immediately release them again after checking
379
this variable. They will then loop in openTablesLock()
380
again. There they will wait until we update all tables version
383
Setting some_tables_deleted is done by remove_table_from_cache()
386
In other words (reviewer suggestion): You need this setting of
387
some_tables_deleted for the case when table was opened and all
388
related checks were passed before incrementing refresh_version
389
(which you already have) but attempt to lock the table happened
390
after the call to Session::close_old_data_files() i.e. after removal of
391
current thread locks.
393
for (TableOpenCache::const_iterator iter= get_open_cache().begin();
394
iter != get_open_cache().end();
397
Table *table= (*iter).second;
399
table->in_use->some_tables_deleted= false;
406
for (TableList *table= tables; table; table= table->next_local)
408
TableIdentifier identifier(table->db, table->table_name);
409
if (remove_table_from_cache(session, identifier,
410
RTFC_OWNED_BY_Session_FLAG))
416
wait_for_refresh= false; // Nothing to wait for
419
if (wait_for_refresh)
422
If there is any table that has a lower refresh_version, wait until
423
this is closed (or this thread is killed) before returning
425
session->mysys_var->current_mutex= &LOCK_open;
426
session->mysys_var->current_cond= &COND_refresh;
427
session->set_proc_info("Flushing tables");
429
session->close_old_data_files();
432
/* Wait until all threads has closed all the tables we had locked */
433
while (found && ! session->killed)
436
for (TableOpenCache::const_iterator iter= get_open_cache().begin();
437
iter != get_open_cache().end();
440
Table *table= (*iter).second;
441
/* Avoid a self-deadlock. */
442
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.
445
Note that we wait here only for tables which are actually open, and
446
not for placeholders with Table::open_placeholder set. Waiting for
447
latter will cause deadlock in the following scenario, for example:
449
conn1-> lock table t1 write;
450
conn2-> lock table t2 write;
451
conn1-> flush tables;
452
conn2-> flush tables;
454
It also does not make sense to wait for those of placeholders that
455
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))
458
if (table->needs_reopen_or_name_lock() && (table->db_stat ||
459
(table->open_placeholder && wait_for_placeholders)))
462
pthread_cond_wait(COND_refresh.native_handle(),LOCK_open.native_handle());
247
wait_for_refresh= false; // Nothing to wait for
468
No other thread has the locked tables open; reopen them and get the
469
old locks. This should always succeed (unless some external process
470
has removed the tables)
472
result= session->reopen_tables(true, true);
250
if (wait_for_refresh)
474
/* Set version for table */
475
for (Table *table= session->open_tables; table ; table= table->getNext())
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();
478
Preserve the version (0) of write locked tables so that a impending
479
global read lock won't sneak in.
481
if (table->reginfo.lock_type < TL_WRITE_ALLOW_WRITE)
482
table->getMutableShare()->refreshVersion();
318
488
if (wait_for_refresh)
320
boost_unique_lock_t scopedLock(session->mysys_var->mutex);
490
boost::mutex::scoped_lock scopedLock(session->mysys_var->mutex);
321
491
session->mysys_var->current_mutex= 0;
322
492
session->mysys_var->current_cond= 0;
323
493
session->set_proc_info(0);
758
948
mysys_var->current_cond= &cond;
759
949
saved_proc_info= get_proc_info();
760
950
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);
952
(void) pthread_cond_wait(cond.native_handle(), mutex.native_handle());
955
We must unlock mutex first to avoid deadlock becasue conditions are
956
sent to this thread by doing locks in the following order:
957
lock(mysys_var->mutex)
958
lock(mysys_var->current_mutex)
960
One by effect of this that one can only use wait_for_condition with
961
condition variables that are guranteed to not disapper (freed) even if this
965
pthread_mutex_unlock(mutex.native_handle());
966
boost::mutex::scoped_lock (mysys_var->mutex);
779
967
mysys_var->current_mutex= 0;
780
968
mysys_var->current_cond= 0;
781
969
set_proc_info(saved_proc_info);
974
Open table which is already name-locked by this thread.
977
reopen_name_locked_table()
978
session Thread handle
979
table_list TableList object for table to be open, TableList::table
980
member should point to Table object which was used for
982
link_in true - if Table object for table to be opened should be
983
linked into Session::open_tables list.
984
false - placeholder used for name-locking is already in
985
this list so we only need to preserve Table::next
989
This function assumes that its caller already acquired LOCK_open mutex.
996
bool Session::reopen_name_locked_table(TableList* table_list, bool link_in)
998
Table *table= table_list->table;
1000
char *table_name= table_list->table_name;
1003
safe_mutex_assert_owner(LOCK_open.native_handle());
1005
if (killed || !table)
1010
TableIdentifier identifier(table_list->db, table_list->table_name);
1011
if (open_unireg_entry(this, table, table_name, identifier))
1013
table->intern_close_table();
1015
If there was an error during opening of table (for example if it
1016
does not exist) '*table' object can be wiped out. To be able
1017
properly release name-lock in this case we should restore this
1018
object to its original state.
1024
share= table->getMutableShare();
1026
We want to prevent other connections from opening this table until end
1027
of statement as it is likely that modifications of table's metadata are
1028
not yet finished (for example CREATE TRIGGER have to change .TRG cursor,
1029
or we might want to drop table if CREATE TABLE ... SELECT fails).
1030
This also allows us to assume that no other connection will sneak in
1031
before we will get table-level lock on this table.
1033
share->resetVersion();
1034
table->in_use = this;
1038
table->setNext(open_tables);
1044
Table object should be already in Session::open_tables list so we just
1045
need to set Table::next correctly.
1047
table->setNext(orig_table.getNext());
1050
table->tablenr= current_tablenr++;
1051
table->used_fields= 0;
1052
table->const_table= 0;
1053
table->null_row= false;
1054
table->maybe_null= false;
1055
table->force_index= false;
1056
table->status= STATUS_NO_RECORD;
786
1063
Create and insert into table cache placeholder for table
787
1064
which will prevent its opening (or creation) (a.k.a lock
946
1222
table->query_id= getQueryId();
1227
if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
1229
my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->table_name);
1234
If it's the first table from a list of tables used in a query,
1235
remember refresh_version (the version of open_cache state).
1236
If the version changes while we're opening the remaining tables,
1237
we will have to back off, close all the tables opened-so-far,
1238
and try to reopen them.
1240
Note-> refresh_version is currently changed only during FLUSH TABLES.
1244
version= refresh_version;
1246
else if ((version != refresh_version) &&
1247
! (flags & DRIZZLE_LOCK_IGNORE_FLUSH))
1249
/* Someone did a refresh while thread was opening tables */
1257
Before we test the global cache, we test our local session cache.
1261
assert(false); /* Not implemented yet */
1265
Non pre-locked/LOCK TABLES mode, and the table is not temporary:
1266
this is the normal use case.
1268
- try to find the table in the table cache.
1269
- if one of the discovered Table instances is name-locked
1270
(table->getShare()->version == 0) back off -- we have to wait
1271
until no one holds a name lock on the table.
1272
- if there is no such Table in the name cache, read the table definition
1273
and insert it into the cache.
1274
We perform all of the above under LOCK_open which currently protects
1275
the open cache (also known as table cache) and table definitions stored
1279
LOCK_open.lock(); /* Lock for FLUSH TABLES for open table */
1282
Actually try to find the table in the open_cache.
1283
The cache may contain several "Table" instances for the same
1284
physical table. The instances that are currently "in use" by
1285
some thread have their "in_use" member != NULL.
1286
There is no good reason for having more than one entry in the
1287
hash for the same physical table, except that we use this as
1288
an implicit "pending locks queue" - see
1289
wait_for_locked_table_names for details.
1291
ppp= get_open_cache().equal_range(key);
1294
for (TableOpenCache::const_iterator iter= ppp.first;
1295
iter != ppp.second; ++iter, table= NULL)
1297
table= (*iter).second;
1299
if (not table->in_use)
954
if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
956
my_error(ER_TABLE_UNKNOWN, identifier);
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.
1302
Here we flush tables marked for flush.
1303
Normally, table->getShare()->version contains the value of
1304
refresh_version from the moment when this table was
1305
(re-)opened and added to the cache.
1306
If since then we did (or just started) FLUSH TABLES
1307
statement, refresh_version has been increased.
1308
For "name-locked" Table instances, table->getShare()->version is set
1309
to 0 (see lock_table_name for details).
1310
In case there is a pending FLUSH TABLES or a name lock, we
1311
need to back off and re-start opening tables.
1312
If we do not back off now, we may dead lock in case of lock
1313
order mismatch with some other thread:
1314
c1-> name lock t1; -- sort of exclusive lock
1315
c2-> open t2; -- sort of shared lock
1316
c1-> name lock t2; -- blocks
1317
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 */
1319
if (table->needs_reopen_or_name_lock())
1321
if (flags & DRIZZLE_LOCK_IGNORE_FLUSH)
1323
/* Force close at once after usage */
1324
version= table->getShare()->getVersion();
1328
/* Avoid self-deadlocks by detecting self-dependencies. */
1329
if (table->open_placeholder && table->in_use == this)
1332
my_error(ER_UPDATE_TABLE_USED, MYF(0), table->getMutableShare()->getTableName());
1337
Back off, part 1: mark the table as "unused" for the
1338
purpose of name-locking by setting table->db_stat to 0. Do
1339
that only for the tables in this thread that have an old
1340
table->getShare()->version (this is an optimization (?)).
1341
table->db_stat == 0 signals wait_for_locked_table_names
1342
that the tables in question are not used any more. See
1343
table_is_used call for details.
1345
close_old_data_files(false, false);
1348
Back-off part 2: try to avoid "busy waiting" on the table:
1349
if the table is in use by some other thread, we suspend
1350
and wait till the operation is complete: when any
1351
operation that juggles with table->getShare()->version completes,
1352
it broadcasts COND_refresh condition variable.
1353
If 'old' table we met is in use by current thread we return
1354
without waiting since in this situation it's this thread
1355
which is responsible for broadcasting on COND_refresh
1356
(and this was done already in Session::close_old_data_files()).
1357
Good example of such situation is when we have statement
1358
that needs two instances of table and FLUSH TABLES comes
1359
after we open first instance but before we open second
1362
if (table->in_use != this)
1364
/* wait_for_conditionwill unlock LOCK_open for us */
1365
wait_for_condition(LOCK_open, COND_refresh);
1372
There is a refresh in progress for this table.
1373
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 */
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
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)
1382
unused_tables.unlink(table);
1383
table->in_use= this;
1387
/* Insert a new Table instance into the open cache */
1389
/* Free cache if too big */
1390
unused_tables.cull();
1392
if (table_list->isCreate())
1394
TableIdentifier lock_table_identifier(table_list->db, table_list->table_name, message::Table::STANDARD);
1396
if (not plugin::StorageEngine::doesTableExist(*this, lock_table_identifier))
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
1399
Table to be created, so we need to create placeholder in table-cache.
1047
if (table->needs_reopen_or_name_lock())
1401
if (!(table= table_cache_insert_placeholder(table_list->db, table_list->table_name)))
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.
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 */
1407
Link placeholder to the open tables list so it will be automatically
1408
removed once tables are closed. Also mark it so it won't be ignored
1409
by other trying to take name-lock.
1411
table->open_placeholder= true;
1412
table->setNext(open_tables);
1418
/* Table exists. Let us try to open it. */
1421
/* make a new table */
1429
error= open_unireg_entry(this, table, alias, identifier);
1436
(void)add_table(table);
1442
table->setNext(open_tables); /* Link into simple list */
1445
table->reginfo.lock_type= TL_READ; /* Assume read */
1178
1448
assert(table->getShare()->getTableCount() > 0 || table->getShare()->getType() != message::Table::STANDARD);
1450
if (lex->need_correct_ident())
1451
table->alias_name_used= my_strcasecmp(table_alias_charset,
1452
table->getMutableShare()->getTableName(), alias);
1180
1453
/* Fix alias if table name changes */
1181
1454
if (strcmp(table->getAlias(), alias))
1183
table->setAlias(alias);
1456
uint32_t length=(uint32_t) strlen(alias)+1;
1457
table->alias= (char*) realloc((char*) table->alias, length);
1458
memcpy((void*) table->alias, alias, length);
1186
1461
/* These variables are also set in reopen_table() */
3932
4467
unireg support functions
3933
4468
*****************************************************************************/
4471
Invalidate any cache entries that are for some DB
4474
remove_db_from_cache()
4475
db Database name. This will be in lower case if
4476
lower_case_table_name is set
4479
We can't use hash_delete when looping hash_elements. We mark them first
4480
and afterwards delete those marked unused.
4483
void remove_db_from_cache(const SchemaIdentifier &schema_identifier)
4485
safe_mutex_assert_owner(LOCK_open.native_handle());
4487
for (TableOpenCache::const_iterator iter= get_open_cache().begin();
4488
iter != get_open_cache().end();
4491
Table *table= (*iter).second;
4493
if (not schema_identifier.getPath().compare(table->getMutableShare()->getSchemaName()))
4495
table->getMutableShare()->resetVersion(); /* Free when thread is ready */
4496
if (not table->in_use)
4497
unused_tables.relink(table);
4501
unused_tables.cullByVersion();
4506
Mark all entries with the table as deleted to force an reopen of the table
4508
The table will be closed (not stored in cache) by the current thread when
4509
close_thread_tables() is called.
4515
0 This thread now have exclusive access to this table and no other thread
4516
can access the table until close_thread_tables() is called.
4517
1 Table is in use by another thread
4520
bool remove_table_from_cache(Session *session, TableIdentifier &identifier, uint32_t flags)
4522
const TableIdentifier::Key &key(identifier.getKey());
4524
bool signalled= false;
4528
result= signalled= false;
4530
TableOpenCacheRange ppp;
4531
ppp= get_open_cache().equal_range(key);
4533
for (TableOpenCache::const_iterator iter= ppp.first;
4534
iter != ppp.second; ++iter)
4536
Table *table= (*iter).second;
4539
table->getMutableShare()->resetVersion(); /* Free when thread is ready */
4540
if (!(in_use=table->in_use))
4542
unused_tables.relink(table);
4544
else if (in_use != session)
4547
Mark that table is going to be deleted from cache. This will
4548
force threads that are in mysql_lock_tables() (but not yet
4549
in thr_multi_lock()) to abort it's locks, close all tables and retry
4551
in_use->some_tables_deleted= true;
4552
if (table->is_name_opened())
4557
Now we must abort all tables locks used by this thread
4558
as the thread may be waiting to get a lock for another table.
4559
Note that we need to hold LOCK_open while going through the
4560
list. So that the other thread cannot change it. The other
4561
thread must also hold LOCK_open whenever changing the
4562
open_tables list. Aborting the MERGE lock after a child was
4563
closed and before the parent is closed would be fatal.
4565
for (Table *session_table= in_use->open_tables;
4567
session_table= session_table->getNext())
4569
/* Do not handle locks of MERGE children. */
4570
if (session_table->db_stat) // If table is open
4571
signalled|= mysql_lock_abort_for_thread(session, session_table);
4575
result= result || (flags & RTFC_OWNED_BY_Session_FLAG);
4578
unused_tables.cullByVersion();
4580
/* Remove table from table definition cache if it's not in use */
4581
TableShare::release(identifier);
4583
if (result && (flags & RTFC_WAIT_OTHER_THREAD_FLAG))
4586
Signal any thread waiting for tables to be freed to
4589
broadcast_refresh();
4590
if (!(flags & RTFC_CHECK_KILLED_FLAG) || !session->killed)
4593
if (likely(signalled))
4594
(void) pthread_cond_wait(COND_refresh.native_handle(), LOCK_open.native_handle());
4597
struct timespec abstime;
4599
It can happen that another thread has opened the
4600
table but has not yet locked any table at all. Since
4601
it can be locked waiting for a table that our thread
4602
has done LOCK Table x WRITE on previously, we need to
4603
ensure that the thread actually hears our signal
4604
before we go to sleep. Thus we wait for a short time
4605
and then we retry another loop in the
4606
remove_table_from_cache routine.
4608
set_timespec(abstime, 10);
4609
pthread_cond_timedwait(COND_refresh.native_handle(), LOCK_open.native_handle(), &abstime);