241
170
bool result= false;
242
171
Session *session= this;
244
pthread_mutex_lock(&LOCK_open); /* Optionally lock for remove tables from open_cahe if not in use */
248
refresh_version++; // Force close of open tables
249
while (unused_tables)
250
hash_delete(&open_cache,(unsigned char*) unused_tables);
174
table::Cache::singleton().mutex().lock(); /* Optionally lock for remove tables from open_cahe if not in use */
178
refresh_version++; // Force close of open tables
180
table::getUnused().clear();
182
if (wait_for_refresh)
185
Other threads could wait in a loop in open_and_lock_tables(),
186
trying to lock one or more of our tables.
188
If they wait for the locks in thr_multi_lock(), their lock
189
request is aborted. They loop in open_and_lock_tables() and
190
enter open_table(). Here they notice the table is refreshed and
191
wait for COND_refresh. Then they loop again in
192
openTablesLock() and this time open_table() succeeds. At
193
this moment, if we (the FLUSH TABLES thread) are scheduled and
194
on another FLUSH TABLES enter close_cached_tables(), they could
195
awake while we sleep below, waiting for others threads (us) to
196
close their open tables. If this happens, the other threads
197
would find the tables unlocked. They would get the locks, one
198
after the other, and could do their destructive work. This is an
199
issue if we have LOCK TABLES in effect.
201
The problem is that the other threads passed all checks in
202
open_table() before we refresh the table.
204
The fix for this problem is to set some_tables_deleted for all
205
threads with open tables. These threads can still get their
206
locks, but will immediately release them again after checking
207
this variable. They will then loop in openTablesLock()
208
again. There they will wait until we update all tables version
211
Setting some_tables_deleted is done by table::Cache::singleton().removeTable()
214
In other words (reviewer suggestion): You need this setting of
215
some_tables_deleted for the case when table was opened and all
216
related checks were passed before incrementing refresh_version
217
(which you already have) but attempt to lock the table happened
218
after the call to Session::close_old_data_files() i.e. after removal of
219
current thread locks.
221
for (table::CacheMap::const_iterator iter= table::getCache().begin();
222
iter != table::getCache().end();
225
Table *table= (*iter).second;
227
table->in_use->some_tables_deleted= false;
234
for (TableList *table= tables; table; table= table->next_local)
236
TableIdentifier identifier(table->getSchemaName(), table->getTableName());
237
if (table::Cache::singleton().removeTable(session, identifier,
238
RTFC_OWNED_BY_Session_FLAG))
244
wait_for_refresh= false; // Nothing to wait for
252
247
if (wait_for_refresh)
255
Other threads could wait in a loop in open_and_lock_tables(),
256
trying to lock one or more of our tables.
258
If they wait for the locks in thr_multi_lock(), their lock
259
request is aborted. They loop in open_and_lock_tables() and
260
enter open_table(). Here they notice the table is refreshed and
261
wait for COND_refresh. Then they loop again in
262
openTablesLock() and this time open_table() succeeds. At
263
this moment, if we (the FLUSH TABLES thread) are scheduled and
264
on another FLUSH TABLES enter close_cached_tables(), they could
265
awake while we sleep below, waiting for others threads (us) to
266
close their open tables. If this happens, the other threads
267
would find the tables unlocked. They would get the locks, one
268
after the other, and could do their destructive work. This is an
269
issue if we have LOCK TABLES in effect.
271
The problem is that the other threads passed all checks in
272
open_table() before we refresh the table.
274
The fix for this problem is to set some_tables_deleted for all
275
threads with open tables. These threads can still get their
276
locks, but will immediately release them again after checking
277
this variable. They will then loop in openTablesLock()
278
again. There they will wait until we update all tables version
281
Setting some_tables_deleted is done by remove_table_from_cache()
284
In other words (reviewer suggestion): You need this setting of
285
some_tables_deleted for the case when table was opened and all
286
related checks were passed before incrementing refresh_version
287
(which you already have) but attempt to lock the table happened
288
after the call to Session::close_old_data_files() i.e. after removal of
289
current thread locks.
250
If there is any table that has a lower refresh_version, wait until
251
this is closed (or this thread is killed) before returning
291
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
253
session->mysys_var->current_mutex= &table::Cache::singleton().mutex();
254
session->mysys_var->current_cond= &COND_refresh;
255
session->set_proc_info("Flushing tables");
257
session->close_old_data_files();
260
/* Wait until all threads has closed all the tables we had locked */
261
while (found && ! session->getKilled())
293
Table *table=(Table*) hash_element(&open_cache,idx);
295
table->in_use->some_tables_deleted= false;
264
for (table::CacheMap::const_iterator iter= table::getCache().begin();
265
iter != table::getCache().end();
268
Table *table= (*iter).second;
269
/* Avoid a self-deadlock. */
270
if (table->in_use == session)
273
Note that we wait here only for tables which are actually open, and
274
not for placeholders with Table::open_placeholder set. Waiting for
275
latter will cause deadlock in the following scenario, for example:
277
conn1-> lock table t1 write;
278
conn2-> lock table t2 write;
279
conn1-> flush tables;
280
conn2-> flush tables;
282
It also does not make sense to wait for those of placeholders that
283
are employed by CREATE TABLE as in this case table simply does not
286
if (table->needs_reopen_or_name_lock() && (table->db_stat ||
287
(table->open_placeholder && wait_for_placeholders)))
290
boost_unique_lock_t scoped(table::Cache::singleton().mutex(), boost::adopt_lock_t());
291
COND_refresh.wait(scoped);
302
for (TableList *table= tables; table; table= table->next_local)
304
if (remove_table_from_cache(session, table->db, table->table_name,
305
RTFC_OWNED_BY_Session_FLAG))
309
wait_for_refresh= false; // Nothing to wait for
312
if (wait_for_refresh)
315
If there is any table that has a lower refresh_version, wait until
316
this is closed (or this thread is killed) before returning
318
session->mysys_var->current_mutex= &LOCK_open;
319
session->mysys_var->current_cond= &COND_refresh;
320
session->set_proc_info("Flushing tables");
322
session->close_old_data_files();
325
/* Wait until all threads has closed all the tables we had locked */
326
while (found && ! session->killed)
329
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
298
No other thread has the locked tables open; reopen them and get the
299
old locks. This should always succeed (unless some external process
300
has removed the tables)
302
result= session->reopen_tables(true, true);
304
/* Set version for table */
305
for (Table *table= session->open_tables; table ; table= table->getNext())
331
Table *table=(Table*) hash_element(&open_cache,idx);
332
/* Avoid a self-deadlock. */
333
if (table->in_use == session)
336
Note that we wait here only for tables which are actually open, and
337
not for placeholders with Table::open_placeholder set. Waiting for
338
latter will cause deadlock in the following scenario, for example:
340
conn1: lock table t1 write;
341
conn2: lock table t2 write;
345
It also does not make sense to wait for those of placeholders that
346
are employed by CREATE TABLE as in this case table simply does not
308
Preserve the version (0) of write locked tables so that a impending
309
global read lock won't sneak in.
349
if (table->needs_reopen_or_name_lock() && (table->db_stat ||
350
(table->open_placeholder && wait_for_placeholders)))
353
pthread_cond_wait(&COND_refresh,&LOCK_open);
311
if (table->reginfo.lock_type < TL_WRITE_ALLOW_WRITE)
312
table->getMutableShare()->refreshVersion();
359
No other thread has the locked tables open; reopen them and get the
360
old locks. This should always succeed (unless some external process
361
has removed the tables)
363
result= session->reopen_tables(true, true);
365
/* Set version for table */
366
for (Table *table= session->open_tables; table ; table= table->next)
369
Preserve the version (0) of write locked tables so that a impending
370
global read lock won't sneak in.
372
if (table->reginfo.lock_type < TL_WRITE_ALLOW_WRITE)
373
table->s->version= refresh_version;
316
table::Cache::singleton().mutex().unlock();
377
pthread_mutex_unlock(&LOCK_open);
379
319
if (wait_for_refresh)
381
pthread_mutex_lock(&session->mysys_var->mutex);
321
boost_unique_lock_t scopedLock(session->mysys_var->mutex);
382
322
session->mysys_var->current_mutex= 0;
383
323
session->mysys_var->current_cond= 0;
384
324
session->set_proc_info(0);
385
pthread_mutex_unlock(&session->mysys_var->mutex);
843
746
cond Condition to wait for
846
void Session::wait_for_condition(pthread_mutex_t *mutex, pthread_cond_t *cond)
749
void Session::wait_for_condition(boost::mutex &mutex, boost::condition_variable_any &cond)
848
751
/* Wait until the current table is up to date */
849
752
const char *saved_proc_info;
850
mysys_var->current_mutex= mutex;
851
mysys_var->current_cond= cond;
753
mysys_var->current_mutex= &mutex;
754
mysys_var->current_cond= &cond;
852
755
saved_proc_info= get_proc_info();
853
756
set_proc_info("Waiting for table");
855
(void) pthread_cond_wait(cond, mutex);
858
We must unlock mutex first to avoid deadlock becasue conditions are
859
sent to this thread by doing locks in the following order:
860
lock(mysys_var->mutex)
861
lock(mysys_var->current_mutex)
863
One by effect of this that one can only use wait_for_condition with
864
condition variables that are guranteed to not disapper (freed) even if this
868
pthread_mutex_unlock(mutex);
869
pthread_mutex_lock(&mysys_var->mutex);
759
We must unlock mutex first to avoid deadlock becasue conditions are
760
sent to this thread by doing locks in the following order:
761
lock(mysys_var->mutex)
762
lock(mysys_var->current_mutex)
764
One by effect of this that one can only use wait_for_condition with
765
condition variables that are guranteed to not disapper (freed) even if this
768
boost_unique_lock_t scopedLock(mutex, boost::adopt_lock_t());
771
cond.wait(scopedLock);
774
boost_unique_lock_t mysys_scopedLock(mysys_var->mutex);
870
775
mysys_var->current_mutex= 0;
871
776
mysys_var->current_cond= 0;
872
777
set_proc_info(saved_proc_info);
873
pthread_mutex_unlock(&mysys_var->mutex);
878
Open table which is already name-locked by this thread.
881
reopen_name_locked_table()
882
session Thread handle
883
table_list TableList object for table to be open, TableList::table
884
member should point to Table object which was used for
886
link_in true - if Table object for table to be opened should be
887
linked into Session::open_tables list.
888
false - placeholder used for name-locking is already in
889
this list so we only need to preserve Table::next
893
This function assumes that its caller already acquired LOCK_open mutex.
900
bool Session::reopen_name_locked_table(TableList* table_list, bool link_in)
902
Table *table= table_list->table;
904
char *table_name= table_list->table_name;
907
safe_mutex_assert_owner(&LOCK_open);
909
if (killed || !table)
914
if (open_unireg_entry(this, table, table_list, table_name,
915
table->s->table_cache_key.str,
916
table->s->table_cache_key.length))
918
table->intern_close_table();
920
If there was an error during opening of table (for example if it
921
does not exist) '*table' object can be wiped out. To be able
922
properly release name-lock in this case we should restore this
923
object to its original state.
931
We want to prevent other connections from opening this table until end
932
of statement as it is likely that modifications of table's metadata are
933
not yet finished (for example CREATE TRIGGER have to change .TRG cursor,
934
or we might want to drop table if CREATE TABLE ... SELECT fails).
935
This also allows us to assume that no other connection will sneak in
936
before we will get table-level lock on this table.
939
table->in_use = this;
943
table->next= open_tables;
949
Table object should be already in Session::open_tables list so we just
950
need to set Table::next correctly.
952
table->next= orig_table.next;
955
table->tablenr= current_tablenr++;
956
table->used_fields= 0;
957
table->const_table= 0;
958
table->null_row= false;
959
table->maybe_null= false;
960
table->force_index= false;
961
table->status= STATUS_NO_RECORD;
1148
937
if (table->query_id)
1150
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->alias);
939
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->getAlias());
1153
942
table->query_id= getQueryId();
1158
if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
1160
my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->table_name);
1165
If it's the first table from a list of tables used in a query,
1166
remember refresh_version (the version of open_cache state).
1167
If the version changes while we're opening the remaining tables,
1168
we will have to back off, close all the tables opened-so-far,
1169
and try to reopen them.
1171
Note-> refresh_version is currently changed only during FLUSH TABLES.
1174
version= refresh_version;
1175
else if ((version != refresh_version) &&
1176
! (flags & DRIZZLE_LOCK_IGNORE_FLUSH))
1178
/* Someone did a refresh while thread was opening tables */
1186
Before we test the global cache, we test our local session cache.
1190
assert(false); /* Not implemented yet */
1194
Non pre-locked/LOCK TABLES mode, and the table is not temporary:
1195
this is the normal use case.
1197
- try to find the table in the table cache.
1198
- if one of the discovered Table instances is name-locked
1199
(table->s->version == 0) back off -- we have to wait
1200
until no one holds a name lock on the table.
1201
- if there is no such Table in the name cache, read the table definition
1202
and insert it into the cache.
1203
We perform all of the above under LOCK_open which currently protects
1204
the open cache (also known as table cache) and table definitions stored
1208
pthread_mutex_lock(&LOCK_open); /* Lock for FLUSH TABLES for open table */
1211
Actually try to find the table in the open_cache.
1212
The cache may contain several "Table" instances for the same
1213
physical table. The instances that are currently "in use" by
1214
some thread have their "in_use" member != NULL.
1215
There is no good reason for having more than one entry in the
1216
hash for the same physical table, except that we use this as
1217
an implicit "pending locks queue" - see
1218
wait_for_locked_table_names for details.
1220
for (table= (Table*) hash_first(&open_cache, (unsigned char*) key, key_length,
1222
table && table->in_use ;
1223
table= (Table*) hash_next(&open_cache, (unsigned char*) key, key_length,
950
if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
952
my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->getSchemaName(), table_list->getTableName());
1227
Here we flush tables marked for flush.
1228
Normally, table->s->version contains the value of
1229
refresh_version from the moment when this table was
1230
(re-)opened and added to the cache.
1231
If since then we did (or just started) FLUSH TABLES
1232
statement, refresh_version has been increased.
1233
For "name-locked" Table instances, table->s->version is set
1234
to 0 (see lock_table_name for details).
1235
In case there is a pending FLUSH TABLES or a name lock, we
1236
need to back off and re-start opening tables.
1237
If we do not back off now, we may dead lock in case of lock
1238
order mismatch with some other thread:
1239
c1: name lock t1; -- sort of exclusive lock
1240
c2: open t2; -- sort of shared lock
1241
c1: name lock t2; -- blocks
1242
c2: open t1; -- blocks
957
If it's the first table from a list of tables used in a query,
958
remember refresh_version (the version of open_cache state).
959
If the version changes while we're opening the remaining tables,
960
we will have to back off, close all the tables opened-so-far,
961
and try to reopen them.
963
Note-> refresh_version is currently changed only during FLUSH TABLES.
1244
if (table->needs_reopen_or_name_lock())
1246
if (flags & DRIZZLE_LOCK_IGNORE_FLUSH)
1248
/* Force close at once after usage */
1249
version= table->s->version;
1253
/* Avoid self-deadlocks by detecting self-dependencies. */
1254
if (table->open_placeholder && table->in_use == this)
1256
pthread_mutex_unlock(&LOCK_open);
1257
my_error(ER_UPDATE_TABLE_USED, MYF(0), table->s->table_name.str);
1262
Back off, part 1: mark the table as "unused" for the
1263
purpose of name-locking by setting table->db_stat to 0. Do
1264
that only for the tables in this thread that have an old
1265
table->s->version (this is an optimization (?)).
1266
table->db_stat == 0 signals wait_for_locked_table_names
1267
that the tables in question are not used any more. See
1268
table_is_used call for details.
1270
close_old_data_files(false, false);
1273
Back-off part 2: try to avoid "busy waiting" on the table:
1274
if the table is in use by some other thread, we suspend
1275
and wait till the operation is complete: when any
1276
operation that juggles with table->s->version completes,
1277
it broadcasts COND_refresh condition variable.
1278
If 'old' table we met is in use by current thread we return
1279
without waiting since in this situation it's this thread
1280
which is responsible for broadcasting on COND_refresh
1281
(and this was done already in Session::close_old_data_files()).
1282
Good example of such situation is when we have statement
1283
that needs two instances of table and FLUSH TABLES comes
1284
after we open first instance but before we open second
1287
if (table->in_use != this)
1289
/* wait_for_conditionwill unlock LOCK_open for us */
1290
wait_for_condition(&LOCK_open, &COND_refresh);
1294
pthread_mutex_unlock(&LOCK_open);
1297
There is a refresh in progress for this table.
1298
Signal the caller that it has to try again.
967
version= refresh_version;
969
else if ((version != refresh_version) &&
970
! (flags & DRIZZLE_LOCK_IGNORE_FLUSH))
972
/* Someone did a refresh while thread was opening tables */
1307
/* Unlink the table from "unused_tables" list. */
1308
if (table == unused_tables)
1310
unused_tables=unused_tables->next; // Remove from link
1311
if (table == unused_tables)
1312
unused_tables= NULL;
980
Before we test the global cache, we test our local session cache.
984
assert(false); /* Not implemented yet */
1314
table->prev->next=table->next; /* Remove from unused list */
1315
table->next->prev=table->prev;
1316
table->in_use= this;
1320
/* Insert a new Table instance into the open cache */
1322
/* Free cache if too big */
1323
while (open_cache.records > table_cache_size && unused_tables)
1324
hash_delete(&open_cache,(unsigned char*) unused_tables);
1326
if (table_list->create)
988
Non pre-locked/LOCK TABLES mode, and the table is not temporary:
989
this is the normal use case.
991
- try to find the table in the table cache.
992
- if one of the discovered Table instances is name-locked
993
(table->getShare()->version == 0) back off -- we have to wait
994
until no one holds a name lock on the table.
995
- if there is no such Table in the name cache, read the table definition
996
and insert it into the cache.
997
We perform all of the above under table::Cache::singleton().mutex() which currently protects
998
the open cache (also known as table cache) and table definitions stored
1328
TableIdentifier lock_table_identifier(table_list->db, table_list->table_name, message::Table::STANDARD);
1330
if (not plugin::StorageEngine::doesTableExist(*this, lock_table_identifier))
1003
table::Cache::singleton().mutex().lock(); /* Lock for FLUSH TABLES for open table */
1006
Actually try to find the table in the open_cache.
1007
The cache may contain several "Table" instances for the same
1008
physical table. The instances that are currently "in use" by
1009
some thread have their "in_use" member != NULL.
1010
There is no good reason for having more than one entry in the
1011
hash for the same physical table, except that we use this as
1012
an implicit "pending locks queue" - see
1013
wait_for_locked_table_names for details.
1015
ppp= table::getCache().equal_range(key);
1018
for (table::CacheMap::const_iterator iter= ppp.first;
1019
iter != ppp.second; ++iter, table= NULL)
1021
table= (*iter).second;
1023
if (not table->in_use)
1333
Table to be created, so we need to create placeholder in table-cache.
1026
Here we flush tables marked for flush.
1027
Normally, table->getShare()->version contains the value of
1028
refresh_version from the moment when this table was
1029
(re-)opened and added to the cache.
1030
If since then we did (or just started) FLUSH TABLES
1031
statement, refresh_version has been increased.
1032
For "name-locked" Table instances, table->getShare()->version is set
1033
to 0 (see lock_table_name for details).
1034
In case there is a pending FLUSH TABLES or a name lock, we
1035
need to back off and re-start opening tables.
1036
If we do not back off now, we may dead lock in case of lock
1037
order mismatch with some other thread:
1038
c1-> name lock t1; -- sort of exclusive lock
1039
c2-> open t2; -- sort of shared lock
1040
c1-> name lock t2; -- blocks
1041
c2-> open t1; -- blocks
1335
if (!(table= table_cache_insert_placeholder(key, key_length)))
1043
if (table->needs_reopen_or_name_lock())
1337
pthread_mutex_unlock(&LOCK_open);
1045
if (flags & DRIZZLE_LOCK_IGNORE_FLUSH)
1047
/* Force close at once after usage */
1048
version= table->getShare()->getVersion();
1052
/* Avoid self-deadlocks by detecting self-dependencies. */
1053
if (table->open_placeholder && table->in_use == this)
1055
table::Cache::singleton().mutex().unlock();
1056
my_error(ER_UPDATE_TABLE_USED, MYF(0), table->getShare()->getTableName());
1061
Back off, part 1: mark the table as "unused" for the
1062
purpose of name-locking by setting table->db_stat to 0. Do
1063
that only for the tables in this thread that have an old
1064
table->getShare()->version (this is an optimization (?)).
1065
table->db_stat == 0 signals wait_for_locked_table_names
1066
that the tables in question are not used any more. See
1067
table_is_used call for details.
1069
close_old_data_files(false, false);
1072
Back-off part 2: try to avoid "busy waiting" on the table:
1073
if the table is in use by some other thread, we suspend
1074
and wait till the operation is complete: when any
1075
operation that juggles with table->getShare()->version completes,
1076
it broadcasts COND_refresh condition variable.
1077
If 'old' table we met is in use by current thread we return
1078
without waiting since in this situation it's this thread
1079
which is responsible for broadcasting on COND_refresh
1080
(and this was done already in Session::close_old_data_files()).
1081
Good example of such situation is when we have statement
1082
that needs two instances of table and FLUSH TABLES comes
1083
after we open first instance but before we open second
1086
if (table->in_use != this)
1088
/* wait_for_conditionwill unlock table::Cache::singleton().mutex() for us */
1089
wait_for_condition(table::Cache::singleton().mutex(), COND_refresh);
1093
table::Cache::singleton().mutex().unlock();
1096
There is a refresh in progress for this table.
1097
Signal the caller that it has to try again.
1341
Link placeholder to the open tables list so it will be automatically
1342
removed once tables are closed. Also mark it so it won't be ignored
1343
by other trying to take name-lock.
1345
table->open_placeholder= true;
1346
table->next= open_tables;
1348
pthread_mutex_unlock(&LOCK_open);
1352
/* Table exists. Let us try to open it. */
1355
/* make a new table */
1356
table= (Table *)malloc(sizeof(Table));
1359
pthread_mutex_unlock(&LOCK_open);
1363
error= open_unireg_entry(this, table, table_list, alias, key, key_length);
1367
pthread_mutex_unlock(&LOCK_open);
1370
my_hash_insert(&open_cache, (unsigned char*) table);
1373
pthread_mutex_unlock(&LOCK_open);
1376
table->next= open_tables; /* Link into simple list */
1379
table->reginfo.lock_type= TL_READ; /* Assume read */
1382
assert(table->s->ref_count > 0 || table->s->tmp_table != message::Table::STANDARD);
1384
if (lex->need_correct_ident())
1385
table->alias_name_used= my_strcasecmp(table_alias_charset,
1386
table->s->table_name.str, alias);
1106
table::getUnused().unlink(static_cast<table::Concurrent *>(table));
1107
table->in_use= this;
1111
/* Insert a new Table instance into the open cache */
1113
/* Free cache if too big */
1114
table::getUnused().cull();
1116
if (table_list->isCreate())
1118
TableIdentifier lock_table_identifier(table_list->getSchemaName(), table_list->getTableName(), message::Table::STANDARD);
1120
if (not plugin::StorageEngine::doesTableExist(*this, lock_table_identifier))
1123
Table to be created, so we need to create placeholder in table-cache.
1125
if (!(table= table_cache_insert_placeholder(lock_table_identifier)))
1127
table::Cache::singleton().mutex().unlock();
1131
Link placeholder to the open tables list so it will be automatically
1132
removed once tables are closed. Also mark it so it won't be ignored
1133
by other trying to take name-lock.
1135
table->open_placeholder= true;
1136
table->setNext(open_tables);
1138
table::Cache::singleton().mutex().unlock();
1142
/* Table exists. Let us try to open it. */
1145
/* make a new table */
1147
table::Concurrent *new_table= new table::Concurrent;
1149
if (new_table == NULL)
1151
table::Cache::singleton().mutex().unlock();
1155
error= new_table->open_unireg_entry(this, alias, identifier);
1159
table::Cache::singleton().mutex().unlock();
1162
(void)table::Cache::singleton().insert(new_table);
1166
table::Cache::singleton().mutex().unlock();
1170
table->setNext(open_tables); /* Link into simple list */
1173
table->reginfo.lock_type= TL_READ; /* Assume read */
1176
assert(table->getShare()->getTableCount() > 0 || table->getShare()->getType() != message::Table::STANDARD);
1387
1178
/* Fix alias if table name changes */
1388
if (strcmp(table->alias, alias))
1179
if (strcmp(table->getAlias(), alias))
1390
uint32_t length=(uint32_t) strlen(alias)+1;
1391
table->alias= (char*) realloc((char*) table->alias, length);
1392
memcpy((void*) table->alias, alias, length);
1181
table->setAlias(alias);
1395
1184
/* These variables are also set in reopen_table() */
1905
1551
other threads trying to get the lock.
1908
void abort_locked_tables(Session *session,const char *db, const char *table_name)
1554
void abort_locked_tables(Session *session, const drizzled::TableIdentifier &identifier)
1911
for (table= session->open_tables; table ; table= table->next)
1557
for (table= session->open_tables; table ; table= table->getNext())
1913
if (!strcmp(table->s->table_name.str, table_name) &&
1914
!strcmp(table->s->getSchemaName(), db))
1559
if (table->getShare()->getCacheKey() == identifier.getKey())
1916
1561
/* If MERGE child, forward lock handling to parent. */
1917
mysql_lock_abort(session, table);
1562
session->abortLock(table);
1924
Load a table definition from cursor and open unireg table
1928
session Thread handle
1929
entry Store open table definition here
1930
table_list TableList with db, table_name
1932
cache_key Key for share_cache
1933
cache_key_length length of cache_key
1936
Extra argument for open is taken from session->open_options
1937
One must have a lock on LOCK_open when calling this function
1944
static int open_unireg_entry(Session *session, Table *entry, TableList *table_list,
1946
char *cache_key, uint32_t cache_key_length)
1950
uint32_t discover_retry_count= 0;
1952
safe_mutex_assert_owner(&LOCK_open);
1954
if (not (share= TableShare::getShare(session, table_list, cache_key,
1956
table_list->i_s_requested_object,
1960
while ((error= open_table_from_share(session, share, alias,
1961
(uint32_t) (HA_OPEN_KEYFILE |
1965
session->open_options, entry)))
1967
if (error == 7) // Table def changed
1969
share->version= 0; // Mark share as old
1970
if (discover_retry_count++) // Retry once
1975
Here we should wait until all threads has released the table.
1976
For now we do one retry. This may cause a deadlock if there
1977
is other threads waiting for other tables used by this thread.
1979
Proper fix would be to if the second retry failed:
1980
- Mark that table def changed
1981
- Return from open table
1982
- Close all tables used by this thread
1983
- Start waiting that the share is released
1984
- Retry by opening all tables again
1989
To avoid deadlock, only wait for release if no one else is
1992
if (share->ref_count != 1)
1994
/* Free share and wait until it's released by all threads */
1995
TableShare::release(share);
1997
if (!session->killed)
1999
drizzle_reset_errors(session, 1); // Clear warnings
2000
session->clear_error(); // Clear error message
2012
TableShare::release(share);
2019
1570
Open all tables in list
2287
Table *Session::open_temporary_table(TableIdentifier &identifier,
1837
Table *Open_tables_state::open_temporary_table(const TableIdentifier &identifier,
2290
Table *new_tmp_table;
2292
char cache_key[MAX_DBKEY_LENGTH], *saved_cache_key, *tmp_path;
2293
uint32_t key_length, path_length;
2294
TableList table_list;
2296
table_list.db= (char*) identifier.getSchemaName().c_str();
2297
table_list.table_name= (char*) identifier.getTableName().c_str();
2298
/* Create the cache_key for temporary tables */
2299
key_length= table_list.create_table_def_key(cache_key);
2300
path_length= identifier.getPath().length();
2302
if (!(new_tmp_table= (Table*) malloc(sizeof(*new_tmp_table) + sizeof(*share) +
2303
path_length + 1 + key_length)))
1840
assert(identifier.isTmp());
1843
table::Temporary *new_tmp_table= new table::Temporary(identifier.getType(),
1845
const_cast<char *>(const_cast<TableIdentifier&>(identifier).getPath().c_str()),
1846
static_cast<uint32_t>(identifier.getPath().length()));
1847
if (not new_tmp_table)
2306
share= (TableShare*) (new_tmp_table+1);
2307
tmp_path= (char*) (share+1);
2308
saved_cache_key= strcpy(tmp_path, identifier.getPath().c_str())+path_length+1;
2309
memcpy(saved_cache_key, cache_key, key_length);
2311
share->init(saved_cache_key, key_length, strchr(saved_cache_key, '\0')+1, tmp_path);
2314
1851
First open the share, and then open the table from the share we just opened.
2316
if (open_table_def(*this, identifier, share) ||
2317
open_table_from_share(this, share, identifier.getTableName().c_str(),
2318
(uint32_t) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
1853
if (new_tmp_table->getMutableShare()->open_table_def(*static_cast<Session *>(this), identifier) ||
1854
new_tmp_table->getMutableShare()->open_table_from_share(static_cast<Session *>(this), identifier, identifier.getTableName().c_str(),
1855
(uint32_t) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
2323
1860
/* No need to lock share->mutex as this is not needed for tmp tables */
2324
share->free_table_share();
2325
free((char*) new_tmp_table);
1861
delete new_tmp_table->getMutableShare();
1862
delete new_tmp_table;
2329
1867
new_tmp_table->reginfo.lock_type= TL_WRITE; // Simulate locked
2330
share->tmp_table= message::Table::TEMPORARY;
2332
1869
if (link_in_list)
2334
1871
/* growing temp list at the head */
2335
new_tmp_table->next= this->temporary_tables;
2336
if (new_tmp_table->next)
2337
new_tmp_table->next->prev= new_tmp_table;
1872
new_tmp_table->setNext(this->temporary_tables);
1873
if (new_tmp_table->getNext())
1875
new_tmp_table->getNext()->setPrev(new_tmp_table);
2338
1877
this->temporary_tables= new_tmp_table;
2339
this->temporary_tables->prev= 0;
1878
this->temporary_tables->setPrev(0);
2341
1880
new_tmp_table->pos_in_table_list= 0;
4424
3958
unireg support functions
4425
3959
*****************************************************************************/
4428
Invalidate any cache entries that are for some DB
4431
remove_db_from_cache()
4432
db Database name. This will be in lower case if
4433
lower_case_table_name is set
4436
We can't use hash_delete when looping hash_elements. We mark them first
4437
and afterwards delete those marked unused.
4440
void remove_db_from_cache(SchemaIdentifier &schema_identifier)
4442
safe_mutex_assert_owner(&LOCK_open);
4444
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
4446
Table *table=(Table*) hash_element(&open_cache,idx);
4447
if (not schema_identifier.getPath().compare(table->s->getSchemaName()))
4449
table->s->version= 0L; /* Free when thread is ready */
4450
if (not table->in_use)
4451
relink_unused(table);
4454
while (unused_tables && !unused_tables->s->version)
4455
hash_delete(&open_cache,(unsigned char*) unused_tables);
4460
Mark all entries with the table as deleted to force an reopen of the table
4462
The table will be closed (not stored in cache) by the current thread when
4463
close_thread_tables() is called.
4469
0 This thread now have exclusive access to this table and no other thread
4470
can access the table until close_thread_tables() is called.
4471
1 Table is in use by another thread
4474
bool remove_table_from_cache(Session *session, const char *db, const char *table_name,
4477
char key[MAX_DBKEY_LENGTH];
4479
uint32_t key_length;
4482
bool signalled= false;
4484
key_pos= strcpy(key_pos, db) + strlen(db);
4485
key_pos= strcpy(key_pos+1, table_name) + strlen(table_name);
4486
key_length= (uint32_t) (key_pos-key)+1;
4490
HASH_SEARCH_STATE state;
4491
result= signalled= false;
4493
for (table= (Table*) hash_first(&open_cache, (unsigned char*) key, key_length,
4496
table= (Table*) hash_next(&open_cache, (unsigned char*) key, key_length,
4501
table->s->version=0L; /* Free when thread is ready */
4502
if (!(in_use=table->in_use))
4504
relink_unused(table);
4506
else if (in_use != session)
4509
Mark that table is going to be deleted from cache. This will
4510
force threads that are in mysql_lock_tables() (but not yet
4511
in thr_multi_lock()) to abort it's locks, close all tables and retry
4513
in_use->some_tables_deleted= true;
4514
if (table->is_name_opened())
4519
Now we must abort all tables locks used by this thread
4520
as the thread may be waiting to get a lock for another table.
4521
Note that we need to hold LOCK_open while going through the
4522
list. So that the other thread cannot change it. The other
4523
thread must also hold LOCK_open whenever changing the
4524
open_tables list. Aborting the MERGE lock after a child was
4525
closed and before the parent is closed would be fatal.
4527
for (Table *session_table= in_use->open_tables;
4529
session_table= session_table->next)
4531
/* Do not handle locks of MERGE children. */
4532
if (session_table->db_stat) // If table is open
4533
signalled|= mysql_lock_abort_for_thread(session, session_table);
4537
result= result || (flags & RTFC_OWNED_BY_Session_FLAG);
4539
while (unused_tables && !unused_tables->s->version)
4540
hash_delete(&open_cache,(unsigned char*) unused_tables);
4542
/* Remove table from table definition cache if it's not in use */
4543
TableShare::release(key, key_length);
4545
if (result && (flags & RTFC_WAIT_OTHER_THREAD_FLAG))
4548
Signal any thread waiting for tables to be freed to
4551
broadcast_refresh();
4552
if (!(flags & RTFC_CHECK_KILLED_FLAG) || !session->killed)
4555
if (likely(signalled))
4556
(void) pthread_cond_wait(&COND_refresh, &LOCK_open);
4559
struct timespec abstime;
4561
It can happen that another thread has opened the
4562
table but has not yet locked any table at all. Since
4563
it can be locked waiting for a table that our thread
4564
has done LOCK Table x WRITE on previously, we need to
4565
ensure that the thread actually hears our signal
4566
before we go to sleep. Thus we wait for a short time
4567
and then we retry another loop in the
4568
remove_table_from_cache routine.
4570
set_timespec(abstime, 10);
4571
pthread_cond_timedwait(&COND_refresh, &LOCK_open, &abstime);