📄 ndbdictionaryimpl.cpp
字号:
if(m_replicaCount > 0) { Uint32 fragmentId = hashValue & m_hashValueMask; if(fragmentId < m_hashpointerValue) { fragmentId = hashValue & ((m_hashValueMask << 1) + 1); } Uint32 pos = fragmentId * m_replicaCount; if(pos + m_replicaCount <= m_fragments.size()) { * nodes = m_fragments.getBase()+pos; return m_replicaCount; } } return 0;} /** * NdbIndexImpl */NdbIndexImpl::NdbIndexImpl() : NdbDictionary::Index(* this), m_facade(this){ init();}NdbIndexImpl::NdbIndexImpl(NdbDictionary::Index & f) : NdbDictionary::Index(* this), m_facade(&f){ init();}void NdbIndexImpl::init(){ m_indexId= RNIL; m_type= NdbDictionary::Index::Undefined; m_logging= true; m_table= NULL;}NdbIndexImpl::~NdbIndexImpl(){ for (unsigned i = 0; i < m_columns.size(); i++) delete m_columns[i]; }void NdbIndexImpl::setName(const char * name){ m_externalName.assign(name);}const char * NdbIndexImpl::getName() const{ return m_externalName.c_str();} void NdbIndexImpl::setTable(const char * table){ m_tableName.assign(table);} const char * NdbIndexImpl::getTable() const{ return m_tableName.c_str();}const NdbTableImpl *NdbIndexImpl::getIndexTable() const{ return m_table;}/** * NdbEventImpl */NdbEventImpl::NdbEventImpl() : NdbDictionary::Event(* this), m_facade(this){ init();}NdbEventImpl::NdbEventImpl(NdbDictionary::Event & f) : NdbDictionary::Event(* this), m_facade(&f){ init();}void NdbEventImpl::init(){ m_eventId= RNIL; m_eventKey= RNIL; m_tableId= RNIL; mi_type= 0; m_dur= NdbDictionary::Event::ED_UNDEFINED; m_tableImpl= NULL; m_bufferId= RNIL; eventOp= NULL;}NdbEventImpl::~NdbEventImpl(){ for (unsigned i = 0; i < m_columns.size(); i++) delete m_columns[i];}void NdbEventImpl::setName(const char * name){ m_externalName.assign(name);}const char *NdbEventImpl::getName() const{ return m_externalName.c_str();}void NdbEventImpl::setTable(const NdbDictionary::Table& table){ m_tableImpl= &NdbTableImpl::getImpl(table); m_tableName.assign(m_tableImpl->getName());}void NdbEventImpl::setTable(const char * table){ m_tableName.assign(table);}const char *NdbEventImpl::getTableName() const{ return m_tableName.c_str();}voidNdbEventImpl::addTableEvent(const NdbDictionary::Event::TableEvent t = NdbDictionary::Event::TE_ALL){ switch (t) { case NdbDictionary::Event::TE_INSERT : mi_type |= 1; break; case NdbDictionary::Event::TE_DELETE : mi_type |= 2; break; case NdbDictionary::Event::TE_UPDATE : mi_type |= 4; break; default: mi_type = 4 | 2 | 1; // all types }}voidNdbEventImpl::setDurability(NdbDictionary::Event::EventDurability d){ m_dur = d;}NdbDictionary::Event::EventDurabilityNdbEventImpl::getDurability() const{ return m_dur;}int NdbEventImpl::getNoOfEventColumns() const{ return m_attrIds.size() + m_columns.size();}/** * NdbDictionaryImpl */NdbDictionaryImpl::NdbDictionaryImpl(Ndb &ndb) : NdbDictionary::Dictionary(* this), m_facade(this), m_receiver(m_error), m_ndb(ndb){ m_globalHash = 0; m_local_table_data_size= 0;}NdbDictionaryImpl::NdbDictionaryImpl(Ndb &ndb, NdbDictionary::Dictionary & f) : NdbDictionary::Dictionary(* this), m_facade(&f), m_receiver(m_error), m_ndb(ndb){ m_globalHash = 0; m_local_table_data_size= 0;}static int f_dictionary_count = 0;NdbDictionaryImpl::~NdbDictionaryImpl(){ NdbElement_t<Ndb_local_table_info> * curr = m_localHash.m_tableHash.getNext(0); if(m_globalHash){ while(curr != 0){ m_globalHash->lock(); m_globalHash->release(curr->theData->m_table_impl); Ndb_local_table_info::destroy(curr->theData); m_globalHash->unlock(); curr = m_localHash.m_tableHash.getNext(curr); } m_globalHash->lock(); if(--f_dictionary_count == 0){ delete NdbDictionary::Column::FRAGMENT; delete NdbDictionary::Column::FRAGMENT_MEMORY; delete NdbDictionary::Column::ROW_COUNT; delete NdbDictionary::Column::COMMIT_COUNT; delete NdbDictionary::Column::ROW_SIZE; delete NdbDictionary::Column::RANGE_NO; NdbDictionary::Column::FRAGMENT= 0; NdbDictionary::Column::FRAGMENT_MEMORY= 0; NdbDictionary::Column::ROW_COUNT= 0; NdbDictionary::Column::COMMIT_COUNT= 0; NdbDictionary::Column::ROW_SIZE= 0; NdbDictionary::Column::RANGE_NO= 0; } m_globalHash->unlock(); } else { assert(curr == 0); }}Ndb_local_table_info *NdbDictionaryImpl::fetchGlobalTableImpl(const BaseString& internalTableName){ NdbTableImpl *impl; m_globalHash->lock(); impl = m_globalHash->get(internalTableName.c_str()); m_globalHash->unlock(); if (impl == 0){ impl = m_receiver.getTable(internalTableName, m_ndb.usingFullyQualifiedNames()); m_globalHash->lock(); m_globalHash->put(internalTableName.c_str(), impl); m_globalHash->unlock(); if(impl == 0){ return 0; } } Ndb_local_table_info *info= Ndb_local_table_info::create(impl, m_local_table_data_size); m_localHash.put(internalTableName.c_str(), info); m_ndb.theFirstTupleId[impl->getTableId()] = ~0; m_ndb.theLastTupleId[impl->getTableId()] = ~0; return info;}#if 0boolNdbDictionaryImpl::setTransporter(class TransporterFacade * tf){ if(tf != 0){ m_globalHash = &tf->m_globalDictCache; return m_receiver.setTransporter(tf); } return false;}#endifboolNdbDictionaryImpl::setTransporter(class Ndb* ndb, class TransporterFacade * tf){ m_globalHash = &tf->m_globalDictCache; if(m_receiver.setTransporter(ndb, tf)){ m_globalHash->lock(); if(f_dictionary_count++ == 0){ NdbDictionary::Column::FRAGMENT= NdbColumnImpl::create_psuedo("NDB$FRAGMENT"); NdbDictionary::Column::FRAGMENT_MEMORY= NdbColumnImpl::create_psuedo("NDB$FRAGMENT_MEMORY"); NdbDictionary::Column::ROW_COUNT= NdbColumnImpl::create_psuedo("NDB$ROW_COUNT"); NdbDictionary::Column::COMMIT_COUNT= NdbColumnImpl::create_psuedo("NDB$COMMIT_COUNT"); NdbDictionary::Column::ROW_SIZE= NdbColumnImpl::create_psuedo("NDB$ROW_SIZE"); NdbDictionary::Column::RANGE_NO= NdbColumnImpl::create_psuedo("NDB$RANGE_NO"); } m_globalHash->unlock(); return true; } return false;}NdbTableImpl *NdbDictionaryImpl::getIndexTable(NdbIndexImpl * index, NdbTableImpl * table){ const BaseString internalName( m_ndb.internalize_index_name(table, index->getName())); return getTable(m_ndb.externalizeTableName(internalName.c_str()));}#if 0boolNdbDictInterface::setTransporter(class TransporterFacade * tf){ if(tf == 0) return false; Guard g(tf->theMutexPtr); m_blockNumber = tf->open(this, execSignal, execNodeStatus); if ( m_blockNumber == -1 ) { m_error.code= 4105; return false; // no more free blocknumbers }//if Uint32 theNode = tf->ownId(); m_reference = numberToRef(m_blockNumber, theNode); m_transporter = tf; m_waiter.m_mutex = tf->theMutexPtr; return true;}#endifboolNdbDictInterface::setTransporter(class Ndb* ndb, class TransporterFacade * tf){ m_reference = ndb->getReference(); m_transporter = tf; m_waiter.m_mutex = tf->theMutexPtr; return true;}NdbDictInterface::~NdbDictInterface(){}void NdbDictInterface::execSignal(void* dictImpl, class NdbApiSignal* signal, class LinearSectionPtr ptr[3]){ NdbDictInterface * tmp = (NdbDictInterface*)dictImpl; const Uint32 gsn = signal->readSignalNumber(); switch(gsn){ case GSN_GET_TABINFOREF: tmp->execGET_TABINFO_REF(signal, ptr); break; case GSN_GET_TABINFO_CONF: tmp->execGET_TABINFO_CONF(signal, ptr); break; case GSN_CREATE_TABLE_REF: tmp->execCREATE_TABLE_REF(signal, ptr); break; case GSN_CREATE_TABLE_CONF: tmp->execCREATE_TABLE_CONF(signal, ptr); break; case GSN_DROP_TABLE_REF: tmp->execDROP_TABLE_REF(signal, ptr); break; case GSN_DROP_TABLE_CONF: tmp->execDROP_TABLE_CONF(signal, ptr); break; case GSN_ALTER_TABLE_REF: tmp->execALTER_TABLE_REF(signal, ptr); break; case GSN_ALTER_TABLE_CONF: tmp->execALTER_TABLE_CONF(signal, ptr); break; case GSN_CREATE_INDX_REF: tmp->execCREATE_INDX_REF(signal, ptr); break; case GSN_CREATE_INDX_CONF: tmp->execCREATE_INDX_CONF(signal, ptr); break; case GSN_DROP_INDX_REF: tmp->execDROP_INDX_REF(signal, ptr); break; case GSN_DROP_INDX_CONF: tmp->execDROP_INDX_CONF(signal, ptr); break; case GSN_CREATE_EVNT_REF: tmp->execCREATE_EVNT_REF(signal, ptr); break; case GSN_CREATE_EVNT_CONF: tmp->execCREATE_EVNT_CONF(signal, ptr); break; case GSN_SUB_START_CONF: tmp->execSUB_START_CONF(signal, ptr); break; case GSN_SUB_START_REF: tmp->execSUB_START_REF(signal, ptr); break; case GSN_SUB_TABLE_DATA: tmp->execSUB_TABLE_DATA(signal, ptr); break; case GSN_SUB_GCP_COMPLETE_REP: tmp->execSUB_GCP_COMPLETE_REP(signal, ptr); break; case GSN_SUB_STOP_CONF: tmp->execSUB_STOP_CONF(signal, ptr); break; case GSN_SUB_STOP_REF: tmp->execSUB_STOP_REF(signal, ptr); break; case GSN_DROP_EVNT_REF: tmp->execDROP_EVNT_REF(signal, ptr); break; case GSN_DROP_EVNT_CONF: tmp->execDROP_EVNT_CONF(signal, ptr); break; case GSN_LIST_TABLES_CONF: tmp->execLIST_TABLES_CONF(signal, ptr); break; default: abort(); }}voidNdbDictInterface::execNodeStatus(void* dictImpl, Uint32 aNode, bool alive, bool nfCompleted){ NdbDictInterface * tmp = (NdbDictInterface*)dictImpl; if(!alive && !nfCompleted){ return; } if (!alive && nfCompleted){ tmp->m_waiter.nodeFail(aNode); }}intNdbDictInterface::dictSignal(NdbApiSignal* signal, LinearSectionPtr ptr[3],int noLSP, const int useMasterNodeId, const Uint32 RETRIES, const WaitSignalType wst, const int theWait, const int *errcodes, const int noerrcodes, const int temporaryMask){ DBUG_ENTER("NdbDictInterface::dictSignal"); DBUG_PRINT("enter", ("useMasterNodeId: %d", useMasterNodeId)); for(Uint32 i = 0; i<RETRIES; i++){ //if (useMasterNodeId == 0) m_buffer.clear(); // Protected area m_transporter->lock_mutex(); Uint32 aNodeId; if (useMasterNodeId) { if ((m_masterNodeId == 0) || (!m_transporter->get_node_alive(m_masterNodeId))) { m_masterNodeId = m_transporter->get_an_alive_node(); }//if aNodeId = m_masterNodeId; } else { aNodeId = m_transporter->get_an_alive_node(); } if(aNodeId == 0){ m_error.code= 4009; m_transporter->unlock_mutex(); DBUG_RETURN(-1); } { int r; if (ptr) {#ifdef EVENT_DEBUG printf("Long signal %d ptr", noLSP); for (int q=0;q<noLSP;q++) { printf(" sz %d", ptr[q].sz); } printf("\n");#endif r = m_transporter->sendFragmentedSignal(signal, aNodeId, ptr, noLSP); } else {#ifdef EVENT_DEBUG printf("Short signal\n");#endif r = m_transporter->sendSignal(signal, aNodeId); } if(r != 0){ m_transporter->unlock_mutex(); continue; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -