Commit 108ea3e3 authored by unknown's avatar unknown

cleanup of ndb invalidate dictionary cache

fixed test case from previous commit


mysql-test/r/ndb_lock.result:
  fixed result file form previous commit
sql/ha_ndbcluster.cc:
  cleanup of ndb invalidate dictionary cache
sql/ha_ndbcluster.h:
  cleanup of ndb invalidate dictionary cache
parent 88df3aaf
...@@ -66,7 +66,6 @@ drop table t1; ...@@ -66,7 +66,6 @@ drop table t1;
create table t3 (id2 int) engine=ndb; create table t3 (id2 int) engine=ndb;
lock tables t3 write; lock tables t3 write;
unlock tables; unlock tables;
id2
drop table t3; drop table t3;
create table t2 (id int, j int) engine=ndb; create table t2 (id int, j int) engine=ndb;
insert into t2 values (2, 2); insert into t2 values (2, 2);
......
...@@ -466,60 +466,58 @@ void ha_ndbcluster::no_uncommitted_rows_reset(THD *thd) ...@@ -466,60 +466,58 @@ void ha_ndbcluster::no_uncommitted_rows_reset(THD *thd)
# The mapped error code # The mapped error code
*/ */
int int ha_ndbcluster::invalidate_dictionary_cache(bool global)
ha_ndbcluster::invalidate_dictionary_cache(TABLE_SHARE *share, Ndb *ndb,
const char *dbname, const char *tabname,
bool global)
{ {
NDBDICT *dict= ndb->getDictionary(); NDBDICT *dict= get_ndb()->getDictionary();
DBUG_ENTER("invalidate_dictionary_cache"); DBUG_ENTER("invalidate_dictionary_cache");
DBUG_PRINT("info", ("invalidating %s", tabname)); DBUG_PRINT("info", ("m_tabname: %s global: %d", m_tabname, global));
if (global)
{
#ifdef HAVE_NDB_BINLOG #ifdef HAVE_NDB_BINLOG
if (current_thd != injector_thd)
{
char key[FN_REFLEN]; char key[FN_REFLEN];
build_table_filename(key, sizeof(key), dbname, tabname, ""); build_table_filename(key, sizeof(key), m_dbname, m_tabname, "");
DBUG_PRINT("info", ("Getting ndbcluster mutex")); DBUG_PRINT("info", ("Getting ndbcluster mutex"));
pthread_mutex_lock(&ndbcluster_mutex); pthread_mutex_lock(&ndbcluster_mutex);
NDB_SHARE *ndb_share= (NDB_SHARE*)hash_search(&ndbcluster_open_tables, NDB_SHARE *ndb_share= (NDB_SHARE*)hash_search(&ndbcluster_open_tables,
(byte*) key, strlen(key)); (byte*) key, strlen(key));
// Only binlog_thread is allowed to globally invalidate a table
if (ndb_share && ndb_share->op)
{
pthread_mutex_unlock(&ndbcluster_mutex); pthread_mutex_unlock(&ndbcluster_mutex);
DBUG_PRINT("info", ("Released ndbcluster mutex")); DBUG_PRINT("info", ("Released ndbcluster mutex"));
// Only binlog_thread is allowed to globally invalidate a table
if (global && ndb_share && ndb_share->op && (current_thd != injector_thd))
DBUG_RETURN(1); DBUG_RETURN(1);
}
pthread_mutex_unlock(&ndbcluster_mutex);
DBUG_PRINT("info", ("Released ndbcluster mutex"));
}
#endif #endif
const NDBTAB *tab= dict->getTable(m_tabname);
if (global)
{
const NDBTAB *tab= dict->getTable(tabname);
if (!tab) if (!tab)
DBUG_RETURN(1); DBUG_RETURN(1);
if (tab->getObjectStatus() == NdbDictionary::Object::Invalid) if (tab->getObjectStatus() == NdbDictionary::Object::Invalid)
{ {
// Global cache has already been invalidated // Global cache has already been invalidated
dict->removeCachedTable(tabname); dict->removeCachedTable(m_tabname);
global= FALSE; global= FALSE;
DBUG_PRINT("info", ("global: %d", global));
} }
else else
dict->invalidateTable(tabname); dict->invalidateTable(m_tabname);
share->version=0L; /* Free when thread is ready */ table_share->version= 0L; /* Free when thread is ready */
} }
else else
dict->removeCachedTable(tabname); dict->removeCachedTable(m_tabname);
DBUG_RETURN(0);
}
void ha_ndbcluster::invalidate_dictionary_cache(bool global)
{
NDBDICT *dict= get_ndb()->getDictionary();
if (invalidate_dictionary_cache(table_share, get_ndb(), m_dbname, m_tabname, global))
return;
/* Invalidate indexes */ /* Invalidate indexes */
for (uint i= 0; i < table_share->keys; i++) for (uint i= 0; i < table_share->keys; i++)
{ {
NDBINDEX *index = (NDBINDEX *) m_index[i].index; NDBINDEX *index = (NDBINDEX *) m_index[i].index;
NDBINDEX *unique_index = (NDBINDEX *) m_index[i].unique_index; NDBINDEX *unique_index = (NDBINDEX *) m_index[i].unique_index;
if (!index && !unique_index) continue; if (!index && !unique_index)
continue;
NDB_INDEX_TYPE idx_type= m_index[i].type; NDB_INDEX_TYPE idx_type= m_index[i].type;
switch (idx_type) { switch (idx_type) {
...@@ -546,6 +544,7 @@ void ha_ndbcluster::invalidate_dictionary_cache(bool global) ...@@ -546,6 +544,7 @@ void ha_ndbcluster::invalidate_dictionary_cache(bool global)
break; break;
} }
} }
DBUG_RETURN(0);
} }
int ha_ndbcluster::ndb_err(NdbTransaction *trans) int ha_ndbcluster::ndb_err(NdbTransaction *trans)
......
...@@ -685,9 +685,6 @@ static void set_tabname(const char *pathname, char *tabname); ...@@ -685,9 +685,6 @@ static void set_tabname(const char *pathname, char *tabname);
bool check_if_incompatible_data(HA_CREATE_INFO *info, bool check_if_incompatible_data(HA_CREATE_INFO *info,
uint table_changes); uint table_changes);
static int invalidate_dictionary_cache(TABLE_SHARE *share, Ndb *ndb,
const char *dbname, const char *tabname,
bool global);
private: private:
friend int ndbcluster_drop_database_impl(const char *path); friend int ndbcluster_drop_database_impl(const char *path);
...@@ -774,7 +771,7 @@ static void set_tabname(const char *pathname, char *tabname); ...@@ -774,7 +771,7 @@ static void set_tabname(const char *pathname, char *tabname);
void print_results(); void print_results();
ulonglong get_auto_increment(); ulonglong get_auto_increment();
void invalidate_dictionary_cache(bool global); int invalidate_dictionary_cache(bool global);
int ndb_err(NdbTransaction*); int ndb_err(NdbTransaction*);
bool uses_blob_value(); bool uses_blob_value();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment