diff --git a/mysql-test/t/disabled.def b/mysql-test/t/disabled.def index 76edc83afa3..fe5f0900cd0 100644 --- a/mysql-test/t/disabled.def +++ b/mysql-test/t/disabled.def @@ -41,6 +41,6 @@ rpl_row_basic_3innodb : Bug #17385 rpl_sp : Bug#16456 rpl_until : Unstable test case, bug#15886 sp-goto : GOTO is currently is disabled - will be fixed in the future -rpl_ndb_blob : Bug #17505 +#rpl_ndb_blob : Bug #17505 rpl_ndb_blob2 : Bug #17505 rpl_ndb_log : results are not deterministic diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index f90d18356d4..3bfcd7e704b 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -5525,7 +5525,7 @@ int ndbcluster_find_all_files(THD *thd) { NDBDICT::List::Element& elmt= list.elements[i]; int do_handle_table= 0; - if (IS_TMP_PREFIX(elmt.name)) + if (IS_TMP_PREFIX(elmt.name) || IS_NDB_BLOB_PREFIX(elmt.name)) { DBUG_PRINT("info", ("Skipping %s.%s in NDB", elmt.database, elmt.name)); continue; @@ -5662,7 +5662,7 @@ int ndbcluster_find_files(THD *thd,const char *db,const char *path, for (i= 0 ; i < list.count ; i++) { NDBDICT::List::Element& elmt= list.elements[i]; - if (IS_TMP_PREFIX(elmt.name)) + if (IS_TMP_PREFIX(elmt.name) || IS_NDB_BLOB_PREFIX(elmt.name)) { DBUG_PRINT("info", ("Skipping %s.%s in NDB", elmt.database, elmt.name)); continue; diff --git a/sql/ha_ndbcluster_binlog.cc b/sql/ha_ndbcluster_binlog.cc index bcbfafccdd5..c1aa4820cae 100644 --- a/sql/ha_ndbcluster_binlog.cc +++ b/sql/ha_ndbcluster_binlog.cc @@ -2082,23 +2082,6 @@ ndbcluster_create_event_ops(NDB_SHARE *share, const NDBTAB *ndbtab, if (share->flags & NSF_BLOB_FLAG) op->mergeEvents(true); // currently not inherited from event - if (share->flags & NSF_BLOB_FLAG) - { - /* - * Given servers S1 S2, following results in out-of-date - * event->m_tableImpl and column->m_blobTable. - * - * S1: create table t1(a int primary key); - * S2: drop table t1; - * S1: create table t2(a int primary key, b blob); - * S1: alter table t2 add x int; - * S1: alter table t2 drop x; - * - * TODO fix at right place before we get here - */ - ndb->getDictionary()->fix_blob_events(ndbtab, event_name); - } - int n_columns= ndbtab->getNoOfColumns(); int n_fields= table ? table->s->fields : 0; // XXX ??? for (int j= 0; j < n_columns; j++) diff --git a/storage/ndb/include/ndbapi/NdbDictionary.hpp b/storage/ndb/include/ndbapi/NdbDictionary.hpp index 59c73c91f6e..82c84461b13 100644 --- a/storage/ndb/include/ndbapi/NdbDictionary.hpp +++ b/storage/ndb/include/ndbapi/NdbDictionary.hpp @@ -1783,7 +1783,6 @@ public: #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL const Table * getTable(const char * name, void **data) const; void set_local_table_data_size(unsigned sz); - void fix_blob_events(const Table* table, const char* ev_name); #endif }; }; diff --git a/storage/ndb/src/ndbapi/DictCache.cpp b/storage/ndb/src/ndbapi/DictCache.cpp index 5ea407ad48f..f3c9a934b90 100644 --- a/storage/ndb/src/ndbapi/DictCache.cpp +++ b/storage/ndb/src/ndbapi/DictCache.cpp @@ -159,11 +159,16 @@ GlobalDictCache::get(const char * name) switch(ver->m_status){ case OK: ver->m_refCount++; + DBUG_PRINT("info", ("Table OK version=%x.%x refCount=%u", + ver->m_impl->m_version & 0xFFFFFF, + ver->m_impl->m_version >> 24, + ver->m_refCount)); DBUG_RETURN(ver->m_impl); case DROPPED: retreive = true; // Break loop break; case RETREIVING: + DBUG_PRINT("info", ("Wait for retrieving thread")); NdbCondition_WaitTimeout(m_waitForTableCondition, m_mutex, waitTime); continue; } @@ -178,6 +183,7 @@ GlobalDictCache::get(const char * name) tmp.m_status = RETREIVING; tmp.m_refCount = 1; // The one retreiving it versions->push_back(tmp); + DBUG_PRINT("info", ("No table found")); DBUG_RETURN(0); } @@ -185,8 +191,11 @@ NdbTableImpl * GlobalDictCache::put(const char * name, NdbTableImpl * tab) { DBUG_ENTER("GlobalDictCache::put"); - DBUG_PRINT("enter", ("name: %s, internal_name: %s", - name, tab ? tab->m_internalName.c_str() : "tab NULL")); + DBUG_PRINT("enter", ("name: %s, internal_name: %s version: %x.%x", + name, + tab ? tab->m_internalName.c_str() : "tab NULL", + tab ? tab->m_version & 0xFFFFFF : 0, + tab ? tab->m_version >> 24 : 0)); const Uint32 len = strlen(name); Vector * vers = m_tableHash.getData(name, len); @@ -218,12 +227,14 @@ GlobalDictCache::put(const char * name, NdbTableImpl * tab) vers->erase(sz - 1); } else if (ver.m_impl == 0) { + DBUG_PRINT("info", ("Table OK")); ver.m_impl = tab; ver.m_version = tab->m_version; ver.m_status = OK; } else if (ver.m_impl == &f_invalid_table) { + DBUG_PRINT("info", ("Table DROPPED invalid")); ver.m_impl = tab; ver.m_version = tab->m_version; ver.m_status = DROPPED; @@ -231,6 +242,7 @@ GlobalDictCache::put(const char * name, NdbTableImpl * tab) } else if(ver.m_impl == &f_altered_table) { + DBUG_PRINT("info", ("Table DROPPED altered")); ver.m_impl = tab; ver.m_version = tab->m_version; ver.m_status = DROPPED; diff --git a/storage/ndb/src/ndbapi/NdbDictionary.cpp b/storage/ndb/src/ndbapi/NdbDictionary.cpp index 72b9ed27fec..e64f5968ed2 100644 --- a/storage/ndb/src/ndbapi/NdbDictionary.cpp +++ b/storage/ndb/src/ndbapi/NdbDictionary.cpp @@ -1502,12 +1502,6 @@ NdbDictionary::Dictionary::getNdbError() const { return m_impl.getNdbError(); } -void -NdbDictionary::Dictionary::fix_blob_events(const Table* table, const char* ev_name) -{ - m_impl.fix_blob_events(table, ev_name); -} - // printers NdbOut& diff --git a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp index 46834b519bf..41168bb9279 100644 --- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp +++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.cpp @@ -2767,16 +2767,28 @@ NdbDictInterface::execDROP_TABLE_REF(NdbApiSignal * signal, } int -NdbDictionaryImpl::invalidateObject(NdbTableImpl & impl) +NdbDictionaryImpl::invalidateObject(NdbTableImpl & impl, bool lock) { const char * internalTableName = impl.m_internalName.c_str(); DBUG_ENTER("NdbDictionaryImpl::invalidateObject"); DBUG_PRINT("enter", ("internal_name: %s", internalTableName)); + + if (lock) + m_globalHash->lock(); + if (impl.m_noOfBlobs != 0) { + for (uint i = 0; i < impl.m_columns.size(); i++) { + NdbColumnImpl& c = *impl.m_columns[i]; + if (! c.getBlobType() || c.getPartSize() == 0) + continue; + assert(c.m_blobTable != NULL); + invalidateObject(*c.m_blobTable, false); + } + } m_localHash.drop(internalTableName); - m_globalHash->lock(); impl.m_status = NdbDictionary::Object::Invalid; m_globalHash->drop(&impl); - m_globalHash->unlock(); + if (lock) + m_globalHash->unlock(); DBUG_RETURN(0); } @@ -2784,6 +2796,8 @@ int NdbDictionaryImpl::removeCachedObject(NdbTableImpl & impl, bool lock) { const char * internalTableName = impl.m_internalName.c_str(); + DBUG_ENTER("NdbDictionaryImpl::removeCachedObject"); + DBUG_PRINT("enter", ("internal_name: %s", internalTableName)); if (lock) m_globalHash->lock(); @@ -2800,7 +2814,7 @@ NdbDictionaryImpl::removeCachedObject(NdbTableImpl & impl, bool lock) m_globalHash->release(&impl); if (lock) m_globalHash->unlock(); - return 0; + DBUG_RETURN(0); } /***************************************************************** @@ -4709,30 +4723,6 @@ NdbDictInterface::parseFileInfo(NdbFileImpl &dst, return 0; } -// XXX temp -void -NdbDictionaryImpl::fix_blob_events(const NdbDictionary::Table* table, const char* ev_name) -{ - const NdbTableImpl& t = table->m_impl; - const NdbEventImpl* ev = getEvent(ev_name); - assert(ev != NULL); - Uint32 i; - for (i = 0; i < t.m_columns.size(); i++) { - assert(t.m_columns[i] != NULL); - const NdbColumnImpl& c = *t.m_columns[i]; - if (! c.getBlobType() || c.getPartSize() == 0) - continue; - char bename[200]; - NdbBlob::getBlobEventName(bename, ev, &c); - // following fixes dict cache blob table - NdbEventImpl* bev = getEvent(bename); - if (c.m_blobTable != bev->m_tableImpl) { - // XXX const violation - ((NdbColumnImpl*)&c)->m_blobTable = bev->m_tableImpl; - } - } -} - template class Vector; template class Vector; template class Vector; diff --git a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp index 4ada24b257c..064de6e42d4 100644 --- a/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp +++ b/storage/ndb/src/ndbapi/NdbDictionaryImpl.hpp @@ -546,7 +546,7 @@ public: int dropTable(const char * name); int dropTable(NdbTableImpl &); int dropBlobTables(NdbTableImpl &); - int invalidateObject(NdbTableImpl &); + int invalidateObject(NdbTableImpl &, bool lock = true); int removeCachedObject(NdbTableImpl &, bool lock = true); int createIndex(NdbIndexImpl &ix); @@ -604,8 +604,6 @@ public: NdbDictInterface m_receiver; Ndb & m_ndb; - // XXX temp - void fix_blob_events(const NdbDictionary::Table* table, const char* ev_name); private: NdbIndexImpl * getIndexImpl(const char * name, const BaseString& internalName);