170
235
bool result= false;
171
236
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)
238
pthread_mutex_lock(&LOCK_open); /* Optionally lock for remove tables from open_cahe if not in use */
242
refresh_version++; // Force close of open tables
243
while (unused_tables)
244
hash_delete(&open_cache,(unsigned char*) unused_tables);
246
if (wait_for_refresh)
249
Other threads could wait in a loop in open_and_lock_tables(),
250
trying to lock one or more of our tables.
252
If they wait for the locks in thr_multi_lock(), their lock
253
request is aborted. They loop in open_and_lock_tables() and
254
enter open_table(). Here they notice the table is refreshed and
255
wait for COND_refresh. Then they loop again in
256
openTablesLock() and this time open_table() succeeds. At
257
this moment, if we (the FLUSH TABLES thread) are scheduled and
258
on another FLUSH TABLES enter close_cached_tables(), they could
259
awake while we sleep below, waiting for others threads (us) to
260
close their open tables. If this happens, the other threads
261
would find the tables unlocked. They would get the locks, one
262
after the other, and could do their destructive work. This is an
263
issue if we have LOCK TABLES in effect.
265
The problem is that the other threads passed all checks in
266
open_table() before we refresh the table.
268
The fix for this problem is to set some_tables_deleted for all
269
threads with open tables. These threads can still get their
270
locks, but will immediately release them again after checking
271
this variable. They will then loop in openTablesLock()
272
again. There they will wait until we update all tables version
275
Setting some_tables_deleted is done by remove_table_from_cache()
278
In other words (reviewer suggestion): You need this setting of
279
some_tables_deleted for the case when table was opened and all
280
related checks were passed before incrementing refresh_version
281
(which you already have) but attempt to lock the table happened
282
after the call to Session::close_old_data_files() i.e. after removal of
283
current thread locks.
285
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
287
Table *table=(Table*) hash_element(&open_cache,idx);
289
table->in_use->some_tables_deleted= false;
296
for (TableList *table= tables; table; table= table->next_local)
298
if (remove_table_from_cache(session, table->db, table->table_name,
299
RTFC_OWNED_BY_Session_FLAG))
303
wait_for_refresh= false; // Nothing to wait for
306
if (wait_for_refresh)
309
If there is any table that has a lower refresh_version, wait until
310
this is closed (or this thread is killed) before returning
312
session->mysys_var->current_mutex= &LOCK_open;
313
session->mysys_var->current_cond= &COND_refresh;
314
session->set_proc_info("Flushing tables");
316
session->close_old_data_files();
319
/* Wait until all threads has closed all the tables we had locked */
320
while (found && ! session->killed)
323
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
325
Table *table=(Table*) hash_element(&open_cache,idx);
326
/* Avoid a self-deadlock. */
327
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.
330
Note that we wait here only for tables which are actually open, and
331
not for placeholders with Table::open_placeholder set. Waiting for
332
latter will cause deadlock in the following scenario, for example:
334
conn1: lock table t1 write;
335
conn2: lock table t2 write;
339
It also does not make sense to wait for those of placeholders that
340
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))
343
if (table->needs_reopen_or_name_lock() && (table->db_stat ||
344
(table->open_placeholder && wait_for_placeholders)))
347
pthread_cond_wait(&COND_refresh,&LOCK_open);
244
wait_for_refresh= false; // Nothing to wait for
353
No other thread has the locked tables open; reopen them and get the
354
old locks. This should always succeed (unless some external process
355
has removed the tables)
357
result= session->reopen_tables(true, true);
247
if (wait_for_refresh)
359
/* Set version for table */
360
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();
363
Preserve the version (0) of write locked tables so that a impending
364
global read lock won't sneak in.
366
if (table->reginfo.lock_type < TL_WRITE_ALLOW_WRITE)
367
table->s->version= refresh_version;
316
table::Cache::singleton().mutex().unlock();
371
pthread_mutex_unlock(&LOCK_open);
319
373
if (wait_for_refresh)
321
boost_unique_lock_t scopedLock(session->mysys_var->mutex);
375
pthread_mutex_lock(&session->mysys_var->mutex);
322
376
session->mysys_var->current_mutex= 0;
323
377
session->mysys_var->current_cond= 0;
324
378
session->set_proc_info(0);
379
pthread_mutex_unlock(&session->mysys_var->mutex);
520
void Open_tables_state::doGetTableNames(const SchemaIdentifier &schema_identifier,
521
std::set<std::string>& set_of_names)
523
for (Table *table= getTemporaryTables() ; table ; table= table->getNext())
525
if (schema_identifier.compare(table->getShare()->getSchemaName()))
527
set_of_names.insert(table->getShare()->getTableName());
532
void Open_tables_state::doGetTableNames(CachedDirectory &,
533
const SchemaIdentifier &schema_identifier,
534
std::set<std::string> &set_of_names)
536
doGetTableNames(schema_identifier, set_of_names);
539
void Open_tables_state::doGetTableIdentifiers(const SchemaIdentifier &schema_identifier,
540
TableIdentifier::vector &set_of_identifiers)
542
for (Table *table= getTemporaryTables() ; table ; table= table->getNext())
544
if (schema_identifier.compare(table->getShare()->getSchemaName()))
546
set_of_identifiers.push_back(TableIdentifier(table->getShare()->getSchemaName(),
547
table->getShare()->getTableName(),
548
table->getShare()->getPath()));
553
void Open_tables_state::doGetTableIdentifiers(CachedDirectory &,
554
const SchemaIdentifier &schema_identifier,
555
TableIdentifier::vector &set_of_identifiers)
557
doGetTableIdentifiers(schema_identifier, set_of_identifiers);
560
bool Open_tables_state::doDoesTableExist(const TableIdentifier &identifier)
562
for (Table *table= getTemporaryTables() ; table ; table= table->getNext())
564
if (table->getShare()->getType() == message::Table::TEMPORARY)
566
if (identifier.getKey() == table->getShare()->getCacheKey())
576
int Open_tables_state::doGetTableDefinition(const TableIdentifier &identifier,
577
message::Table &table_proto)
579
for (Table *table= getTemporaryTables() ; table ; table= table->getNext())
581
if (table->getShare()->getType() == message::Table::TEMPORARY)
583
if (identifier.getKey() == table->getShare()->getCacheKey())
585
table_proto.CopyFrom(*(table->getShare()->getTableProto()));
583
void Session::doGetTableNames(CachedDirectory &,
584
const std::string& db_name,
585
std::set<std::string>& set_of_names)
587
for (Table *table= temporary_tables ; table ; table= table->next)
589
if (not db_name.compare(table->s->db.str))
591
set_of_names.insert(table->s->table_name.str);
596
int Session::doGetTableDefinition(const char *,
598
const char *table_name_arg,
600
message::Table *table_proto)
602
for (Table *table= temporary_tables ; table ; table= table->next)
604
if (table->s->tmp_table == TEMP_TABLE)
606
if (not strcmp(db_arg, table->s->db.str))
608
if (not strcmp(table_name_arg, table->s->table_name.str))
611
table_proto->CopyFrom(*(table->s->getTableProto()));
746
805
cond Condition to wait for
749
void Session::wait_for_condition(boost::mutex &mutex, boost::condition_variable_any &cond)
808
void Session::wait_for_condition(pthread_mutex_t *mutex, pthread_cond_t *cond)
751
810
/* Wait until the current table is up to date */
752
811
const char *saved_proc_info;
753
mysys_var->current_mutex= &mutex;
754
mysys_var->current_cond= &cond;
812
mysys_var->current_mutex= mutex;
813
mysys_var->current_cond= cond;
755
814
saved_proc_info= get_proc_info();
756
815
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);
817
(void) pthread_cond_wait(cond, mutex);
820
We must unlock mutex first to avoid deadlock becasue conditions are
821
sent to this thread by doing locks in the following order:
822
lock(mysys_var->mutex)
823
lock(mysys_var->current_mutex)
825
One by effect of this that one can only use wait_for_condition with
826
condition variables that are guranteed to not disapper (freed) even if this
830
pthread_mutex_unlock(mutex);
831
pthread_mutex_lock(&mysys_var->mutex);
775
832
mysys_var->current_mutex= 0;
776
833
mysys_var->current_cond= 0;
777
834
set_proc_info(saved_proc_info);
835
pthread_mutex_unlock(&mysys_var->mutex);
840
Open table which is already name-locked by this thread.
843
reopen_name_locked_table()
844
session Thread handle
845
table_list TableList object for table to be open, TableList::table
846
member should point to Table object which was used for
848
link_in true - if Table object for table to be opened should be
849
linked into Session::open_tables list.
850
false - placeholder used for name-locking is already in
851
this list so we only need to preserve Table::next
855
This function assumes that its caller already acquired LOCK_open mutex.
862
bool Session::reopen_name_locked_table(TableList* table_list, bool link_in)
864
Table *table= table_list->table;
866
char *table_name= table_list->table_name;
869
safe_mutex_assert_owner(&LOCK_open);
871
if (killed || !table)
876
if (open_unireg_entry(this, table, table_list, table_name,
877
table->s->table_cache_key.str,
878
table->s->table_cache_key.length))
880
table->intern_close_table();
882
If there was an error during opening of table (for example if it
883
does not exist) '*table' object can be wiped out. To be able
884
properly release name-lock in this case we should restore this
885
object to its original state.
893
We want to prevent other connections from opening this table until end
894
of statement as it is likely that modifications of table's metadata are
895
not yet finished (for example CREATE TRIGGER have to change .TRG cursor,
896
or we might want to drop table if CREATE TABLE ... SELECT fails).
897
This also allows us to assume that no other connection will sneak in
898
before we will get table-level lock on this table.
901
table->in_use = this;
905
table->next= open_tables;
911
Table object should be already in Session::open_tables list so we just
912
need to set Table::next correctly.
914
table->next= orig_table.next;
917
table->tablenr= current_tablenr++;
918
table->used_fields= 0;
919
table->const_table= 0;
920
table->null_row= false;
921
table->maybe_null= false;
922
table->force_index= false;
923
table->status= STATUS_NO_RECORD;
937
1106
if (table->query_id)
939
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->getAlias());
1108
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->alias);
942
1111
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());
1116
if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
1118
my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->table_name);
1123
If it's the first table from a list of tables used in a query,
1124
remember refresh_version (the version of open_cache state).
1125
If the version changes while we're opening the remaining tables,
1126
we will have to back off, close all the tables opened-so-far,
1127
and try to reopen them.
1129
Note-> refresh_version is currently changed only during FLUSH TABLES.
1132
version= refresh_version;
1133
else if ((version != refresh_version) &&
1134
! (flags & DRIZZLE_LOCK_IGNORE_FLUSH))
1136
/* Someone did a refresh while thread was opening tables */
1144
Before we test the global cache, we test our local session cache.
1148
assert(false); /* Not implemented yet */
1152
Non pre-locked/LOCK TABLES mode, and the table is not temporary:
1153
this is the normal use case.
1155
- try to find the table in the table cache.
1156
- if one of the discovered Table instances is name-locked
1157
(table->s->version == 0) back off -- we have to wait
1158
until no one holds a name lock on the table.
1159
- if there is no such Table in the name cache, read the table definition
1160
and insert it into the cache.
1161
We perform all of the above under LOCK_open which currently protects
1162
the open cache (also known as table cache) and table definitions stored
1166
pthread_mutex_lock(&LOCK_open); /* Lock for FLUSH TABLES for open table */
1169
Actually try to find the table in the open_cache.
1170
The cache may contain several "Table" instances for the same
1171
physical table. The instances that are currently "in use" by
1172
some thread have their "in_use" member != NULL.
1173
There is no good reason for having more than one entry in the
1174
hash for the same physical table, except that we use this as
1175
an implicit "pending locks queue" - see
1176
wait_for_locked_table_names for details.
1178
for (table= (Table*) hash_first(&open_cache, (unsigned char*) key, key_length,
1180
table && table->in_use ;
1181
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.
1185
Here we flush tables marked for flush.
1186
Normally, table->s->version contains the value of
1187
refresh_version from the moment when this table was
1188
(re-)opened and added to the cache.
1189
If since then we did (or just started) FLUSH TABLES
1190
statement, refresh_version has been increased.
1191
For "name-locked" Table instances, table->s->version is set
1192
to 0 (see lock_table_name for details).
1193
In case there is a pending FLUSH TABLES or a name lock, we
1194
need to back off and re-start opening tables.
1195
If we do not back off now, we may dead lock in case of lock
1196
order mismatch with some other thread:
1197
c1: name lock t1; -- sort of exclusive lock
1198
c2: open t2; -- sort of shared lock
1199
c1: name lock t2; -- blocks
1200
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 */
1202
if (table->needs_reopen_or_name_lock())
1204
if (flags & DRIZZLE_LOCK_IGNORE_FLUSH)
1206
/* Force close at once after usage */
1207
version= table->s->version;
1211
/* Avoid self-deadlocks by detecting self-dependencies. */
1212
if (table->open_placeholder && table->in_use == this)
1214
pthread_mutex_unlock(&LOCK_open);
1215
my_error(ER_UPDATE_TABLE_USED, MYF(0), table->s->table_name.str);
1220
Back off, part 1: mark the table as "unused" for the
1221
purpose of name-locking by setting table->db_stat to 0. Do
1222
that only for the tables in this thread that have an old
1223
table->s->version (this is an optimization (?)).
1224
table->db_stat == 0 signals wait_for_locked_table_names
1225
that the tables in question are not used any more. See
1226
table_is_used call for details.
1228
close_old_data_files(false, false);
1231
Back-off part 2: try to avoid "busy waiting" on the table:
1232
if the table is in use by some other thread, we suspend
1233
and wait till the operation is complete: when any
1234
operation that juggles with table->s->version completes,
1235
it broadcasts COND_refresh condition variable.
1236
If 'old' table we met is in use by current thread we return
1237
without waiting since in this situation it's this thread
1238
which is responsible for broadcasting on COND_refresh
1239
(and this was done already in Session::close_old_data_files()).
1240
Good example of such situation is when we have statement
1241
that needs two instances of table and FLUSH TABLES comes
1242
after we open first instance but before we open second
1245
if (table->in_use != this)
1247
/* wait_for_conditionwill unlock LOCK_open for us */
1248
wait_for_condition(&LOCK_open, &COND_refresh);
1252
pthread_mutex_unlock(&LOCK_open);
1255
There is a refresh in progress for this table.
1256
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 */
1265
/* Unlink the table from "unused_tables" list. */
1266
if (table == unused_tables)
1268
unused_tables=unused_tables->next; // Remove from link
1269
if (table == unused_tables)
1270
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
1272
table->prev->next=table->next; /* Remove from unused list */
1273
table->next->prev=table->prev;
1274
table->in_use= this;
1278
/* Insert a new Table instance into the open cache */
1280
/* Free cache if too big */
1281
while (open_cache.records > table_cache_size && unused_tables)
1282
hash_delete(&open_cache,(unsigned char*) unused_tables);
1284
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)
1286
TableIdentifier lock_table_identifier(table_list->db, table_list->table_name, NO_TMP_TABLE);
1288
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
1291
Table to be created, so we need to create placeholder in table-cache.
1043
if (table->needs_reopen_or_name_lock())
1293
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.
1295
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);
1299
Link placeholder to the open tables list so it will be automatically
1300
removed once tables are closed. Also mark it so it won't be ignored
1301
by other trying to take name-lock.
1303
table->open_placeholder= true;
1304
table->next= open_tables;
1306
pthread_mutex_unlock(&LOCK_open);
1310
/* Table exists. Let us try to open it. */
1313
/* make a new table */
1314
table= (Table *)malloc(sizeof(Table));
1317
pthread_mutex_unlock(&LOCK_open);
1321
error= open_unireg_entry(this, table, table_list, alias, key, key_length);
1325
pthread_mutex_unlock(&LOCK_open);
1328
my_hash_insert(&open_cache, (unsigned char*) table);
1331
pthread_mutex_unlock(&LOCK_open);
1334
table->next= open_tables; /* Link into simple list */
1337
table->reginfo.lock_type= TL_READ; /* Assume read */
1340
assert(table->s->ref_count > 0 || table->s->tmp_table != NO_TMP_TABLE);
1342
if (lex->need_correct_ident())
1343
table->alias_name_used= my_strcasecmp(table_alias_charset,
1344
table->s->table_name.str, alias);
1178
1345
/* Fix alias if table name changes */
1179
if (strcmp(table->getAlias(), alias))
1346
if (strcmp(table->alias, alias))
1181
table->setAlias(alias);
1348
uint32_t length=(uint32_t) strlen(alias)+1;
1349
table->alias= (char*) realloc((char*) table->alias, length);
1350
memcpy((void*) table->alias, alias, length);
1184
1353
/* These variables are also set in reopen_table() */
1551
1858
other threads trying to get the lock.
1554
void abort_locked_tables(Session *session, const drizzled::TableIdentifier &identifier)
1861
void abort_locked_tables(Session *session,const char *db, const char *table_name)
1557
for (table= session->open_tables; table ; table= table->getNext())
1864
for (table= session->open_tables; table ; table= table->next)
1559
if (table->getShare()->getCacheKey() == identifier.getKey())
1866
if (!strcmp(table->s->table_name.str, table_name) &&
1867
!strcmp(table->s->db.str, db))
1561
1869
/* If MERGE child, forward lock handling to parent. */
1562
session->abortLock(table);
1870
mysql_lock_abort(session, table);
1877
Load a table definition from cursor and open unireg table
1881
session Thread handle
1882
entry Store open table definition here
1883
table_list TableList with db, table_name
1885
cache_key Key for share_cache
1886
cache_key_length length of cache_key
1889
Extra argument for open is taken from session->open_options
1890
One must have a lock on LOCK_open when calling this function
1897
static int open_unireg_entry(Session *session, Table *entry, TableList *table_list,
1899
char *cache_key, uint32_t cache_key_length)
1903
uint32_t discover_retry_count= 0;
1905
safe_mutex_assert_owner(&LOCK_open);
1907
if (!(share= TableShare::getShare(session, table_list, cache_key,
1909
table_list->i_s_requested_object,
1913
while ((error= open_table_from_share(session, share, alias,
1914
(uint32_t) (HA_OPEN_KEYFILE |
1918
session->open_options, entry)))
1920
if (error == 7) // Table def changed
1922
share->version= 0; // Mark share as old
1923
if (discover_retry_count++) // Retry once
1928
Here we should wait until all threads has released the table.
1929
For now we do one retry. This may cause a deadlock if there
1930
is other threads waiting for other tables used by this thread.
1932
Proper fix would be to if the second retry failed:
1933
- Mark that table def changed
1934
- Return from open table
1935
- Close all tables used by this thread
1936
- Start waiting that the share is released
1937
- Retry by opening all tables again
1942
To avoid deadlock, only wait for release if no one else is
1945
if (share->ref_count != 1)
1947
/* Free share and wait until it's released by all threads */
1948
TableShare::release(share);
1950
if (!session->killed)
1952
drizzle_reset_errors(session, 1); // Clear warnings
1953
session->clear_error(); // Clear error message
1965
TableShare::release(share);
1570
1972
Open all tables in list
1837
Table *Open_tables_state::open_temporary_table(const TableIdentifier &identifier,
2226
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)
2229
Table *new_tmp_table;
2231
char cache_key[MAX_DBKEY_LENGTH], *saved_cache_key, *tmp_path;
2232
uint32_t key_length, path_length;
2233
TableList table_list;
2235
table_list.db= (char*) identifier.getDBName();
2236
table_list.table_name= (char*) identifier.getTableName();
2237
/* Create the cache_key for temporary tables */
2238
key_length= table_list.create_table_def_key(cache_key);
2239
path_length= strlen(identifier.getPath());
2241
if (!(new_tmp_table= (Table*) malloc(sizeof(*new_tmp_table) + sizeof(*share) +
2242
path_length + 1 + key_length)))
2245
share= (TableShare*) (new_tmp_table+1);
2246
tmp_path= (char*) (share+1);
2247
saved_cache_key= strcpy(tmp_path, identifier.getPath())+path_length+1;
2248
memcpy(saved_cache_key, cache_key, key_length);
2250
share->init(saved_cache_key, key_length, strchr(saved_cache_key, '\0')+1, tmp_path);
1851
2253
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 |
2255
if (open_table_def(*this, share) ||
2256
open_table_from_share(this, share, identifier.getTableName(),
2257
(uint32_t) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
1860
2262
/* 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;
2263
share->free_table_share();
2264
free((char*) new_tmp_table);
1867
2268
new_tmp_table->reginfo.lock_type= TL_WRITE; // Simulate locked
2269
share->tmp_table= TEMP_TABLE;
1869
2271
if (link_in_list)
1871
2273
/* 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);
2274
new_tmp_table->next= this->temporary_tables;
2275
if (new_tmp_table->next)
2276
new_tmp_table->next->prev= new_tmp_table;
1877
2277
this->temporary_tables= new_tmp_table;
1878
this->temporary_tables->setPrev(0);
2278
this->temporary_tables->prev= 0;
1880
2280
new_tmp_table->pos_in_table_list= 0;
3958
4363
unireg support functions
3959
4364
*****************************************************************************/
4367
Invalidate any cache entries that are for some DB
4370
remove_db_from_cache()
4371
db Database name. This will be in lower case if
4372
lower_case_table_name is set
4375
We can't use hash_delete when looping hash_elements. We mark them first
4376
and afterwards delete those marked unused.
4379
void remove_db_from_cache(const std::string schema_name)
4381
safe_mutex_assert_owner(&LOCK_open);
4383
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
4385
Table *table=(Table*) hash_element(&open_cache,idx);
4386
if (not strcmp(table->s->db.str, schema_name.c_str()))
4388
table->s->version= 0L; /* Free when thread is ready */
4389
if (not table->in_use)
4390
relink_unused(table);
4393
while (unused_tables && !unused_tables->s->version)
4394
hash_delete(&open_cache,(unsigned char*) unused_tables);
4399
Mark all entries with the table as deleted to force an reopen of the table
4401
The table will be closed (not stored in cache) by the current thread when
4402
close_thread_tables() is called.
4408
0 This thread now have exclusive access to this table and no other thread
4409
can access the table until close_thread_tables() is called.
4410
1 Table is in use by another thread
4413
bool remove_table_from_cache(Session *session, const char *db, const char *table_name,
4416
char key[MAX_DBKEY_LENGTH];
4418
uint32_t key_length;
4421
bool signalled= false;
4423
key_pos= strcpy(key_pos, db) + strlen(db);
4424
key_pos= strcpy(key_pos+1, table_name) + strlen(table_name);
4425
key_length= (uint32_t) (key_pos-key)+1;
4429
HASH_SEARCH_STATE state;
4430
result= signalled= false;
4432
for (table= (Table*) hash_first(&open_cache, (unsigned char*) key, key_length,
4435
table= (Table*) hash_next(&open_cache, (unsigned char*) key, key_length,
4440
table->s->version=0L; /* Free when thread is ready */
4441
if (!(in_use=table->in_use))
4443
relink_unused(table);
4445
else if (in_use != session)
4448
Mark that table is going to be deleted from cache. This will
4449
force threads that are in mysql_lock_tables() (but not yet
4450
in thr_multi_lock()) to abort it's locks, close all tables and retry
4452
in_use->some_tables_deleted= true;
4453
if (table->is_name_opened())
4458
Now we must abort all tables locks used by this thread
4459
as the thread may be waiting to get a lock for another table.
4460
Note that we need to hold LOCK_open while going through the
4461
list. So that the other thread cannot change it. The other
4462
thread must also hold LOCK_open whenever changing the
4463
open_tables list. Aborting the MERGE lock after a child was
4464
closed and before the parent is closed would be fatal.
4466
for (Table *session_table= in_use->open_tables;
4468
session_table= session_table->next)
4470
/* Do not handle locks of MERGE children. */
4471
if (session_table->db_stat) // If table is open
4472
signalled|= mysql_lock_abort_for_thread(session, session_table);
4476
result= result || (flags & RTFC_OWNED_BY_Session_FLAG);
4478
while (unused_tables && !unused_tables->s->version)
4479
hash_delete(&open_cache,(unsigned char*) unused_tables);
4481
/* Remove table from table definition cache if it's not in use */
4482
TableShare::release(key, key_length);
4484
if (result && (flags & RTFC_WAIT_OTHER_THREAD_FLAG))
4487
Signal any thread waiting for tables to be freed to
4490
broadcast_refresh();
4491
if (!(flags & RTFC_CHECK_KILLED_FLAG) || !session->killed)
4494
if (likely(signalled))
4495
(void) pthread_cond_wait(&COND_refresh, &LOCK_open);
4498
struct timespec abstime;
4500
It can happen that another thread has opened the
4501
table but has not yet locked any table at all. Since
4502
it can be locked waiting for a table that our thread
4503
has done LOCK Table x WRITE on previously, we need to
4504
ensure that the thread actually hears our signal
4505
before we go to sleep. Thus we wait for a short time
4506
and then we retry another loop in the
4507
remove_table_from_cache routine.
4509
set_timespec(abstime, 10);
4510
pthread_cond_timedwait(&COND_refresh, &LOCK_open, &abstime);