173
246
bool result= false;
174
247
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)
249
pthread_mutex_lock(&LOCK_open); /* Optionally lock for remove tables from open_cahe if not in use */
253
refresh_version++; // Force close of open tables
254
while (unused_tables)
256
hash_delete(&open_cache,(unsigned char*) unused_tables);
259
if (wait_for_refresh)
262
Other threads could wait in a loop in open_and_lock_tables(),
263
trying to lock one or more of our tables.
265
If they wait for the locks in thr_multi_lock(), their lock
266
request is aborted. They loop in open_and_lock_tables() and
267
enter open_table(). Here they notice the table is refreshed and
268
wait for COND_refresh. Then they loop again in
269
openTablesLock() and this time open_table() succeeds. At
270
this moment, if we (the FLUSH TABLES thread) are scheduled and
271
on another FLUSH TABLES enter close_cached_tables(), they could
272
awake while we sleep below, waiting for others threads (us) to
273
close their open tables. If this happens, the other threads
274
would find the tables unlocked. They would get the locks, one
275
after the other, and could do their destructive work. This is an
276
issue if we have LOCK TABLES in effect.
278
The problem is that the other threads passed all checks in
279
open_table() before we refresh the table.
281
The fix for this problem is to set some_tables_deleted for all
282
threads with open tables. These threads can still get their
283
locks, but will immediately release them again after checking
284
this variable. They will then loop in openTablesLock()
285
again. There they will wait until we update all tables version
288
Setting some_tables_deleted is done by remove_table_from_cache()
291
In other words (reviewer suggestion): You need this setting of
292
some_tables_deleted for the case when table was opened and all
293
related checks were passed before incrementing refresh_version
294
(which you already have) but attempt to lock the table happened
295
after the call to Session::close_old_data_files() i.e. after removal of
296
current thread locks.
298
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
300
Table *table=(Table*) hash_element(&open_cache,idx);
302
table->in_use->some_tables_deleted= false;
309
for (TableList *table= tables; table; table= table->next_local)
311
if (remove_table_from_cache(session, table->db, table->table_name,
312
RTFC_OWNED_BY_Session_FLAG))
316
wait_for_refresh= false; // Nothing to wait for
319
if (wait_for_refresh)
322
If there is any table that has a lower refresh_version, wait until
323
this is closed (or this thread is killed) before returning
325
session->mysys_var->current_mutex= &LOCK_open;
326
session->mysys_var->current_cond= &COND_refresh;
327
session->set_proc_info("Flushing tables");
329
session->close_old_data_files();
332
/* Wait until all threads has closed all the tables we had locked */
333
while (found && ! session->killed)
336
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
338
Table *table=(Table*) hash_element(&open_cache,idx);
339
/* Avoid a self-deadlock. */
340
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.
343
Note that we wait here only for tables which are actually open, and
344
not for placeholders with Table::open_placeholder set. Waiting for
345
latter will cause deadlock in the following scenario, for example:
347
conn1: lock table t1 write;
348
conn2: lock table t2 write;
352
It also does not make sense to wait for those of placeholders that
353
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))
356
if (table->needs_reopen_or_name_lock() && (table->db_stat ||
357
(table->open_placeholder && wait_for_placeholders)))
360
pthread_cond_wait(&COND_refresh,&LOCK_open);
247
wait_for_refresh= false; // Nothing to wait for
366
No other thread has the locked tables open; reopen them and get the
367
old locks. This should always succeed (unless some external process
368
has removed the tables)
370
result= session->reopen_tables(true, true);
250
if (wait_for_refresh)
372
/* Set version for table */
373
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();
376
Preserve the version (0) of write locked tables so that a impending
377
global read lock won't sneak in.
379
if (table->reginfo.lock_type < TL_WRITE_ALLOW_WRITE)
380
table->getMutableShare()->version= refresh_version;
384
pthread_mutex_unlock(&LOCK_open);
318
386
if (wait_for_refresh)
320
boost_unique_lock_t scopedLock(session->mysys_var->mutex);
388
pthread_mutex_lock(&session->mysys_var->mutex);
321
389
session->mysys_var->current_mutex= 0;
322
390
session->mysys_var->current_cond= 0;
323
391
session->set_proc_info(0);
392
pthread_mutex_unlock(&session->mysys_var->mutex);
750
876
cond Condition to wait for
753
void Session::wait_for_condition(boost::mutex &mutex, boost::condition_variable_any &cond)
879
void Session::wait_for_condition(pthread_mutex_t *mutex, pthread_cond_t *cond)
755
881
/* Wait until the current table is up to date */
756
882
const char *saved_proc_info;
757
mysys_var->current_mutex= &mutex;
758
mysys_var->current_cond= &cond;
883
mysys_var->current_mutex= mutex;
884
mysys_var->current_cond= cond;
759
885
saved_proc_info= get_proc_info();
760
886
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);
888
(void) pthread_cond_wait(cond, mutex);
891
We must unlock mutex first to avoid deadlock becasue conditions are
892
sent to this thread by doing locks in the following order:
893
lock(mysys_var->mutex)
894
lock(mysys_var->current_mutex)
896
One by effect of this that one can only use wait_for_condition with
897
condition variables that are guranteed to not disapper (freed) even if this
901
pthread_mutex_unlock(mutex);
902
pthread_mutex_lock(&mysys_var->mutex);
779
903
mysys_var->current_mutex= 0;
780
904
mysys_var->current_cond= 0;
781
905
set_proc_info(saved_proc_info);
906
pthread_mutex_unlock(&mysys_var->mutex);
911
Open table which is already name-locked by this thread.
914
reopen_name_locked_table()
915
session Thread handle
916
table_list TableList object for table to be open, TableList::table
917
member should point to Table object which was used for
919
link_in true - if Table object for table to be opened should be
920
linked into Session::open_tables list.
921
false - placeholder used for name-locking is already in
922
this list so we only need to preserve Table::next
926
This function assumes that its caller already acquired LOCK_open mutex.
933
bool Session::reopen_name_locked_table(TableList* table_list, bool link_in)
935
Table *table= table_list->table;
937
char *table_name= table_list->table_name;
940
safe_mutex_assert_owner(&LOCK_open);
942
if (killed || !table)
947
if (open_unireg_entry(this, table, table_name,
948
const_cast<char *>(table->getMutableShare()->getCacheKey()),
949
table->getShare()->getCacheKeySize()))
951
table->intern_close_table();
953
If there was an error during opening of table (for example if it
954
does not exist) '*table' object can be wiped out. To be able
955
properly release name-lock in this case we should restore this
956
object to its original state.
962
share= table->getMutableShare();
964
We want to prevent other connections from opening this table until end
965
of statement as it is likely that modifications of table's metadata are
966
not yet finished (for example CREATE TRIGGER have to change .TRG cursor,
967
or we might want to drop table if CREATE TABLE ... SELECT fails).
968
This also allows us to assume that no other connection will sneak in
969
before we will get table-level lock on this table.
972
table->in_use = this;
976
table->next= open_tables;
982
Table object should be already in Session::open_tables list so we just
983
need to set Table::next correctly.
985
table->next= orig_table.next;
988
table->tablenr= current_tablenr++;
989
table->used_fields= 0;
990
table->const_table= 0;
991
table->null_row= false;
992
table->maybe_null= false;
993
table->force_index= false;
994
table->status= STATUS_NO_RECORD;
941
1169
if (table->query_id)
943
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->getAlias());
1171
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->alias);
946
1174
table->query_id= getQueryId();
954
if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
956
my_error(ER_TABLE_UNKNOWN, identifier);
1179
if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
1181
my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->table_name);
1186
If it's the first table from a list of tables used in a query,
1187
remember refresh_version (the version of open_cache state).
1188
If the version changes while we're opening the remaining tables,
1189
we will have to back off, close all the tables opened-so-far,
1190
and try to reopen them.
1192
Note-> refresh_version is currently changed only during FLUSH TABLES.
1196
version= refresh_version;
1198
else if ((version != refresh_version) &&
1199
! (flags & DRIZZLE_LOCK_IGNORE_FLUSH))
1201
/* Someone did a refresh while thread was opening tables */
1209
Before we test the global cache, we test our local session cache.
1213
assert(false); /* Not implemented yet */
1217
Non pre-locked/LOCK TABLES mode, and the table is not temporary:
1218
this is the normal use case.
1220
- try to find the table in the table cache.
1221
- if one of the discovered Table instances is name-locked
1222
(table->getShare()->version == 0) back off -- we have to wait
1223
until no one holds a name lock on the table.
1224
- if there is no such Table in the name cache, read the table definition
1225
and insert it into the cache.
1226
We perform all of the above under LOCK_open which currently protects
1227
the open cache (also known as table cache) and table definitions stored
1231
pthread_mutex_lock(&LOCK_open); /* Lock for FLUSH TABLES for open table */
1234
Actually try to find the table in the open_cache.
1235
The cache may contain several "Table" instances for the same
1236
physical table. The instances that are currently "in use" by
1237
some thread have their "in_use" member != NULL.
1238
There is no good reason for having more than one entry in the
1239
hash for the same physical table, except that we use this as
1240
an implicit "pending locks queue" - see
1241
wait_for_locked_table_names for details.
1243
for (table= (Table*) hash_first(&open_cache, (unsigned char*) key, key_length,
1245
table && table->in_use ;
1246
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.
1250
Here we flush tables marked for flush.
1251
Normally, table->getShare()->version contains the value of
1252
refresh_version from the moment when this table was
1253
(re-)opened and added to the cache.
1254
If since then we did (or just started) FLUSH TABLES
1255
statement, refresh_version has been increased.
1256
For "name-locked" Table instances, table->getShare()->version is set
1257
to 0 (see lock_table_name for details).
1258
In case there is a pending FLUSH TABLES or a name lock, we
1259
need to back off and re-start opening tables.
1260
If we do not back off now, we may dead lock in case of lock
1261
order mismatch with some other thread:
1262
c1: name lock t1; -- sort of exclusive lock
1263
c2: open t2; -- sort of shared lock
1264
c1: name lock t2; -- blocks
1265
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 */
1267
if (table->needs_reopen_or_name_lock())
1269
if (flags & DRIZZLE_LOCK_IGNORE_FLUSH)
1271
/* Force close at once after usage */
1272
version= table->getShare()->version;
1276
/* Avoid self-deadlocks by detecting self-dependencies. */
1277
if (table->open_placeholder && table->in_use == this)
1279
pthread_mutex_unlock(&LOCK_open);
1280
my_error(ER_UPDATE_TABLE_USED, MYF(0), table->getMutableShare()->getTableName());
1285
Back off, part 1: mark the table as "unused" for the
1286
purpose of name-locking by setting table->db_stat to 0. Do
1287
that only for the tables in this thread that have an old
1288
table->getShare()->version (this is an optimization (?)).
1289
table->db_stat == 0 signals wait_for_locked_table_names
1290
that the tables in question are not used any more. See
1291
table_is_used call for details.
1293
close_old_data_files(false, false);
1296
Back-off part 2: try to avoid "busy waiting" on the table:
1297
if the table is in use by some other thread, we suspend
1298
and wait till the operation is complete: when any
1299
operation that juggles with table->getShare()->version completes,
1300
it broadcasts COND_refresh condition variable.
1301
If 'old' table we met is in use by current thread we return
1302
without waiting since in this situation it's this thread
1303
which is responsible for broadcasting on COND_refresh
1304
(and this was done already in Session::close_old_data_files()).
1305
Good example of such situation is when we have statement
1306
that needs two instances of table and FLUSH TABLES comes
1307
after we open first instance but before we open second
1310
if (table->in_use != this)
1312
/* wait_for_conditionwill unlock LOCK_open for us */
1313
wait_for_condition(&LOCK_open, &COND_refresh);
1317
pthread_mutex_unlock(&LOCK_open);
1320
There is a refresh in progress for this table.
1321
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 */
1330
/* Unlink the table from "unused_tables" list. */
1331
if (table == unused_tables)
1333
unused_tables=unused_tables->next; // Remove from link
1334
if (table == unused_tables)
1335
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
1337
table->prev->next=table->next; /* Remove from unused list */
1338
table->next->prev=table->prev;
1339
table->in_use= this;
1343
/* Insert a new Table instance into the open cache */
1345
/* Free cache if too big */
1346
while (open_cache.records > table_cache_size && unused_tables)
1347
hash_delete(&open_cache,(unsigned char*) unused_tables);
1349
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)
1351
TableIdentifier lock_table_identifier(table_list->db, table_list->table_name, message::Table::STANDARD);
1353
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
1356
Table to be created, so we need to create placeholder in table-cache.
1047
if (table->needs_reopen_or_name_lock())
1358
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.
1360
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);
1364
Link placeholder to the open tables list so it will be automatically
1365
removed once tables are closed. Also mark it so it won't be ignored
1366
by other trying to take name-lock.
1368
table->open_placeholder= true;
1369
table->next= open_tables;
1371
pthread_mutex_unlock(&LOCK_open);
1375
/* Table exists. Let us try to open it. */
1378
/* make a new table */
1379
table= (Table *)malloc(sizeof(Table));
1380
memset(table, 0, sizeof(Table));
1383
pthread_mutex_unlock(&LOCK_open);
1387
error= open_unireg_entry(this, table, alias, key, key_length);
1391
pthread_mutex_unlock(&LOCK_open);
1394
my_hash_insert(&open_cache, (unsigned char*) table);
1397
pthread_mutex_unlock(&LOCK_open);
1400
table->next= open_tables; /* Link into simple list */
1403
table->reginfo.lock_type= TL_READ; /* Assume read */
1406
assert(table->getShare()->ref_count > 0 || table->getShare()->tmp_table != message::Table::STANDARD);
1408
if (lex->need_correct_ident())
1409
table->alias_name_used= my_strcasecmp(table_alias_charset,
1410
table->getMutableShare()->getTableName(), alias);
1180
1411
/* Fix alias if table name changes */
1181
if (strcmp(table->getAlias(), alias))
1412
if (strcmp(table->alias, alias))
1183
table->setAlias(alias);
1414
uint32_t length=(uint32_t) strlen(alias)+1;
1415
table->alias= (char*) realloc((char*) table->alias, length);
1416
memcpy((void*) table->alias, alias, length);
1186
1419
/* These variables are also set in reopen_table() */
1515
1914
other threads trying to get the lock.
1518
void abort_locked_tables(Session *session, const drizzled::identifier::Table &identifier)
1917
void abort_locked_tables(Session *session,const char *db, const char *table_name)
1521
for (table= session->open_tables; table ; table= table->getNext())
1920
for (table= session->open_tables; table ; table= table->next)
1523
if (table->getShare()->getCacheKey() == identifier.getKey())
1922
if (!strcmp(table->getMutableShare()->getTableName(), table_name) &&
1923
!strcmp(table->getMutableShare()->getSchemaName(), db))
1525
1925
/* If MERGE child, forward lock handling to parent. */
1526
session->abortLock(table);
1926
mysql_lock_abort(session, table);
1933
Load a table definition from cursor and open unireg table
1937
session Thread handle
1938
entry Store open table definition here
1939
table_list TableList with db, table_name
1941
cache_key Key for share_cache
1942
cache_key_length length of cache_key
1945
Extra argument for open is taken from session->open_options
1946
One must have a lock on LOCK_open when calling this function
1953
static int open_unireg_entry(Session *session,
1956
char *cache_key, uint32_t cache_key_length)
1960
uint32_t discover_retry_count= 0;
1962
safe_mutex_assert_owner(&LOCK_open);
1964
if (not (share= TableShare::getShare(session, cache_key,
1969
while ((error= share->open_table_from_share(session, alias,
1970
(uint32_t) (HA_OPEN_KEYFILE |
1974
session->open_options, *entry)))
1976
if (error == 7) // Table def changed
1978
share->version= 0; // Mark share as old
1979
if (discover_retry_count++) // Retry once
1984
Here we should wait until all threads has released the table.
1985
For now we do one retry. This may cause a deadlock if there
1986
is other threads waiting for other tables used by this thread.
1988
Proper fix would be to if the second retry failed:
1989
- Mark that table def changed
1990
- Return from open table
1991
- Close all tables used by this thread
1992
- Start waiting that the share is released
1993
- Retry by opening all tables again
1998
To avoid deadlock, only wait for release if no one else is
2001
if (share->ref_count != 1)
2003
/* Free share and wait until it's released by all threads */
2004
TableShare::release(share);
2006
if (!session->killed)
2008
drizzle_reset_errors(session, 1); // Clear warnings
2009
session->clear_error(); // Clear error message
2021
TableShare::release(share);
1535
2028
Open all tables in list
3933
4428
unireg support functions
3934
4429
*****************************************************************************/
4432
Invalidate any cache entries that are for some DB
4435
remove_db_from_cache()
4436
db Database name. This will be in lower case if
4437
lower_case_table_name is set
4440
We can't use hash_delete when looping hash_elements. We mark them first
4441
and afterwards delete those marked unused.
4444
void remove_db_from_cache(SchemaIdentifier &schema_identifier)
4446
safe_mutex_assert_owner(&LOCK_open);
4448
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
4450
Table *table=(Table*) hash_element(&open_cache,idx);
4451
if (not schema_identifier.getPath().compare(table->getMutableShare()->getSchemaName()))
4453
table->getMutableShare()->version= 0L; /* Free when thread is ready */
4454
if (not table->in_use)
4455
relink_unused(table);
4458
while (unused_tables && !unused_tables->getShare()->version)
4459
hash_delete(&open_cache,(unsigned char*) unused_tables);
4464
Mark all entries with the table as deleted to force an reopen of the table
4466
The table will be closed (not stored in cache) by the current thread when
4467
close_thread_tables() is called.
4473
0 This thread now have exclusive access to this table and no other thread
4474
can access the table until close_thread_tables() is called.
4475
1 Table is in use by another thread
4478
bool remove_table_from_cache(Session *session, const char *db, const char *table_name,
4481
char key[MAX_DBKEY_LENGTH];
4483
uint32_t key_length;
4486
bool signalled= false;
4488
key_pos= strcpy(key_pos, db) + strlen(db);
4489
key_pos= strcpy(key_pos+1, table_name) + strlen(table_name);
4490
key_length= (uint32_t) (key_pos-key)+1;
4494
HASH_SEARCH_STATE state;
4495
result= signalled= false;
4497
for (table= (Table*) hash_first(&open_cache, (unsigned char*) key, key_length,
4500
table= (Table*) hash_next(&open_cache, (unsigned char*) key, key_length,
4505
table->getMutableShare()->version=0L; /* Free when thread is ready */
4506
if (!(in_use=table->in_use))
4508
relink_unused(table);
4510
else if (in_use != session)
4513
Mark that table is going to be deleted from cache. This will
4514
force threads that are in mysql_lock_tables() (but not yet
4515
in thr_multi_lock()) to abort it's locks, close all tables and retry
4517
in_use->some_tables_deleted= true;
4518
if (table->is_name_opened())
4523
Now we must abort all tables locks used by this thread
4524
as the thread may be waiting to get a lock for another table.
4525
Note that we need to hold LOCK_open while going through the
4526
list. So that the other thread cannot change it. The other
4527
thread must also hold LOCK_open whenever changing the
4528
open_tables list. Aborting the MERGE lock after a child was
4529
closed and before the parent is closed would be fatal.
4531
for (Table *session_table= in_use->open_tables;
4533
session_table= session_table->next)
4535
/* Do not handle locks of MERGE children. */
4536
if (session_table->db_stat) // If table is open
4537
signalled|= mysql_lock_abort_for_thread(session, session_table);
4541
result= result || (flags & RTFC_OWNED_BY_Session_FLAG);
4543
while (unused_tables && !unused_tables->getShare()->version)
4544
hash_delete(&open_cache,(unsigned char*) unused_tables);
4546
/* Remove table from table definition cache if it's not in use */
4547
TableShare::release(key, key_length);
4549
if (result && (flags & RTFC_WAIT_OTHER_THREAD_FLAG))
4552
Signal any thread waiting for tables to be freed to
4555
broadcast_refresh();
4556
if (!(flags & RTFC_CHECK_KILLED_FLAG) || !session->killed)
4559
if (likely(signalled))
4560
(void) pthread_cond_wait(&COND_refresh, &LOCK_open);
4563
struct timespec abstime;
4565
It can happen that another thread has opened the
4566
table but has not yet locked any table at all. Since
4567
it can be locked waiting for a table that our thread
4568
has done LOCK Table x WRITE on previously, we need to
4569
ensure that the thread actually hears our signal
4570
before we go to sleep. Thus we wait for a short time
4571
and then we retry another loop in the
4572
remove_table_from_cache routine.
4574
set_timespec(abstime, 10);
4575
pthread_cond_timedwait(&COND_refresh, &LOCK_open, &abstime);