103
135
void close_handle_and_leave_table_as_lock(Table *table)
137
TableShare *share, *old_share= table->s;
139
memory::Root *mem_root= &table->mem_root;
105
141
assert(table->db_stat);
106
assert(table->getShare()->getType() == message::Table::STANDARD);
109
144
Make a local copy of the table share and free the current one.
110
145
This has to be done to ensure that the table share is removed from
111
146
the table defintion cache as soon as the last instance is removed
113
TableIdentifier identifier(table->getShare()->getSchemaName(), table->getShare()->getTableName(), message::Table::INTERNAL);
114
const TableIdentifier::Key &key(identifier.getKey());
115
TableShare *share= new TableShare(identifier.getType(),
117
const_cast<char *>(key.vector()), static_cast<uint32_t>(table->getShare()->getCacheKeySize()));
148
if (multi_alloc_root(mem_root,
149
&share, sizeof(*share),
150
&key_buff, old_share->table_cache_key.length,
153
memset(share, 0, sizeof(*share));
154
share->set_table_cache_key(key_buff, old_share->table_cache_key.str,
155
old_share->table_cache_key.length);
156
share->tmp_table= INTERNAL_TMP_TABLE; // for intern_close_table()
119
159
table->cursor->close();
120
160
table->db_stat= 0; // Mark cursor closed
121
TableShare::release(table->getMutableShare());
122
table->setShare(share);
161
TableShare::release(table->s);
163
table->cursor->change_table_ptr(table, table->s);
169
Create a list for all open tables matching SQL expression
173
wild SQL like expression
176
One gets only a list of tables for which one has any kind of privilege.
177
db and table names are allocated in result struct, so one doesn't need
178
a lock on LOCK_open when traversing the return list.
184
bool list_open_tables(const char *db,
186
bool(*func)(Table *table,
187
open_table_list_st& open_list,
188
plugin::InfoSchemaTable *schema_table),
190
plugin::InfoSchemaTable *schema_table)
192
vector<open_table_list_st> open_list;
193
vector<open_table_list_st>::iterator it;
194
open_table_list_st table;
196
/* What we really need is an optimization for knowing unique tables */
198
open_list.reserve(sizeof(open_table_list_st) * (open_cache.records % 2));
200
open_list.reserve(sizeof(open_table_list_st) * open_cache.records);
202
pthread_mutex_lock(&LOCK_open); /* List all open tables */
204
for (uint32_t idx= 0; idx < open_cache.records; idx++)
207
Table *entry=(Table*) hash_element(&open_cache,idx);
209
if (db && my_strcasecmp(system_charset_info, db, entry->s->db.str))
211
if (wild && wild_compare(entry->s->table_name.str, wild, 0))
214
for (it= open_list.begin(); it < open_list.end(); it++)
216
if (!(*it).table.compare(entry->s->table_name.str) &&
217
!(*it).db.compare(entry->s->db.str))
221
if (entry->locked_by_name)
233
table.db= entry->s->db.str;
234
table.table= entry->s->table_name.str;
235
open_list.push_back(table);
237
pthread_mutex_unlock(&LOCK_open);
239
for (it= open_list.begin(); it < open_list.end(); it++)
241
if (func(display, *it, schema_table))
126
248
/*****************************************************************************
127
249
* Functions to free open table cache
170
319
bool result= false;
171
320
Session *session= this;
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)
322
pthread_mutex_lock(&LOCK_open); /* Optionally lock for remove tables from open_cahe if not in use */
326
refresh_version++; // Force close of open tables
327
while (unused_tables)
328
hash_delete(&open_cache,(unsigned char*) unused_tables);
330
if (wait_for_refresh)
333
Other threads could wait in a loop in open_and_lock_tables(),
334
trying to lock one or more of our tables.
336
If they wait for the locks in thr_multi_lock(), their lock
337
request is aborted. They loop in open_and_lock_tables() and
338
enter open_table(). Here they notice the table is refreshed and
339
wait for COND_refresh. Then they loop again in
340
openTablesLock() and this time open_table() succeeds. At
341
this moment, if we (the FLUSH TABLES thread) are scheduled and
342
on another FLUSH TABLES enter close_cached_tables(), they could
343
awake while we sleep below, waiting for others threads (us) to
344
close their open tables. If this happens, the other threads
345
would find the tables unlocked. They would get the locks, one
346
after the other, and could do their destructive work. This is an
347
issue if we have LOCK TABLES in effect.
349
The problem is that the other threads passed all checks in
350
open_table() before we refresh the table.
352
The fix for this problem is to set some_tables_deleted for all
353
threads with open tables. These threads can still get their
354
locks, but will immediately release them again after checking
355
this variable. They will then loop in openTablesLock()
356
again. There they will wait until we update all tables version
359
Setting some_tables_deleted is done by remove_table_from_cache()
362
In other words (reviewer suggestion): You need this setting of
363
some_tables_deleted for the case when table was opened and all
364
related checks were passed before incrementing refresh_version
365
(which you already have) but attempt to lock the table happened
366
after the call to Session::close_old_data_files() i.e. after removal of
367
current thread locks.
369
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
371
Table *table=(Table*) hash_element(&open_cache,idx);
373
table->in_use->some_tables_deleted= false;
380
for (TableList *table= tables; table; table= table->next_local)
382
if (remove_table_from_cache(session, table->db, table->table_name,
383
RTFC_OWNED_BY_Session_FLAG))
387
wait_for_refresh= false; // Nothing to wait for
390
if (wait_for_refresh)
393
If there is any table that has a lower refresh_version, wait until
394
this is closed (or this thread is killed) before returning
396
session->mysys_var->current_mutex= &LOCK_open;
397
session->mysys_var->current_cond= &COND_refresh;
398
session->set_proc_info("Flushing tables");
400
session->close_old_data_files();
403
/* Wait until all threads has closed all the tables we had locked */
404
while (found && ! session->killed)
407
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
409
Table *table=(Table*) hash_element(&open_cache,idx);
410
/* Avoid a self-deadlock. */
411
if (table->in_use == session)
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.
414
Note that we wait here only for tables which are actually open, and
415
not for placeholders with Table::open_placeholder set. Waiting for
416
latter will cause deadlock in the following scenario, for example:
418
conn1: lock table t1 write;
419
conn2: lock table t2 write;
423
It also does not make sense to wait for those of placeholders that
424
are employed by CREATE TABLE as in this case table simply does not
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))
427
if (table->needs_reopen_or_name_lock() && (table->db_stat ||
428
(table->open_placeholder && wait_for_placeholders)))
431
pthread_cond_wait(&COND_refresh,&LOCK_open);
244
wait_for_refresh= false; // Nothing to wait for
437
No other thread has the locked tables open; reopen them and get the
438
old locks. This should always succeed (unless some external process
439
has removed the tables)
441
result= session->reopen_tables(true, true);
247
if (wait_for_refresh)
443
/* Set version for table */
444
for (Table *table= session->open_tables; table ; table= table->next)
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
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())
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);
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())
308
Preserve the version (0) of write locked tables so that a impending
309
global read lock won't sneak in.
311
if (table->reginfo.lock_type < TL_WRITE_ALLOW_WRITE)
312
table->getMutableShare()->refreshVersion();
447
Preserve the version (0) of write locked tables so that a impending
448
global read lock won't sneak in.
450
if (table->reginfo.lock_type < TL_WRITE_ALLOW_WRITE)
451
table->s->version= refresh_version;
316
table::Cache::singleton().mutex().unlock();
455
pthread_mutex_unlock(&LOCK_open);
319
457
if (wait_for_refresh)
321
boost_unique_lock_t scopedLock(session->mysys_var->mutex);
459
pthread_mutex_lock(&session->mysys_var->mutex);
322
460
session->mysys_var->current_mutex= 0;
323
461
session->mysys_var->current_cond= 0;
324
462
session->set_proc_info(0);
463
pthread_mutex_unlock(&session->mysys_var->mutex);
746
850
cond Condition to wait for
749
void Session::wait_for_condition(boost::mutex &mutex, boost::condition_variable_any &cond)
853
void Session::wait_for_condition(pthread_mutex_t *mutex, pthread_cond_t *cond)
751
855
/* Wait until the current table is up to date */
752
856
const char *saved_proc_info;
753
mysys_var->current_mutex= &mutex;
754
mysys_var->current_cond= &cond;
857
mysys_var->current_mutex= mutex;
858
mysys_var->current_cond= cond;
755
859
saved_proc_info= get_proc_info();
756
860
set_proc_info("Waiting for table");
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);
862
(void) pthread_cond_wait(cond, mutex);
865
We must unlock mutex first to avoid deadlock becasue conditions are
866
sent to this thread by doing locks in the following order:
867
lock(mysys_var->mutex)
868
lock(mysys_var->current_mutex)
870
One by effect of this that one can only use wait_for_condition with
871
condition variables that are guranteed to not disapper (freed) even if this
875
pthread_mutex_unlock(mutex);
876
pthread_mutex_lock(&mysys_var->mutex);
775
877
mysys_var->current_mutex= 0;
776
878
mysys_var->current_cond= 0;
777
879
set_proc_info(saved_proc_info);
880
pthread_mutex_unlock(&mysys_var->mutex);
885
Open table which is already name-locked by this thread.
888
reopen_name_locked_table()
889
session Thread handle
890
table_list TableList object for table to be open, TableList::table
891
member should point to Table object which was used for
893
link_in true - if Table object for table to be opened should be
894
linked into Session::open_tables list.
895
false - placeholder used for name-locking is already in
896
this list so we only need to preserve Table::next
900
This function assumes that its caller already acquired LOCK_open mutex.
907
bool Session::reopen_name_locked_table(TableList* table_list, bool link_in)
909
Table *table= table_list->table;
911
char *table_name= table_list->table_name;
914
safe_mutex_assert_owner(&LOCK_open);
916
if (killed || !table)
921
if (open_unireg_entry(this, table, table_list, table_name,
922
table->s->table_cache_key.str,
923
table->s->table_cache_key.length))
925
table->intern_close_table();
927
If there was an error during opening of table (for example if it
928
does not exist) '*table' object can be wiped out. To be able
929
properly release name-lock in this case we should restore this
930
object to its original state.
938
We want to prevent other connections from opening this table until end
939
of statement as it is likely that modifications of table's metadata are
940
not yet finished (for example CREATE TRIGGER have to change .TRG cursor,
941
or we might want to drop table if CREATE TABLE ... SELECT fails).
942
This also allows us to assume that no other connection will sneak in
943
before we will get table-level lock on this table.
946
table->in_use = this;
950
table->next= open_tables;
956
Table object should be already in Session::open_tables list so we just
957
need to set Table::next correctly.
959
table->next= orig_table.next;
962
table->tablenr= current_tablenr++;
963
table->used_fields= 0;
964
table->const_table= 0;
965
table->null_row= false;
966
table->maybe_null= false;
967
table->force_index= false;
968
table->status= STATUS_NO_RECORD;
937
1151
if (table->query_id)
939
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->getAlias());
1153
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->alias);
942
table->query_id= getQueryId();
950
if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
952
my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->getSchemaName(), table_list->getTableName());
1156
table->query_id= query_id;
1161
if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
1163
my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->table_name);
1168
If it's the first table from a list of tables used in a query,
1169
remember refresh_version (the version of open_cache state).
1170
If the version changes while we're opening the remaining tables,
1171
we will have to back off, close all the tables opened-so-far,
1172
and try to reopen them.
1174
Note-> refresh_version is currently changed only during FLUSH TABLES.
1177
version= refresh_version;
1178
else if ((version != refresh_version) &&
1179
! (flags & DRIZZLE_LOCK_IGNORE_FLUSH))
1181
/* Someone did a refresh while thread was opening tables */
1189
Before we test the global cache, we test our local session cache.
1193
assert(false); /* Not implemented yet */
1197
Non pre-locked/LOCK TABLES mode, and the table is not temporary:
1198
this is the normal use case.
1200
- try to find the table in the table cache.
1201
- if one of the discovered Table instances is name-locked
1202
(table->s->version == 0) back off -- we have to wait
1203
until no one holds a name lock on the table.
1204
- if there is no such Table in the name cache, read the table definition
1205
and insert it into the cache.
1206
We perform all of the above under LOCK_open which currently protects
1207
the open cache (also known as table cache) and table definitions stored
1211
pthread_mutex_lock(&LOCK_open); /* Lock for FLUSH TABLES for open table */
1214
Actually try to find the table in the open_cache.
1215
The cache may contain several "Table" instances for the same
1216
physical table. The instances that are currently "in use" by
1217
some thread have their "in_use" member != NULL.
1218
There is no good reason for having more than one entry in the
1219
hash for the same physical table, except that we use this as
1220
an implicit "pending locks queue" - see
1221
wait_for_locked_table_names for details.
1223
for (table= (Table*) hash_first(&open_cache, (unsigned char*) key, key_length,
1225
table && table->in_use ;
1226
table= (Table*) hash_next(&open_cache, (unsigned char*) key, key_length,
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.
1230
Here we flush tables marked for flush.
1231
Normally, table->s->version contains the value of
1232
refresh_version from the moment when this table was
1233
(re-)opened and added to the cache.
1234
If since then we did (or just started) FLUSH TABLES
1235
statement, refresh_version has been increased.
1236
For "name-locked" Table instances, table->s->version is set
1237
to 0 (see lock_table_name for details).
1238
In case there is a pending FLUSH TABLES or a name lock, we
1239
need to back off and re-start opening tables.
1240
If we do not back off now, we may dead lock in case of lock
1241
order mismatch with some other thread:
1242
c1: name lock t1; -- sort of exclusive lock
1243
c2: open t2; -- sort of shared lock
1244
c1: name lock t2; -- blocks
1245
c2: open t1; -- blocks
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 */
1247
if (table->needs_reopen_or_name_lock())
1249
if (flags & DRIZZLE_LOCK_IGNORE_FLUSH)
1251
/* Force close at once after usage */
1252
version= table->s->version;
1256
/* Avoid self-deadlocks by detecting self-dependencies. */
1257
if (table->open_placeholder && table->in_use == this)
1259
pthread_mutex_unlock(&LOCK_open);
1260
my_error(ER_UPDATE_TABLE_USED, MYF(0), table->s->table_name.str);
1265
Back off, part 1: mark the table as "unused" for the
1266
purpose of name-locking by setting table->db_stat to 0. Do
1267
that only for the tables in this thread that have an old
1268
table->s->version (this is an optimization (?)).
1269
table->db_stat == 0 signals wait_for_locked_table_names
1270
that the tables in question are not used any more. See
1271
table_is_used call for details.
1273
close_old_data_files(false, false);
1276
Back-off part 2: try to avoid "busy waiting" on the table:
1277
if the table is in use by some other thread, we suspend
1278
and wait till the operation is complete: when any
1279
operation that juggles with table->s->version completes,
1280
it broadcasts COND_refresh condition variable.
1281
If 'old' table we met is in use by current thread we return
1282
without waiting since in this situation it's this thread
1283
which is responsible for broadcasting on COND_refresh
1284
(and this was done already in Session::close_old_data_files()).
1285
Good example of such situation is when we have statement
1286
that needs two instances of table and FLUSH TABLES comes
1287
after we open first instance but before we open second
1290
if (table->in_use != this)
1292
/* wait_for_conditionwill unlock LOCK_open for us */
1293
wait_for_condition(&LOCK_open, &COND_refresh);
1297
pthread_mutex_unlock(&LOCK_open);
1300
There is a refresh in progress for this table.
1301
Signal the caller that it has to try again.
980
Before we test the global cache, we test our local session cache.
984
assert(false); /* Not implemented yet */
1310
/* Unlink the table from "unused_tables" list. */
1311
if (table == unused_tables)
1313
unused_tables=unused_tables->next; // Remove from link
1314
if (table == unused_tables)
1315
unused_tables= NULL;
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
1317
table->prev->next=table->next; /* Remove from unused list */
1318
table->next->prev=table->prev;
1319
table->in_use= this;
1323
/* Insert a new Table instance into the open cache */
1325
/* Free cache if too big */
1326
while (open_cache.records > table_cache_size && unused_tables)
1327
hash_delete(&open_cache,(unsigned char*) unused_tables);
1329
if (table_list->create)
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)
1331
TableIdentifier lock_table_identifier(table_list->db, table_list->table_name, NO_TMP_TABLE);
1333
if (plugin::StorageEngine::getTableDefinition(*this, lock_table_identifier) != EEXIST)
1021
table= (*iter).second;
1023
if (not table->in_use)
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
1336
Table to be created, so we need to create placeholder in table-cache.
1043
if (table->needs_reopen_or_name_lock())
1338
if (!(table= table_cache_insert_placeholder(key, key_length)))
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.
1340
pthread_mutex_unlock(&LOCK_open);
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);
1344
Link placeholder to the open tables list so it will be automatically
1345
removed once tables are closed. Also mark it so it won't be ignored
1346
by other trying to take name-lock.
1348
table->open_placeholder= true;
1349
table->next= open_tables;
1351
pthread_mutex_unlock(&LOCK_open);
1355
/* Table exists. Let us try to open it. */
1358
/* make a new table */
1359
table= (Table *)malloc(sizeof(Table));
1362
pthread_mutex_unlock(&LOCK_open);
1366
error= open_unireg_entry(this, table, table_list, alias, key, key_length);
1370
pthread_mutex_unlock(&LOCK_open);
1373
my_hash_insert(&open_cache, (unsigned char*) table);
1376
pthread_mutex_unlock(&LOCK_open);
1379
table->next= open_tables; /* Link into simple list */
1382
table->reginfo.lock_type= TL_READ; /* Assume read */
1385
assert(table->s->ref_count > 0 || table->s->tmp_table != NO_TMP_TABLE);
1387
if (lex->need_correct_ident())
1388
table->alias_name_used= my_strcasecmp(table_alias_charset,
1389
table->s->table_name.str, alias);
1178
1390
/* Fix alias if table name changes */
1179
if (strcmp(table->getAlias(), alias))
1391
if (strcmp(table->alias, alias))
1181
table->setAlias(alias);
1393
uint32_t length=(uint32_t) strlen(alias)+1;
1394
table->alias= (char*) realloc((char*) table->alias, length);
1395
memcpy((void*) table->alias, alias, length);
1184
1398
/* These variables are also set in reopen_table() */
1551
1903
other threads trying to get the lock.
1554
void abort_locked_tables(Session *session, const drizzled::TableIdentifier &identifier)
1906
void abort_locked_tables(Session *session,const char *db, const char *table_name)
1557
for (table= session->open_tables; table ; table= table->getNext())
1909
for (table= session->open_tables; table ; table= table->next)
1559
if (table->getShare()->getCacheKey() == identifier.getKey())
1911
if (!strcmp(table->s->table_name.str, table_name) &&
1912
!strcmp(table->s->db.str, db))
1561
1914
/* If MERGE child, forward lock handling to parent. */
1562
session->abortLock(table);
1915
mysql_lock_abort(session, table);
1922
Load a table definition from cursor and open unireg table
1926
session Thread handle
1927
entry Store open table definition here
1928
table_list TableList with db, table_name
1930
cache_key Key for share_cache
1931
cache_key_length length of cache_key
1934
Extra argument for open is taken from session->open_options
1935
One must have a lock on LOCK_open when calling this function
1942
static int open_unireg_entry(Session *session, Table *entry, TableList *table_list,
1944
char *cache_key, uint32_t cache_key_length)
1948
uint32_t discover_retry_count= 0;
1950
safe_mutex_assert_owner(&LOCK_open);
1952
if (!(share= TableShare::getShare(session, table_list, cache_key,
1954
table_list->i_s_requested_object,
1958
while ((error= open_table_from_share(session, share, alias,
1959
(uint32_t) (HA_OPEN_KEYFILE |
1963
session->open_options, entry)))
1965
if (error == 7) // Table def changed
1967
share->version= 0; // Mark share as old
1968
if (discover_retry_count++) // Retry once
1973
Here we should wait until all threads has released the table.
1974
For now we do one retry. This may cause a deadlock if there
1975
is other threads waiting for other tables used by this thread.
1977
Proper fix would be to if the second retry failed:
1978
- Mark that table def changed
1979
- Return from open table
1980
- Close all tables used by this thread
1981
- Start waiting that the share is released
1982
- Retry by opening all tables again
1987
To avoid deadlock, only wait for release if no one else is
1990
if (share->ref_count != 1)
1992
/* Free share and wait until it's released by all threads */
1993
TableShare::release(share);
1995
if (!session->killed)
1997
drizzle_reset_errors(session, 1); // Clear warnings
1998
session->clear_error(); // Clear error message
2010
TableShare::release(share);
1570
2017
Open all tables in list
1837
Table *Open_tables_state::open_temporary_table(const TableIdentifier &identifier,
2271
Table *Session::open_temporary_table(TableIdentifier &identifier,
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)
2274
Table *new_tmp_table;
2276
char cache_key[MAX_DBKEY_LENGTH], *saved_cache_key, *tmp_path;
2277
uint32_t key_length, path_length;
2278
TableList table_list;
2280
table_list.db= (char*) identifier.getDBName();
2281
table_list.table_name= (char*) identifier.getTableName();
2282
/* Create the cache_key for temporary tables */
2283
key_length= table_list.create_table_def_key(cache_key);
2284
path_length= strlen(identifier.getPath());
2286
if (!(new_tmp_table= (Table*) malloc(sizeof(*new_tmp_table) + sizeof(*share) +
2287
path_length + 1 + key_length)))
2290
share= (TableShare*) (new_tmp_table+1);
2291
tmp_path= (char*) (share+1);
2292
saved_cache_key= strcpy(tmp_path, identifier.getPath())+path_length+1;
2293
memcpy(saved_cache_key, cache_key, key_length);
2295
share->init(saved_cache_key, key_length, strchr(saved_cache_key, '\0')+1, tmp_path);
1851
2298
First open the share, and then open the table from the share we just opened.
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 |
2300
if (open_table_def(*this, share) ||
2301
open_table_from_share(this, share, identifier.getTableName(),
2302
(uint32_t) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
1860
2307
/* No need to lock share->mutex as this is not needed for tmp tables */
1861
delete new_tmp_table->getMutableShare();
1862
delete new_tmp_table;
2308
share->free_table_share();
2309
free((char*) new_tmp_table);
1867
2313
new_tmp_table->reginfo.lock_type= TL_WRITE; // Simulate locked
2314
share->tmp_table= TEMP_TABLE;
1869
2316
if (link_in_list)
1871
2318
/* growing temp list at the head */
1872
new_tmp_table->setNext(this->temporary_tables);
1873
if (new_tmp_table->getNext())
1875
new_tmp_table->getNext()->setPrev(new_tmp_table);
2319
new_tmp_table->next= this->temporary_tables;
2320
if (new_tmp_table->next)
2321
new_tmp_table->next->prev= new_tmp_table;
1877
2322
this->temporary_tables= new_tmp_table;
1878
this->temporary_tables->setPrev(0);
2323
this->temporary_tables->prev= 0;
1880
2325
new_tmp_table->pos_in_table_list= 0;
3958
4408
unireg support functions
3959
4409
*****************************************************************************/
4412
Invalidate any cache entries that are for some DB
4415
remove_db_from_cache()
4416
db Database name. This will be in lower case if
4417
lower_case_table_name is set
4420
We can't use hash_delete when looping hash_elements. We mark them first
4421
and afterwards delete those marked unused.
4424
void remove_db_from_cache(const char *db)
4426
safe_mutex_assert_owner(&LOCK_open);
4428
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
4430
Table *table=(Table*) hash_element(&open_cache,idx);
4431
if (!strcmp(table->s->db.str, db))
4433
table->s->version= 0L; /* Free when thread is ready */
4435
relink_unused(table);
4438
while (unused_tables && !unused_tables->s->version)
4439
hash_delete(&open_cache,(unsigned char*) unused_tables);
4444
Mark all entries with the table as deleted to force an reopen of the table
4446
The table will be closed (not stored in cache) by the current thread when
4447
close_thread_tables() is called.
4453
0 This thread now have exclusive access to this table and no other thread
4454
can access the table until close_thread_tables() is called.
4455
1 Table is in use by another thread
4458
bool remove_table_from_cache(Session *session, const char *db, const char *table_name,
4461
char key[MAX_DBKEY_LENGTH];
4463
uint32_t key_length;
4466
bool signalled= false;
4468
key_pos= strcpy(key_pos, db) + strlen(db);
4469
key_pos= strcpy(key_pos+1, table_name) + strlen(table_name);
4470
key_length= (uint32_t) (key_pos-key)+1;
4474
HASH_SEARCH_STATE state;
4475
result= signalled= false;
4477
for (table= (Table*) hash_first(&open_cache, (unsigned char*) key, key_length,
4480
table= (Table*) hash_next(&open_cache, (unsigned char*) key, key_length,
4485
table->s->version=0L; /* Free when thread is ready */
4486
if (!(in_use=table->in_use))
4488
relink_unused(table);
4490
else if (in_use != session)
4493
Mark that table is going to be deleted from cache. This will
4494
force threads that are in mysql_lock_tables() (but not yet
4495
in thr_multi_lock()) to abort it's locks, close all tables and retry
4497
in_use->some_tables_deleted= true;
4498
if (table->is_name_opened())
4503
Now we must abort all tables locks used by this thread
4504
as the thread may be waiting to get a lock for another table.
4505
Note that we need to hold LOCK_open while going through the
4506
list. So that the other thread cannot change it. The other
4507
thread must also hold LOCK_open whenever changing the
4508
open_tables list. Aborting the MERGE lock after a child was
4509
closed and before the parent is closed would be fatal.
4511
for (Table *session_table= in_use->open_tables;
4513
session_table= session_table->next)
4515
/* Do not handle locks of MERGE children. */
4516
if (session_table->db_stat) // If table is open
4517
signalled|= mysql_lock_abort_for_thread(session, session_table);
4521
result= result || (flags & RTFC_OWNED_BY_Session_FLAG);
4523
while (unused_tables && !unused_tables->s->version)
4524
hash_delete(&open_cache,(unsigned char*) unused_tables);
4526
/* Remove table from table definition cache if it's not in use */
4527
TableShare::release(key, key_length);
4529
if (result && (flags & RTFC_WAIT_OTHER_THREAD_FLAG))
4532
Signal any thread waiting for tables to be freed to
4535
broadcast_refresh();
4536
if (!(flags & RTFC_CHECK_KILLED_FLAG) || !session->killed)
4539
if (likely(signalled))
4540
(void) pthread_cond_wait(&COND_refresh, &LOCK_open);
4543
struct timespec abstime;
4545
It can happen that another thread has opened the
4546
table but has not yet locked any table at all. Since
4547
it can be locked waiting for a table that our thread
4548
has done LOCK Table x WRITE on previously, we need to
4549
ensure that the thread actually hears our signal
4550
before we go to sleep. Thus we wait for a short time
4551
and then we retry another loop in the
4552
remove_table_from_cache routine.
4554
set_timespec(abstime, 10);
4555
pthread_cond_timedwait(&COND_refresh, &LOCK_open, &abstime);