44
43
#include <drizzled/check_stack_overrun.h>
45
44
#include <drizzled/lock.h>
46
45
#include <drizzled/plugin/listen.h>
47
#include "drizzled/cached_directory.h"
48
#include <drizzled/field/epoch.h>
46
#include <mysys/cached_directory.h>
47
#include <drizzled/field/timestamp.h>
49
48
#include <drizzled/field/null.h>
50
#include "drizzled/sql_table.h"
51
#include "drizzled/global_charset_info.h"
52
#include "drizzled/pthread_globals.h"
53
#include "drizzled/internal/iocache.h"
54
#include "drizzled/drizzled.h"
55
#include "drizzled/plugin/authorization.h"
56
#include "drizzled/table/temporary.h"
57
#include "drizzled/table/placeholder.h"
58
#include "drizzled/table/unused.h"
59
#include "drizzled/plugin/storage_engine.h"
61
#include <drizzled/refresh_version.h>
49
#include "drizzled/memory/multi_malloc.h"
63
51
using namespace std;
68
extern bool volatile shutdown_in_progress;
52
using namespace drizzled;
54
bool drizzle_rm_tmp_tables();
57
@defgroup Data_Dictionary Data Dictionary
60
Table *unused_tables; /* Used by mysql_test */
61
HASH open_cache; /* Used by mysql_test */
62
static int open_unireg_entry(Session *session, Table *entry, TableList *table_list,
64
char *cache_key, uint32_t cache_key_length);
67
void free_cache_entry(void *entry);
68
unsigned char *table_cache_key(const unsigned char *record,
75
unsigned char *table_cache_key(const unsigned char *record,
79
Table *entry=(Table*) record;
80
*length= entry->s->table_cache_key.length;
81
return (unsigned char*) entry->s->table_cache_key.str;
70
85
bool table_cache_init(void)
75
uint32_t cached_open_tables(void)
77
return table::getCache().size();
87
return hash_init(&open_cache, &my_charset_bin,
88
(size_t) table_cache_size+16,
89
0, 0, table_cache_key,
80
93
void table_cache_free(void)
82
95
refresh_version++; // Force close of open tables
84
table::getUnused().clear();
85
table::getCache().clear();
98
hash_delete(&open_cache,(unsigned char*) unused_tables);
100
if (!open_cache.records) // Safety first
101
hash_free(&open_cache);
104
uint32_t cached_open_tables(void)
106
return open_cache.records;
89
Close cursor handle, but leave the table in the table cache
111
Close file handle, but leave the table in the table cache
92
114
close_handle_and_leave_table_as_lock()
106
128
void close_handle_and_leave_table_as_lock(Table *table)
130
TableShare *share, *old_share= table->s;
132
MEM_ROOT *mem_root= &table->mem_root;
108
134
assert(table->db_stat);
109
assert(table->getShare()->getType() == message::Table::STANDARD);
112
137
Make a local copy of the table share and free the current one.
113
138
This has to be done to ensure that the table share is removed from
114
139
the table defintion cache as soon as the last instance is removed
116
identifier::Table identifier(table->getShare()->getSchemaName(), table->getShare()->getTableName(), message::Table::INTERNAL);
117
const identifier::Table::Key &key(identifier.getKey());
118
TableShare *share= new TableShare(identifier.getType(),
120
const_cast<char *>(key.vector()), static_cast<uint32_t>(table->getShare()->getCacheKeySize()));
122
table->cursor->close();
123
table->db_stat= 0; // Mark cursor closed
124
table::instance::release(table->getMutableShare());
125
table->setShare(share);
141
if (multi_alloc_root(mem_root,
142
&share, sizeof(*share),
143
&key_buff, old_share->table_cache_key.length,
146
memset(share, 0, sizeof(*share));
147
share->set_table_cache_key(key_buff, old_share->table_cache_key.str,
148
old_share->table_cache_key.length);
149
share->tmp_table= INTERNAL_TMP_TABLE; // for intern_close_table()
152
table->file->close();
153
table->db_stat= 0; // Mark file closed
154
TableShare::release(table->s);
156
table->file->change_table_ptr(table, table->s);
162
Create a list for all open tables matching SQL expression
166
wild SQL like expression
169
One gets only a list of tables for which one has any kind of privilege.
170
db and table names are allocated in result struct, so one doesn't need
171
a lock on LOCK_open when traversing the return list.
177
bool list_open_tables(const char *db, const char *wild, bool(*func)(Table *table, open_table_list_st& open_list), Table *display)
179
vector<open_table_list_st> open_list;
180
vector<open_table_list_st>::iterator it;
181
open_table_list_st table;
183
/* What we really need is an optimization for knowing unique tables */
185
open_list.reserve(sizeof(open_table_list_st) * (open_cache.records % 2));
187
open_list.reserve(sizeof(open_table_list_st) * open_cache.records);
189
pthread_mutex_lock(&LOCK_open); /* List all open tables */
191
for (uint32_t idx= 0; idx < open_cache.records; idx++)
194
Table *entry=(Table*) hash_element(&open_cache,idx);
196
if (db && my_strcasecmp(system_charset_info, db, entry->s->db.str))
198
if (wild && wild_compare(entry->s->table_name.str, wild, 0))
201
for (it= open_list.begin(); it < open_list.end(); it++)
203
if (!(*it).table.compare(entry->s->table_name.str) &&
204
!(*it).db.compare(entry->s->db.str))
208
if (entry->locked_by_name)
220
table.db= entry->s->db.str;
221
table.table= entry->s->table_name.str;
222
open_list.push_back(table);
224
pthread_mutex_unlock(&LOCK_open);
226
for (it= open_list.begin(); it < open_list.end(); it++)
228
if (func(display, *it))
129
235
/*****************************************************************************
130
236
* Functions to free open table cache
173
306
bool result= false;
174
307
Session *session= this;
177
boost::mutex::scoped_lock scopedLock(table::Cache::singleton().mutex()); /* Optionally lock for remove tables from open_cahe if not in use */
181
refresh_version++; // Force close of open tables
183
table::getUnused().clear();
185
if (wait_for_refresh)
309
pthread_mutex_lock(&LOCK_open); /* Optionally lock for remove tables from open_cahe if not in use */
313
refresh_version++; // Force close of open tables
314
while (unused_tables)
315
hash_delete(&open_cache,(unsigned char*) unused_tables);
317
if (wait_for_refresh)
320
Other threads could wait in a loop in open_and_lock_tables(),
321
trying to lock one or more of our tables.
323
If they wait for the locks in thr_multi_lock(), their lock
324
request is aborted. They loop in open_and_lock_tables() and
325
enter open_table(). Here they notice the table is refreshed and
326
wait for COND_refresh. Then they loop again in
327
openTablesLock() and this time open_table() succeeds. At
328
this moment, if we (the FLUSH TABLES thread) are scheduled and
329
on another FLUSH TABLES enter close_cached_tables(), they could
330
awake while we sleep below, waiting for others threads (us) to
331
close their open tables. If this happens, the other threads
332
would find the tables unlocked. They would get the locks, one
333
after the other, and could do their destructive work. This is an
334
issue if we have LOCK TABLES in effect.
336
The problem is that the other threads passed all checks in
337
open_table() before we refresh the table.
339
The fix for this problem is to set some_tables_deleted for all
340
threads with open tables. These threads can still get their
341
locks, but will immediately release them again after checking
342
this variable. They will then loop in openTablesLock()
343
again. There they will wait until we update all tables version
346
Setting some_tables_deleted is done by remove_table_from_cache()
349
In other words (reviewer suggestion): You need this setting of
350
some_tables_deleted for the case when table was opened and all
351
related checks were passed before incrementing refresh_version
352
(which you already have) but attempt to lock the table happened
353
after the call to Session::close_old_data_files() i.e. after removal of
354
current thread locks.
356
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
358
Table *table=(Table*) hash_element(&open_cache,idx);
360
table->in_use->some_tables_deleted= false;
367
for (TableList *table= tables; table; table= table->next_local)
369
if (remove_table_from_cache(session, table->db, table->table_name,
370
RTFC_OWNED_BY_Session_FLAG))
374
wait_for_refresh= false; // Nothing to wait for
377
if (wait_for_refresh)
380
If there is any table that has a lower refresh_version, wait until
381
this is closed (or this thread is killed) before returning
383
session->mysys_var->current_mutex= &LOCK_open;
384
session->mysys_var->current_cond= &COND_refresh;
385
session->set_proc_info("Flushing tables");
387
session->close_old_data_files();
390
/* Wait until all threads has closed all the tables we had locked */
391
while (found && ! session->killed)
394
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
396
Table *table=(Table*) hash_element(&open_cache,idx);
397
/* Avoid a self-deadlock. */
398
if (table->in_use == session)
188
Other threads could wait in a loop in open_and_lock_tables(),
189
trying to lock one or more of our tables.
191
If they wait for the locks in thr_multi_lock(), their lock
192
request is aborted. They loop in open_and_lock_tables() and
193
enter open_table(). Here they notice the table is refreshed and
194
wait for COND_refresh. Then they loop again in
195
openTablesLock() and this time open_table() succeeds. At
196
this moment, if we (the FLUSH TABLES thread) are scheduled and
197
on another FLUSH TABLES enter close_cached_tables(), they could
198
awake while we sleep below, waiting for others threads (us) to
199
close their open tables. If this happens, the other threads
200
would find the tables unlocked. They would get the locks, one
201
after the other, and could do their destructive work. This is an
202
issue if we have LOCK TABLES in effect.
204
The problem is that the other threads passed all checks in
205
open_table() before we refresh the table.
207
The fix for this problem is to set some_tables_deleted for all
208
threads with open tables. These threads can still get their
209
locks, but will immediately release them again after checking
210
this variable. They will then loop in openTablesLock()
211
again. There they will wait until we update all tables version
214
Setting some_tables_deleted is done by table::Cache::singleton().removeTable()
217
In other words (reviewer suggestion): You need this setting of
218
some_tables_deleted for the case when table was opened and all
219
related checks were passed before incrementing refresh_version
220
(which you already have) but attempt to lock the table happened
221
after the call to Session::close_old_data_files() i.e. after removal of
222
current thread locks.
401
Note that we wait here only for tables which are actually open, and
402
not for placeholders with Table::open_placeholder set. Waiting for
403
latter will cause deadlock in the following scenario, for example:
405
conn1: lock table t1 write;
406
conn2: lock table t2 write;
410
It also does not make sense to wait for those of placeholders that
411
are employed by CREATE TABLE as in this case table simply does not
224
for (table::CacheMap::const_iterator iter= table::getCache().begin();
225
iter != table::getCache().end();
228
Table *table= (*iter).second;
230
table->in_use->some_tables_deleted= false;
237
for (TableList *table= tables; table; table= table->next_local)
239
identifier::Table identifier(table->getSchemaName(), table->getTableName());
240
if (table::Cache::singleton().removeTable(session, identifier,
241
RTFC_OWNED_BY_Session_FLAG))
414
if (table->needs_reopen_or_name_lock() && (table->db_stat ||
415
(table->open_placeholder && wait_for_placeholders)))
418
pthread_cond_wait(&COND_refresh,&LOCK_open);
247
wait_for_refresh= false; // Nothing to wait for
424
No other thread has the locked tables open; reopen them and get the
425
old locks. This should always succeed (unless some external process
426
has removed the tables)
428
result= session->reopen_tables(true, true);
250
if (wait_for_refresh)
430
/* Set version for table */
431
for (Table *table= session->open_tables; table ; table= table->next)
253
If there is any table that has a lower refresh_version, wait until
254
this is closed (or this thread is killed) before returning
256
session->mysys_var->current_mutex= &table::Cache::singleton().mutex();
257
session->mysys_var->current_cond= &COND_refresh;
258
session->set_proc_info("Flushing tables");
260
session->close_old_data_files();
263
/* Wait until all threads has closed all the tables we had locked */
264
while (found && ! session->getKilled())
267
for (table::CacheMap::const_iterator iter= table::getCache().begin();
268
iter != table::getCache().end();
271
Table *table= (*iter).second;
272
/* Avoid a self-deadlock. */
273
if (table->in_use == session)
276
Note that we wait here only for tables which are actually open, and
277
not for placeholders with Table::open_placeholder set. Waiting for
278
latter will cause deadlock in the following scenario, for example:
280
conn1-> lock table t1 write;
281
conn2-> lock table t2 write;
282
conn1-> flush tables;
283
conn2-> flush tables;
285
It also does not make sense to wait for those of placeholders that
286
are employed by CREATE TABLE as in this case table simply does not
289
if (table->needs_reopen_or_name_lock() && (table->db_stat ||
290
(table->open_placeholder && wait_for_placeholders)))
293
COND_refresh.wait(scopedLock);
299
No other thread has the locked tables open; reopen them and get the
300
old locks. This should always succeed (unless some external process
301
has removed the tables)
303
result= session->reopen_tables();
305
/* Set version for table */
306
for (Table *table= session->open_tables; table ; table= table->getNext())
309
Preserve the version (0) of write locked tables so that a impending
310
global read lock won't sneak in.
312
if (table->reginfo.lock_type < TL_WRITE_ALLOW_WRITE)
313
table->getMutableShare()->refreshVersion();
434
Preserve the version (0) of write locked tables so that a impending
435
global read lock won't sneak in.
437
if (table->reginfo.lock_type < TL_WRITE_ALLOW_WRITE)
438
table->s->version= refresh_version;
442
pthread_mutex_unlock(&LOCK_open);
318
444
if (wait_for_refresh)
320
boost_unique_lock_t scopedLock(session->mysys_var->mutex);
446
pthread_mutex_lock(&session->mysys_var->mutex);
321
447
session->mysys_var->current_mutex= 0;
322
448
session->mysys_var->current_cond= 0;
323
449
session->set_proc_info(0);
450
pthread_mutex_unlock(&session->mysys_var->mutex);
524
void Open_tables_state::doGetTableNames(const identifier::Schema &schema_identifier,
525
std::set<std::string>& set_of_names)
527
for (Table *table= getTemporaryTables() ; table ; table= table->getNext())
529
if (schema_identifier.compare(table->getShare()->getSchemaName()))
531
set_of_names.insert(table->getShare()->getTableName());
536
void Open_tables_state::doGetTableNames(CachedDirectory &,
537
const identifier::Schema &schema_identifier,
538
std::set<std::string> &set_of_names)
540
doGetTableNames(schema_identifier, set_of_names);
543
void Open_tables_state::doGetTableIdentifiers(const identifier::Schema &schema_identifier,
544
identifier::Table::vector &set_of_identifiers)
546
for (Table *table= getTemporaryTables() ; table ; table= table->getNext())
548
if (schema_identifier.compare(table->getShare()->getSchemaName()))
550
set_of_identifiers.push_back(identifier::Table(table->getShare()->getSchemaName(),
551
table->getShare()->getTableName(),
552
table->getShare()->getPath()));
557
void Open_tables_state::doGetTableIdentifiers(CachedDirectory &,
558
const identifier::Schema &schema_identifier,
559
identifier::Table::vector &set_of_identifiers)
561
doGetTableIdentifiers(schema_identifier, set_of_identifiers);
564
bool Open_tables_state::doDoesTableExist(const identifier::Table &identifier)
566
for (Table *table= getTemporaryTables() ; table ; table= table->getNext())
568
if (table->getShare()->getType() == message::Table::TEMPORARY)
570
if (identifier.getKey() == table->getShare()->getCacheKey())
580
int Open_tables_state::doGetTableDefinition(const identifier::Table &identifier,
581
message::Table &table_proto)
583
for (Table *table= getTemporaryTables() ; table ; table= table->getNext())
585
if (table->getShare()->getType() == message::Table::TEMPORARY)
587
if (identifier.getKey() == table->getShare()->getCacheKey())
589
table_proto.CopyFrom(*(table->getShare()->getTableMessage()));
599
Table *Open_tables_state::find_temporary_table(const identifier::Table &identifier)
601
for (Table *table= temporary_tables ; table ; table= table->getNext())
603
if (identifier.getKey() == table->getShare()->getCacheKey())
655
Table *Session::find_temporary_table(const char *new_db, const char *table_name)
657
char key[MAX_DBKEY_LENGTH];
661
key_length= TableShare::createKey(key, new_db, table_name);
663
for (table= temporary_tables ; table ; table= table->next)
665
if (table->s->table_cache_key.length == key_length &&
666
!memcmp(table->s->table_cache_key.str, key, key_length))
607
669
return NULL; // Not a temporary table
672
Table *Session::find_temporary_table(TableList *table_list)
674
return find_temporary_table(table_list->db, table_list->table_name);
612
679
Drop a temporary table.
634
701
@retval -1 the table is in use by a outer query
637
int Open_tables_state::drop_temporary_table(const drizzled::identifier::Table &identifier)
704
int Session::drop_temporary_table(TableList *table_list)
641
if (not (table= find_temporary_table(identifier)))
708
if (!(table= find_temporary_table(table_list)))
644
711
/* Table might be in use by some outer statement. */
645
if (table->query_id && table->query_id != getQueryId())
712
if (table->query_id && table->query_id != query_id)
647
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->getAlias());
714
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->alias);
651
close_temporary_table(table);
718
close_temporary_table(table, true, true);
724
/* move table first in unused links */
726
static void relink_unused(Table *table)
728
if (table != unused_tables)
730
table->prev->next=table->next; /* Remove from unused list */
731
table->next->prev=table->prev;
732
table->next=unused_tables; /* Link in unused tables */
733
table->prev=unused_tables->prev;
734
unused_tables->prev->next=table;
735
unused_tables->prev=table;
658
742
Remove all instances of table from thread's open list and
661
745
@param session Thread context
662
746
@param find Table to remove
664
@note because we risk the chance of deleting the share, we can't assume that it will exist past, this should be modified once we can use a TableShare::shared_ptr here.
667
749
void Session::unlink_open_table(Table *find)
669
const identifier::Table::Key find_key(find->getShare()->getCacheKey());
671
safe_mutex_assert_owner(table::Cache::singleton().mutex().native_handle());
751
char key[MAX_DBKEY_LENGTH];
752
uint32_t key_length= find->s->table_cache_key.length;
755
safe_mutex_assert_owner(&LOCK_open);
757
memcpy(key, find->s->table_cache_key.str, key_length);
674
Note that we need to hold table::Cache::singleton().mutex() while changing the
759
Note that we need to hold LOCK_open while changing the
675
760
open_tables list. Another thread may work on it.
676
(See: table::Cache::singleton().removeTable(), wait_completed_table())
761
(See: remove_table_from_cache(), mysql_wait_completed_table())
677
762
Closing a MERGE child before the parent would be fatal if the
678
763
other thread tries to abort the MERGE lock in between.
680
765
for (prev= &open_tables; *prev; )
684
if (list->getShare()->getCacheKey() == find_key)
769
if (list->s->table_cache_key.length == key_length &&
770
!memcmp(list->s->table_cache_key.str, key, key_length))
686
772
/* Remove table from open_tables list. */
687
*prev= list->getNext();
689
774
/* Close table. */
690
table::remove_table(static_cast<table::Concurrent *>(list));
775
hash_delete(&open_cache,(unsigned char*) list); // Close table
694
779
/* Step to next entry in open_tables list. */
695
prev= list->getNextPtr();
699
784
// Notify any 'refresh' threads
700
locking::broadcast_refresh();
750
835
cond Condition to wait for
753
void Session::wait_for_condition(boost::mutex &mutex, boost::condition_variable_any &cond)
838
void Session::wait_for_condition(pthread_mutex_t *mutex, pthread_cond_t *cond)
755
840
/* Wait until the current table is up to date */
756
841
const char *saved_proc_info;
757
mysys_var->current_mutex= &mutex;
758
mysys_var->current_cond= &cond;
842
mysys_var->current_mutex= mutex;
843
mysys_var->current_cond= cond;
759
844
saved_proc_info= get_proc_info();
760
845
set_proc_info("Waiting for table");
763
We must unlock mutex first to avoid deadlock becasue conditions are
764
sent to this thread by doing locks in the following order:
765
lock(mysys_var->mutex)
766
lock(mysys_var->current_mutex)
768
One by effect of this that one can only use wait_for_condition with
769
condition variables that are guranteed to not disapper (freed) even if this
772
boost_unique_lock_t scopedLock(mutex, boost::adopt_lock_t());
775
cond.wait(scopedLock);
778
boost_unique_lock_t mysys_scopedLock(mysys_var->mutex);
847
(void) pthread_cond_wait(cond, mutex);
850
We must unlock mutex first to avoid deadlock becasue conditions are
851
sent to this thread by doing locks in the following order:
852
lock(mysys_var->mutex)
853
lock(mysys_var->current_mutex)
855
One by effect of this that one can only use wait_for_condition with
856
condition variables that are guranteed to not disapper (freed) even if this
860
pthread_mutex_unlock(mutex);
861
pthread_mutex_lock(&mysys_var->mutex);
779
862
mysys_var->current_mutex= 0;
780
863
mysys_var->current_cond= 0;
781
864
set_proc_info(saved_proc_info);
865
pthread_mutex_unlock(&mysys_var->mutex);
870
Open table which is already name-locked by this thread.
873
reopen_name_locked_table()
874
session Thread handle
875
table_list TableList object for table to be open, TableList::table
876
member should point to Table object which was used for
878
link_in true - if Table object for table to be opened should be
879
linked into Session::open_tables list.
880
false - placeholder used for name-locking is already in
881
this list so we only need to preserve Table::next
885
This function assumes that its caller already acquired LOCK_open mutex.
892
bool Session::reopen_name_locked_table(TableList* table_list, bool link_in)
894
Table *table= table_list->table;
896
char *table_name= table_list->table_name;
899
safe_mutex_assert_owner(&LOCK_open);
901
if (killed || !table)
906
if (open_unireg_entry(this, table, table_list, table_name,
907
table->s->table_cache_key.str,
908
table->s->table_cache_key.length))
910
table->intern_close_table();
912
If there was an error during opening of table (for example if it
913
does not exist) '*table' object can be wiped out. To be able
914
properly release name-lock in this case we should restore this
915
object to its original state.
923
We want to prevent other connections from opening this table until end
924
of statement as it is likely that modifications of table's metadata are
925
not yet finished (for example CREATE TRIGGER have to change .TRG file,
926
or we might want to drop table if CREATE TABLE ... SELECT fails).
927
This also allows us to assume that no other connection will sneak in
928
before we will get table-level lock on this table.
931
table->in_use = this;
935
table->next= open_tables;
941
Table object should be already in Session::open_tables list so we just
942
need to set Table::next correctly.
944
table->next= orig_table.next;
947
table->tablenr= current_tablenr++;
948
table->used_fields= 0;
949
table->const_table= 0;
950
table->null_row= false;
951
table->maybe_null= false;
952
table->force_index= false;
953
table->status= STATUS_NO_RECORD;
941
1136
if (table->query_id)
943
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->getAlias());
1138
my_error(ER_CANT_REOPEN_TABLE, MYF(0), table->alias);
946
table->query_id= getQueryId();
954
if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
956
my_error(ER_TABLE_UNKNOWN, identifier);
1141
table->query_id= query_id;
1146
if (flags & DRIZZLE_OPEN_TEMPORARY_ONLY)
1148
my_error(ER_NO_SUCH_TABLE, MYF(0), table_list->db, table_list->table_name);
1153
If it's the first table from a list of tables used in a query,
1154
remember refresh_version (the version of open_cache state).
1155
If the version changes while we're opening the remaining tables,
1156
we will have to back off, close all the tables opened-so-far,
1157
and try to reopen them.
1159
Note-> refresh_version is currently changed only during FLUSH TABLES.
1162
version= refresh_version;
1163
else if ((version != refresh_version) &&
1164
! (flags & DRIZZLE_LOCK_IGNORE_FLUSH))
1166
/* Someone did a refresh while thread was opening tables */
1174
Before we test the global cache, we test our local session cache.
1178
assert(false); /* Not implemented yet */
1182
Non pre-locked/LOCK TABLES mode, and the table is not temporary:
1183
this is the normal use case.
1185
- try to find the table in the table cache.
1186
- if one of the discovered Table instances is name-locked
1187
(table->s->version == 0) back off -- we have to wait
1188
until no one holds a name lock on the table.
1189
- if there is no such Table in the name cache, read the table definition
1190
and insert it into the cache.
1191
We perform all of the above under LOCK_open which currently protects
1192
the open cache (also known as table cache) and table definitions stored
1196
pthread_mutex_lock(&LOCK_open); /* Lock for FLUSH TABLES for open table */
1199
Actually try to find the table in the open_cache.
1200
The cache may contain several "Table" instances for the same
1201
physical table. The instances that are currently "in use" by
1202
some thread have their "in_use" member != NULL.
1203
There is no good reason for having more than one entry in the
1204
hash for the same physical table, except that we use this as
1205
an implicit "pending locks queue" - see
1206
wait_for_locked_table_names for details.
1208
for (table= (Table*) hash_first(&open_cache, (unsigned char*) key, key_length,
1210
table && table->in_use ;
1211
table= (Table*) hash_next(&open_cache, (unsigned char*) key, key_length,
961
If it's the first table from a list of tables used in a query,
962
remember refresh_version (the version of open_cache state).
963
If the version changes while we're opening the remaining tables,
964
we will have to back off, close all the tables opened-so-far,
965
and try to reopen them.
967
Note-> refresh_version is currently changed only during FLUSH TABLES.
1215
Here we flush tables marked for flush.
1216
Normally, table->s->version contains the value of
1217
refresh_version from the moment when this table was
1218
(re-)opened and added to the cache.
1219
If since then we did (or just started) FLUSH TABLES
1220
statement, refresh_version has been increased.
1221
For "name-locked" Table instances, table->s->version is set
1222
to 0 (see lock_table_name for details).
1223
In case there is a pending FLUSH TABLES or a name lock, we
1224
need to back off and re-start opening tables.
1225
If we do not back off now, we may dead lock in case of lock
1226
order mismatch with some other thread:
1227
c1: name lock t1; -- sort of exclusive lock
1228
c2: open t2; -- sort of shared lock
1229
c1: name lock t2; -- blocks
1230
c2: open t1; -- blocks
971
version= refresh_version;
973
else if ((version != refresh_version) &&
974
! (flags & DRIZZLE_LOCK_IGNORE_FLUSH))
976
/* Someone did a refresh while thread was opening tables */
1232
if (table->needs_reopen_or_name_lock())
1234
if (flags & DRIZZLE_LOCK_IGNORE_FLUSH)
1236
/* Force close at once after usage */
1237
version= table->s->version;
1241
/* Avoid self-deadlocks by detecting self-dependencies. */
1242
if (table->open_placeholder && table->in_use == this)
1244
pthread_mutex_unlock(&LOCK_open);
1245
my_error(ER_UPDATE_TABLE_USED, MYF(0), table->s->table_name.str);
1250
Back off, part 1: mark the table as "unused" for the
1251
purpose of name-locking by setting table->db_stat to 0. Do
1252
that only for the tables in this thread that have an old
1253
table->s->version (this is an optimization (?)).
1254
table->db_stat == 0 signals wait_for_locked_table_names
1255
that the tables in question are not used any more. See
1256
table_is_used call for details.
1258
close_old_data_files(false, false);
1261
Back-off part 2: try to avoid "busy waiting" on the table:
1262
if the table is in use by some other thread, we suspend
1263
and wait till the operation is complete: when any
1264
operation that juggles with table->s->version completes,
1265
it broadcasts COND_refresh condition variable.
1266
If 'old' table we met is in use by current thread we return
1267
without waiting since in this situation it's this thread
1268
which is responsible for broadcasting on COND_refresh
1269
(and this was done already in Session::close_old_data_files()).
1270
Good example of such situation is when we have statement
1271
that needs two instances of table and FLUSH TABLES comes
1272
after we open first instance but before we open second
1275
if (table->in_use != this)
1277
/* wait_for_conditionwill unlock LOCK_open for us */
1278
wait_for_condition(&LOCK_open, &COND_refresh);
1282
pthread_mutex_unlock(&LOCK_open);
1285
There is a refresh in progress for this table.
1286
Signal the caller that it has to try again.
984
Before we test the global cache, we test our local session cache.
988
assert(false); /* Not implemented yet */
1295
/* Unlink the table from "unused_tables" list. */
1296
if (table == unused_tables)
1298
unused_tables=unused_tables->next; // Remove from link
1299
if (table == unused_tables)
1300
unused_tables= NULL;
992
Non pre-locked/LOCK TABLES mode, and the table is not temporary:
993
this is the normal use case.
995
- try to find the table in the table cache.
996
- if one of the discovered Table instances is name-locked
997
(table->getShare()->version == 0) back off -- we have to wait
998
until no one holds a name lock on the table.
999
- if there is no such Table in the name cache, read the table definition
1000
and insert it into the cache.
1001
We perform all of the above under table::Cache::singleton().mutex() which currently protects
1002
the open cache (also known as table cache) and table definitions stored
1302
table->prev->next=table->next; /* Remove from unused list */
1303
table->next->prev=table->prev;
1304
table->in_use= this;
1308
/* Insert a new Table instance into the open cache */
1310
/* Free cache if too big */
1311
while (open_cache.records > table_cache_size && unused_tables)
1312
hash_delete(&open_cache,(unsigned char*) unused_tables);
1314
if (table_list->create)
1007
boost::mutex::scoped_lock scopedLock(table::Cache::singleton().mutex());
1010
Actually try to find the table in the open_cache.
1011
The cache may contain several "Table" instances for the same
1012
physical table. The instances that are currently "in use" by
1013
some thread have their "in_use" member != NULL.
1014
There is no good reason for having more than one entry in the
1015
hash for the same physical table, except that we use this as
1016
an implicit "pending locks queue" - see
1017
wait_for_locked_table_names for details.
1019
ppp= table::getCache().equal_range(key);
1022
for (table::CacheMap::const_iterator iter= ppp.first;
1023
iter != ppp.second; ++iter, table= NULL)
1316
char path[FN_REFLEN];
1319
length= build_table_filename(path, sizeof(path),
1320
table_list->db, table_list->table_name,
1323
if (plugin::StorageEngine::getTableDefinition(*this, path, table_list->db, table_list->table_name, false) != EEXIST)
1025
table= (*iter).second;
1027
if (not table->in_use)
1030
Here we flush tables marked for flush.
1031
Normally, table->getShare()->version contains the value of
1032
refresh_version from the moment when this table was
1033
(re-)opened and added to the cache.
1034
If since then we did (or just started) FLUSH TABLES
1035
statement, refresh_version has been increased.
1036
For "name-locked" Table instances, table->getShare()->version is set
1037
to 0 (see lock_table_name for details).
1038
In case there is a pending FLUSH TABLES or a name lock, we
1039
need to back off and re-start opening tables.
1040
If we do not back off now, we may dead lock in case of lock
1041
order mismatch with some other thread:
1042
c1-> name lock t1; -- sort of exclusive lock
1043
c2-> open t2; -- sort of shared lock
1044
c1-> name lock t2; -- blocks
1045
c2-> open t1; -- blocks
1326
Table to be created, so we need to create placeholder in table-cache.
1047
if (table->needs_reopen_or_name_lock())
1328
if (!(table= table_cache_insert_placeholder(key, key_length)))
1049
if (flags & DRIZZLE_LOCK_IGNORE_FLUSH)
1051
/* Force close at once after usage */
1052
version= table->getShare()->getVersion();
1056
/* Avoid self-deadlocks by detecting self-dependencies. */
1057
if (table->open_placeholder && table->in_use == this)
1059
my_error(ER_UPDATE_TABLE_USED, MYF(0), table->getShare()->getTableName());
1064
Back off, part 1: mark the table as "unused" for the
1065
purpose of name-locking by setting table->db_stat to 0. Do
1066
that only for the tables in this thread that have an old
1067
table->getShare()->version (this is an optimization (?)).
1068
table->db_stat == 0 signals wait_for_locked_table_names
1069
that the tables in question are not used any more. See
1070
table_is_used call for details.
1072
close_old_data_files(false, false);
1075
Back-off part 2: try to avoid "busy waiting" on the table:
1076
if the table is in use by some other thread, we suspend
1077
and wait till the operation is complete: when any
1078
operation that juggles with table->getShare()->version completes,
1079
it broadcasts COND_refresh condition variable.
1080
If 'old' table we met is in use by current thread we return
1081
without waiting since in this situation it's this thread
1082
which is responsible for broadcasting on COND_refresh
1083
(and this was done already in Session::close_old_data_files()).
1084
Good example of such situation is when we have statement
1085
that needs two instances of table and FLUSH TABLES comes
1086
after we open first instance but before we open second
1089
if (table->in_use != this)
1091
/* wait_for_conditionwill unlock table::Cache::singleton().mutex() for us */
1092
wait_for_condition(table::Cache::singleton().mutex(), COND_refresh);
1093
scopedLock.release();
1097
scopedLock.unlock();
1101
There is a refresh in progress for this table.
1102
Signal the caller that it has to try again.
1330
pthread_mutex_unlock(&LOCK_open);
1113
table::getUnused().unlink(static_cast<table::Concurrent *>(table));
1114
table->in_use= this;
1118
/* Insert a new Table instance into the open cache */
1120
/* Free cache if too big */
1121
table::getUnused().cull();
1123
if (table_list->isCreate())
1125
identifier::Table lock_table_identifier(table_list->getSchemaName(), table_list->getTableName(), message::Table::STANDARD);
1127
if (not plugin::StorageEngine::doesTableExist(*this, lock_table_identifier))
1130
Table to be created, so we need to create placeholder in table-cache.
1132
if (!(table= table_cache_insert_placeholder(lock_table_identifier)))
1137
Link placeholder to the open tables list so it will be automatically
1138
removed once tables are closed. Also mark it so it won't be ignored
1139
by other trying to take name-lock.
1141
table->open_placeholder= true;
1142
table->setNext(open_tables);
1147
/* Table exists. Let us try to open it. */
1150
/* make a new table */
1152
table::Concurrent *new_table= new table::Concurrent;
1154
if (new_table == NULL)
1159
error= new_table->open_unireg_entry(this, alias, identifier);
1165
(void)table::Cache::singleton().insert(new_table);
1172
table->setNext(open_tables); /* Link into simple list */
1175
table->reginfo.lock_type= TL_READ; /* Assume read */
1178
assert(table->getShare()->getTableCount() > 0 || table->getShare()->getType() != message::Table::STANDARD);
1334
Link placeholder to the open tables list so it will be automatically
1335
removed once tables are closed. Also mark it so it won't be ignored
1336
by other trying to take name-lock.
1338
table->open_placeholder= true;
1339
table->next= open_tables;
1341
pthread_mutex_unlock(&LOCK_open);
1345
/* Table exists. Let us try to open it. */
1348
/* make a new table */
1349
table= (Table *)malloc(sizeof(Table));
1352
pthread_mutex_unlock(&LOCK_open);
1356
error= open_unireg_entry(this, table, table_list, alias, key, key_length);
1360
pthread_mutex_unlock(&LOCK_open);
1363
my_hash_insert(&open_cache, (unsigned char*) table);
1366
pthread_mutex_unlock(&LOCK_open);
1369
table->next= open_tables; /* Link into simple list */
1372
table->reginfo.lock_type= TL_READ; /* Assume read */
1375
assert(table->s->ref_count > 0 || table->s->tmp_table != NO_TMP_TABLE);
1377
if (lex->need_correct_ident())
1378
table->alias_name_used= my_strcasecmp(table_alias_charset,
1379
table->s->table_name.str, alias);
1180
1380
/* Fix alias if table name changes */
1181
if (strcmp(table->getAlias(), alias))
1381
if (strcmp(table->alias, alias))
1183
table->setAlias(alias);
1383
uint32_t length=(uint32_t) strlen(alias)+1;
1384
table->alias= (char*) realloc((char*) table->alias, length);
1385
memcpy((void*) table->alias, alias, length);
1186
1388
/* These variables are also set in reopen_table() */
1515
1893
other threads trying to get the lock.
1518
void abort_locked_tables(Session *session, const drizzled::identifier::Table &identifier)
1896
void abort_locked_tables(Session *session,const char *db, const char *table_name)
1521
for (table= session->open_tables; table ; table= table->getNext())
1899
for (table= session->open_tables; table ; table= table->next)
1523
if (table->getShare()->getCacheKey() == identifier.getKey())
1901
if (!strcmp(table->s->table_name.str, table_name) &&
1902
!strcmp(table->s->db.str, db))
1525
1904
/* If MERGE child, forward lock handling to parent. */
1526
session->abortLock(table);
1905
mysql_lock_abort(session, table);
1912
Load a table definition from file and open unireg table
1916
session Thread handle
1917
entry Store open table definition here
1918
table_list TableList with db, table_name
1920
cache_key Key for share_cache
1921
cache_key_length length of cache_key
1924
Extra argument for open is taken from session->open_options
1925
One must have a lock on LOCK_open when calling this function
1932
static int open_unireg_entry(Session *session, Table *entry, TableList *table_list,
1934
char *cache_key, uint32_t cache_key_length)
1938
uint32_t discover_retry_count= 0;
1940
safe_mutex_assert_owner(&LOCK_open);
1942
if (!(share= TableShare::getShare(session, table_list, cache_key,
1944
table_list->i_s_requested_object,
1948
while ((error= open_table_from_share(session, share, alias,
1949
(uint32_t) (HA_OPEN_KEYFILE |
1954
session->open_options, entry, OTM_OPEN)))
1956
if (error == 7) // Table def changed
1958
share->version= 0; // Mark share as old
1959
if (discover_retry_count++) // Retry once
1964
Here we should wait until all threads has released the table.
1965
For now we do one retry. This may cause a deadlock if there
1966
is other threads waiting for other tables used by this thread.
1968
Proper fix would be to if the second retry failed:
1969
- Mark that table def changed
1970
- Return from open table
1971
- Close all tables used by this thread
1972
- Start waiting that the share is released
1973
- Retry by opening all tables again
1978
To avoid deadlock, only wait for release if no one else is
1981
if (share->ref_count != 1)
1983
/* Free share and wait until it's released by all threads */
1984
TableShare::release(share);
1986
if (!session->killed)
1988
drizzle_reset_errors(session, 1); // Clear warnings
1989
session->clear_error(); // Clear error message
1994
if (!entry->s || !entry->s->crashed)
1996
// Code below is for repairing a crashed file
1997
if ((error= lock_table_name(session, table_list, true)))
2001
if (wait_for_locked_table_names(session, table_list))
2003
unlock_table_name(table_list);
2007
pthread_mutex_unlock(&LOCK_open);
2008
session->clear_error(); // Clear error message
2010
if (open_table_from_share(session, share, alias,
2011
(uint32_t) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
2015
ha_open_options | HA_OPEN_FOR_REPAIR,
2016
entry, OTM_OPEN) || ! entry->file)
2018
/* Give right error message */
2019
session->clear_error();
2020
my_error(ER_NOT_KEYFILE, MYF(0), share->table_name.str, my_errno);
2021
errmsg_printf(ERRMSG_LVL_ERROR, _("Couldn't repair table: %s.%s"), share->db.str,
2022
share->table_name.str);
2024
entry->closefrm(false);
2028
session->clear_error(); // Clear error message
2029
pthread_mutex_lock(&LOCK_open);
2030
unlock_table_name(table_list);
2038
If we are here, there was no fatal error (but error may be still
2041
if (unlikely(entry->file->implicit_emptied))
2043
ReplicationServices &replication_services= ReplicationServices::singleton();
2044
entry->file->implicit_emptied= 0;
2047
uint32_t query_buf_size= 20 + share->db.length + share->table_name.length +1;
2048
if ((query= (char*) malloc(query_buf_size)))
2051
"this DELETE FROM is needed even with row-based binlogging"
2053
We inherited this from MySQL. TODO: fix it to issue a propper truncate
2054
of the table (though that may not be completely right sematics).
2057
end+= sprintf(query, "DELETE FROM `%s`.`%s`", share->db.str,
2058
share->table_name.str);
2059
replication_services.rawStatement(session, query, (size_t)(end - query));
2064
errmsg_printf(ERRMSG_LVL_ERROR, _("When opening HEAP table, could not allocate memory "
2065
"to write 'DELETE FROM `%s`.`%s`' to replication"),
2066
table_list->db, table_list->table_name);
2067
my_error(ER_OUTOFMEMORY, MYF(0), query_buf_size);
2068
entry->closefrm(false);
2076
TableShare::release(share);
1535
2083
Open all tables in list
1802
Table *Open_tables_state::open_temporary_table(const identifier::Table &identifier,
2349
Table *Session::open_temporary_table(const char *path, const char *db_arg,
2350
const char *table_name_arg, bool link_in_list,
2351
open_table_mode open_mode)
1805
assert(identifier.isTmp());
1808
table::Temporary *new_tmp_table= new table::Temporary(identifier.getType(),
1810
const_cast<char *>(const_cast<identifier::Table&>(identifier).getPath().c_str()),
1811
static_cast<uint32_t>(identifier.getPath().length()));
1812
if (not new_tmp_table)
2353
Table *new_tmp_table;
2355
char cache_key[MAX_DBKEY_LENGTH], *saved_cache_key, *tmp_path;
2356
uint32_t key_length, path_length;
2357
TableList table_list;
2359
table_list.db= (char*) db_arg;
2360
table_list.table_name= (char*) table_name_arg;
2361
/* Create the cache_key for temporary tables */
2362
key_length= table_list.create_table_def_key(cache_key);
2363
path_length= strlen(path);
2365
if (!(new_tmp_table= (Table*) malloc(sizeof(*new_tmp_table) + sizeof(*share) +
2366
path_length + 1 + key_length)))
2369
share= (TableShare*) (new_tmp_table+1);
2370
tmp_path= (char*) (share+1);
2371
saved_cache_key= strcpy(tmp_path, path)+path_length+1;
2372
memcpy(saved_cache_key, cache_key, key_length);
2374
share->init(saved_cache_key, key_length, strchr(saved_cache_key, '\0')+1, tmp_path);
1816
2377
First open the share, and then open the table from the share we just opened.
1818
if (new_tmp_table->getMutableShare()->open_table_def(*static_cast<Session *>(this), identifier) ||
1819
new_tmp_table->getMutableShare()->open_table_from_share(static_cast<Session *>(this), identifier, identifier.getTableName().c_str(),
1820
(uint32_t) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
2379
if (open_table_def(*this, share) ||
2380
open_table_from_share(this, share, table_name_arg,
2381
(open_mode == OTM_ALTER) ? 0 :
2382
(uint32_t) (HA_OPEN_KEYFILE | HA_OPEN_RNDFILE |
2384
(open_mode == OTM_ALTER) ?
2385
(EXTRA_RECORD | OPEN_FRM_FILE_ONLY)
2388
new_tmp_table, open_mode))
1825
2390
/* No need to lock share->mutex as this is not needed for tmp tables */
1826
delete new_tmp_table->getMutableShare();
1827
delete new_tmp_table;
2391
share->free_table_share();
2392
free((char*) new_tmp_table);
1832
2396
new_tmp_table->reginfo.lock_type= TL_WRITE; // Simulate locked
2397
if (open_mode == OTM_ALTER)
2400
Temporary table has been created with frm_only
2401
and has not been created in any storage engine
2403
share->tmp_table= TMP_TABLE_FRM_FILE_ONLY;
2406
share->tmp_table= (new_tmp_table->file->has_transactions() ?
2407
TRANSACTIONAL_TMP_TABLE : NON_TRANSACTIONAL_TMP_TABLE);
1834
2409
if (link_in_list)
1836
2411
/* growing temp list at the head */
1837
new_tmp_table->setNext(this->temporary_tables);
1838
if (new_tmp_table->getNext())
1840
new_tmp_table->getNext()->setPrev(new_tmp_table);
2412
new_tmp_table->next= this->temporary_tables;
2413
if (new_tmp_table->next)
2414
new_tmp_table->next->prev= new_tmp_table;
1842
2415
this->temporary_tables= new_tmp_table;
1843
this->temporary_tables->setPrev(0);
2416
this->temporary_tables->prev= 0;
1845
2418
new_tmp_table->pos_in_table_list= 0;
3885
4487
On INSERT or UPDATE fields are checked to be from the same table,
3886
4488
thus we safely can take table from the first field.
3888
table= (*ptr)->getTable();
4490
table= (*ptr)->table;
3889
4491
table->auto_increment_field_not_null= false;
3892
4493
while ((field = *ptr++) && ! session->is_error())
3895
table= field->getTable();
4496
table= field->table;
3897
4497
if (field == table->next_number_field)
3898
4498
table->auto_increment_field_not_null= true;
3900
4499
if (value->save_in_field(field, 0) < 0)
4501
tbl_list.push_back(table);
4503
/* Update virtual fields*/
4504
session->abort_on_warning= false;
4505
if (tbl_list.head())
4507
List_iterator_fast<Table> t(tbl_list);
4508
Table *prev_table= 0;
4509
while ((table= t++))
3903
table->auto_increment_field_not_null= false;
4512
Do simple optimization to prevent unnecessary re-generating
4513
values for virtual fields
4515
if (table != prev_table)
4521
session->abort_on_warning= abort_on_warning_saved;
3909
4522
return(session->is_error());
4525
session->abort_on_warning= abort_on_warning_saved;
4527
table->auto_increment_field_not_null= false;
3913
4532
bool drizzle_rm_tmp_tables()
3916
assert(drizzle_tmpdir.size());
3917
Session::shared_ptr session= Session::make_shared(plugin::Listen::getNullClient(), catalog::local());
4534
char filePath[FN_REFLEN], filePathCopy[FN_REFLEN];
4537
assert(drizzle_tmpdir);
4539
if (!(session= new Session(plugin::Listen::getNullClient())))
3921
session->thread_stack= (char*) session.get();
4541
session->thread_stack= (char*) &session;
3922
4542
session->storeGlobals();
3924
plugin::StorageEngine::removeLostTemporaryTables(*session, drizzle_tmpdir.c_str());
4544
CachedDirectory dir(drizzle_tmpdir);
4548
my_errno= dir.getError();
4549
my_error(ER_CANT_READ_DIR, MYF(0), drizzle_tmpdir, my_errno);
4553
CachedDirectory::Entries files= dir.getEntries();
4554
CachedDirectory::Entries::iterator fileIter= files.begin();
4556
/* Remove all temp tables in the tmpdir */
4557
while (fileIter != files.end())
4559
CachedDirectory::Entry *entry= *fileIter;
4560
string prefix= entry->filename.substr(0, TMP_FILE_PREFIX_LENGTH);
4562
if (prefix == TMP_FILE_PREFIX)
4564
char *ext= fn_ext(entry->filename.c_str());
4565
uint32_t ext_len= strlen(ext);
4566
uint32_t filePath_len= snprintf(filePath, sizeof(filePath),
4567
"%s%c%s", drizzle_tmpdir, FN_LIBCHAR,
4568
entry->filename.c_str());
4570
if (ext_len && !memcmp(drizzled::plugin::DEFAULT_DEFINITION_FILE_EXT.c_str(), ext, ext_len))
4573
/* We should cut file extention before deleting of table */
4574
memcpy(filePathCopy, filePath, filePath_len - ext_len);
4575
filePathCopy[filePath_len - ext_len]= 0;
4576
share.init(NULL, filePathCopy);
4577
if (!open_table_def(*session, &share))
4579
share.db_type()->doDropTable(*session, filePathCopy);
4581
share.free_table_share();
4584
File can be already deleted by tmp_table.file->delete_table().
4585
So we hide error messages which happnes during deleting of these
4588
my_delete(filePath, MYF(0));
3932
4602
unireg support functions
3933
4603
*****************************************************************************/
4606
Invalidate any cache entries that are for some DB
4609
remove_db_from_cache()
4610
db Database name. This will be in lower case if
4611
lower_case_table_name is set
4614
We can't use hash_delete when looping hash_elements. We mark them first
4615
and afterwards delete those marked unused.
4618
void remove_db_from_cache(const char *db)
4620
safe_mutex_assert_owner(&LOCK_open);
4622
for (uint32_t idx=0 ; idx < open_cache.records ; idx++)
4624
Table *table=(Table*) hash_element(&open_cache,idx);
4625
if (!strcmp(table->s->db.str, db))
4627
table->s->version= 0L; /* Free when thread is ready */
4629
relink_unused(table);
4632
while (unused_tables && !unused_tables->s->version)
4633
hash_delete(&open_cache,(unsigned char*) unused_tables);
4638
Mark all entries with the table as deleted to force an reopen of the table
4640
The table will be closed (not stored in cache) by the current thread when
4641
close_thread_tables() is called.
4647
0 This thread now have exclusive access to this table and no other thread
4648
can access the table until close_thread_tables() is called.
4649
1 Table is in use by another thread
4652
bool remove_table_from_cache(Session *session, const char *db, const char *table_name,
4655
char key[MAX_DBKEY_LENGTH];
4657
uint32_t key_length;
4660
bool signalled= false;
4662
key_pos= strcpy(key_pos, db) + strlen(db);
4663
key_pos= strcpy(key_pos+1, table_name) + strlen(table_name);
4664
key_length= (uint32_t) (key_pos-key)+1;
4668
HASH_SEARCH_STATE state;
4669
result= signalled= false;
4671
for (table= (Table*) hash_first(&open_cache, (unsigned char*) key, key_length,
4674
table= (Table*) hash_next(&open_cache, (unsigned char*) key, key_length,
4679
table->s->version=0L; /* Free when thread is ready */
4680
if (!(in_use=table->in_use))
4682
relink_unused(table);
4684
else if (in_use != session)
4687
Mark that table is going to be deleted from cache. This will
4688
force threads that are in mysql_lock_tables() (but not yet
4689
in thr_multi_lock()) to abort it's locks, close all tables and retry
4691
in_use->some_tables_deleted= true;
4692
if (table->is_name_opened())
4697
Now we must abort all tables locks used by this thread
4698
as the thread may be waiting to get a lock for another table.
4699
Note that we need to hold LOCK_open while going through the
4700
list. So that the other thread cannot change it. The other
4701
thread must also hold LOCK_open whenever changing the
4702
open_tables list. Aborting the MERGE lock after a child was
4703
closed and before the parent is closed would be fatal.
4705
for (Table *session_table= in_use->open_tables;
4707
session_table= session_table->next)
4709
/* Do not handle locks of MERGE children. */
4710
if (session_table->db_stat) // If table is open
4711
signalled|= mysql_lock_abort_for_thread(session, session_table);
4715
result= result || (flags & RTFC_OWNED_BY_Session_FLAG);
4717
while (unused_tables && !unused_tables->s->version)
4718
hash_delete(&open_cache,(unsigned char*) unused_tables);
4720
/* Remove table from table definition cache if it's not in use */
4721
TableShare::release(key, key_length);
4723
if (result && (flags & RTFC_WAIT_OTHER_THREAD_FLAG))
4726
Signal any thread waiting for tables to be freed to
4729
broadcast_refresh();
4730
if (!(flags & RTFC_CHECK_KILLED_FLAG) || !session->killed)
4733
if (likely(signalled))
4734
(void) pthread_cond_wait(&COND_refresh, &LOCK_open);
4737
struct timespec abstime;
4739
It can happen that another thread has opened the
4740
table but has not yet locked any table at all. Since
4741
it can be locked waiting for a table that our thread
4742
has done LOCK Table x WRITE on previously, we need to
4743
ensure that the thread actually hears our signal
4744
before we go to sleep. Thus we wait for a short time
4745
and then we retry another loop in the
4746
remove_table_from_cache routine.
4748
set_timespec(abstime, 10);
4749
pthread_cond_timedwait(&COND_refresh, &LOCK_open, &abstime);