summaryrefslogtreecommitdiff
path: root/sql/ha_ndbcluster.cc
diff options
context:
space:
mode:
authorunknown <mskold@mysql.com>2005-04-28 09:39:29 +0200
committerunknown <mskold@mysql.com>2005-04-28 09:39:29 +0200
commit2ef10765dc6ccfba55c65df3ec19313b23d7be5e (patch)
tree7026bd49e23eb7013f08cde04371176a770fa884 /sql/ha_ndbcluster.cc
parent27a6a8146417829d9edfcb8fb86306f985e03bd2 (diff)
downloadmariadb-git-2ef10765dc6ccfba55c65df3ec19313b23d7be5e.tar.gz
Fix for avoiding gettin Invalid schema object version when doing local changes, post review fixes
Diffstat (limited to 'sql/ha_ndbcluster.cc')
-rw-r--r--sql/ha_ndbcluster.cc24
1 files changed, 20 insertions, 4 deletions
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc
index 0d6bfcb9d0d..306d3224930 100644
--- a/sql/ha_ndbcluster.cc
+++ b/sql/ha_ndbcluster.cc
@@ -336,7 +336,17 @@ void ha_ndbcluster::invalidate_dictionary_cache(bool global)
NDBDICT *dict= get_ndb()->getDictionary();
DBUG_PRINT("info", ("invalidating %s", m_tabname));
if (global)
- dict->invalidateTable(m_tabname);
+ {
+ if (((const NDBTAB *)m_table)->getObjectStatus()
+ == NdbDictionary::Object::Invalid)
+ {
+ // Global cache has already been invalidated
+ dict->removeCachedTable(m_tabname);
+ global= FALSE;
+ }
+ else
+ dict->invalidateTable(m_tabname);
+ }
else
dict->removeCachedTable(m_tabname);
table->version=0L; /* Free when thread is ready */
@@ -779,6 +789,7 @@ int ha_ndbcluster::get_metadata(const char *path)
if (!(tab= dict->getTable(m_tabname)))
ERR_RETURN(dict->getNdbError());
+ // Check if thread has stale local cache
if (tab->getObjectStatus() == NdbDictionary::Object::Invalid)
{
invalidate_dictionary_cache(FALSE);
@@ -804,6 +815,7 @@ int ha_ndbcluster::get_metadata(const char *path)
if (!invalidating_ndb_table)
{
DBUG_PRINT("info", ("Invalidating table"));
+ m_table= (void *) tab;
invalidate_dictionary_cache(TRUE);
invalidating_ndb_table= TRUE;
}
@@ -3288,7 +3300,6 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
thd->transaction.stmt.ndb_tid= 0;
}
}
- m_table= NULL;
m_table_info= NULL;
/*
This is the place to make sure this handler instance
@@ -3910,7 +3921,13 @@ int ha_ndbcluster::rename_table(const char *from, const char *to)
dict= ndb->getDictionary();
if (!(orig_tab= dict->getTable(m_tabname)))
ERR_RETURN(dict->getNdbError());
-
+ // Check if thread has stale local cache
+ if (orig_tab->getObjectStatus() == NdbDictionary::Object::Invalid)
+ {
+ dict->removeCachedTable(m_tabname);
+ if (!(orig_tab= dict->getTable(m_tabname)))
+ ERR_RETURN(dict->getNdbError());
+ }
m_table= (void *)orig_tab;
// Change current database to that of target table
set_dbname(to);
@@ -4278,7 +4295,6 @@ int ndbcluster_discover(THD* thd, const char *db, const char *name,
DBUG_RETURN(1);
ERR_RETURN(err);
}
-
DBUG_PRINT("info", ("Found table %s", tab->getName()));
len= tab->getFrmLength();