📄 dbdict.cpp
字号:
jam(); break; }//if initialiseTriggerRecord(triggerPtr); }//while}void Dbdict::initialiseTriggerRecord(TriggerRecordPtr triggerPtr){ triggerPtr.p->triggerState = TriggerRecord::TS_NOT_DEFINED; triggerPtr.p->triggerLocal = 0; memset(triggerPtr.p->triggerName, 0, sizeof(triggerPtr.p->triggerName)); triggerPtr.p->triggerId = RNIL; triggerPtr.p->tableId = RNIL; triggerPtr.p->triggerType = (TriggerType::Value)~0; triggerPtr.p->triggerActionTime = (TriggerActionTime::Value)~0; triggerPtr.p->triggerEvent = (TriggerEvent::Value)~0; triggerPtr.p->monitorReplicas = false; triggerPtr.p->monitorAllAttributes = false; triggerPtr.p->attributeMask.clear(); triggerPtr.p->indexId = RNIL;}Uint32 Dbdict::getFsConnRecord() { FsConnectRecordPtr fsPtr; c_fsConnectRecordPool.seize(fsPtr); ndbrequire(fsPtr.i != RNIL); fsPtr.p->filePtr = (Uint32)-1; fsPtr.p->ownerPtr = RNIL; fsPtr.p->fsState = FsConnectRecord::IDLE; return fsPtr.i;}//Dbdict::getFsConnRecord()Uint32 Dbdict::getFreeTableRecord(Uint32 primaryTableId) { Uint32 minId = (primaryTableId == RNIL ? 0 : primaryTableId + 1); TableRecordPtr tablePtr; TableRecordPtr firstTablePtr; bool firstFound = false; Uint32 tabSize = c_tableRecordPool.getSize(); for (tablePtr.i = minId; tablePtr.i < tabSize ; tablePtr.i++) { jam(); c_tableRecordPool.getPtr(tablePtr); if (tablePtr.p->tabState == TableRecord::NOT_DEFINED) { jam(); initialiseTableRecord(tablePtr); tablePtr.p->tabState = TableRecord::DEFINING; firstFound = true; firstTablePtr.i = tablePtr.i; firstTablePtr.p = tablePtr.p; break; }//if }//for if (!firstFound) { jam(); return RNIL; }//if#ifdef HAVE_TABLE_REORG bool secondFound = false; for (tablePtr.i = firstTablePtr.i + 1; tablePtr.i < tabSize ; tablePtr.i++) { jam(); c_tableRecordPool.getPtr(tablePtr); if (tablePtr.p->tabState == TableRecord::NOT_DEFINED) { jam(); initialiseTableRecord(tablePtr); tablePtr.p->tabState = TableRecord::REORG_TABLE_PREPARED; tablePtr.p->secondTable = firstTablePtr.i; firstTablePtr.p->secondTable = tablePtr.i; secondFound = true; break; }//if }//for if (!secondFound) { jam(); firstTablePtr.p->tabState = TableRecord::NOT_DEFINED; return RNIL; }//if#endif return firstTablePtr.i;}//Dbdict::getFreeTableRecord()Uint32 Dbdict::getFreeTriggerRecord(){ const Uint32 size = c_triggerRecordPool.getSize(); TriggerRecordPtr triggerPtr; for (triggerPtr.i = 0; triggerPtr.i < size; triggerPtr.i++) { jam(); c_triggerRecordPool.getPtr(triggerPtr); if (triggerPtr.p->triggerState == TriggerRecord::TS_NOT_DEFINED) { jam(); initialiseTriggerRecord(triggerPtr); return triggerPtr.i; } } return RNIL;}boolDbdict::getNewAttributeRecord(TableRecordPtr tablePtr, AttributeRecordPtr & attrPtr) { c_attributeRecordPool.seize(attrPtr); if(attrPtr.i == RNIL){ return false; } memset(attrPtr.p->attributeName, 0, sizeof(attrPtr.p->attributeName)); attrPtr.p->attributeDescriptor = 0x00012255; //Default value attrPtr.p->attributeId = ZNIL; attrPtr.p->nextAttrInTable = RNIL; attrPtr.p->tupleKey = 0; memset(attrPtr.p->defaultValue, 0, sizeof(attrPtr.p->defaultValue)); /* ---------------------------------------------------------------- */ // A free attribute record has been acquired. We will now link it // to the table record. /* ---------------------------------------------------------------- */ if (tablePtr.p->lastAttribute == RNIL) { jam(); tablePtr.p->firstAttribute = attrPtr.i; } else { jam(); AttributeRecordPtr lastAttrPtr; c_attributeRecordPool.getPtr(lastAttrPtr, tablePtr.p->lastAttribute); lastAttrPtr.p->nextAttrInTable = attrPtr.i; }//if tablePtr.p->lastAttribute = attrPtr.i; return true;}//Dbdict::getNewAttributeRecord()/* **************************************************************** *//* ---------------------------------------------------------------- *//* MODULE: START/RESTART HANDLING ------------------------ *//* ---------------------------------------------------------------- *//* *//* This module contains the code that is common for all *//* start/restart types. *//* ---------------------------------------------------------------- *//* **************************************************************** *//* ---------------------------------------------------------------- */// This is sent as the first signal during start/restart./* ---------------------------------------------------------------- */void Dbdict::execSTTOR(Signal* signal) { jamEntry(); c_startPhase = signal->theData[1]; switch (c_startPhase) { case 1: break; case 3: c_restartType = signal->theData[7]; /* valid if 3 */ ndbrequire(c_restartType == NodeState::ST_INITIAL_START || c_restartType == NodeState::ST_SYSTEM_RESTART || c_restartType == NodeState::ST_INITIAL_NODE_RESTART || c_restartType == NodeState::ST_NODE_RESTART); break; } sendSTTORRY(signal);}//execSTTOR()void Dbdict::sendSTTORRY(Signal* signal){ signal->theData[0] = 0; /* garbage SIGNAL KEY */ signal->theData[1] = 0; /* garbage SIGNAL VERSION NUMBER */ signal->theData[2] = 0; /* garbage */ signal->theData[3] = 1; /* first wanted start phase */ signal->theData[4] = 3; /* get type of start */ signal->theData[5] = ZNOMOREPHASES; sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 6, JBB);}/* ---------------------------------------------------------------- */// We receive information about sizes of records./* ---------------------------------------------------------------- */void Dbdict::execREAD_CONFIG_REQ(Signal* signal) { const ReadConfigReq * req = (ReadConfigReq*)signal->getDataPtr(); Uint32 ref = req->senderRef; Uint32 senderData = req->senderData; ndbrequire(req->noOfParameters == 0); jamEntry(); const ndb_mgm_configuration_iterator * p = theConfiguration.getOwnConfigIterator(); ndbrequire(p != 0); Uint32 attributesize, tablerecSize; ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_DICT_ATTRIBUTE,&attributesize)); ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_DICT_TABLE, &tablerecSize)); c_attributeRecordPool.setSize(attributesize); c_attributeRecordHash.setSize(64); c_fsConnectRecordPool.setSize(ZFS_CONNECT_SIZE); c_nodes.setSize(MAX_NODES); c_pageRecordArray.setSize(ZNUMBER_OF_PAGES); c_schemaPageRecordArray.setSize(2 * NDB_SF_MAX_PAGES); c_tableRecordPool.setSize(tablerecSize); c_tableRecordHash.setSize(tablerecSize); g_key_descriptor_pool.setSize(tablerecSize); c_triggerRecordPool.setSize(c_maxNoOfTriggers); c_triggerRecordHash.setSize(c_maxNoOfTriggers); c_opRecordPool.setSize(256); // XXX need config params c_opCreateTable.setSize(8); c_opDropTable.setSize(8); c_opCreateIndex.setSize(8); c_opDropIndex.setSize(8); c_opAlterIndex.setSize(8); c_opBuildIndex.setSize(8); c_opCreateTrigger.setSize(8); c_opDropTrigger.setSize(8); c_opAlterTrigger.setSize(8); c_dictLockPool.setSize(32); // Initialize schema file copies c_schemaFile[0].schemaPage = (SchemaFile*)c_schemaPageRecordArray.getPtr(0 * NDB_SF_MAX_PAGES); c_schemaFile[0].noOfPages = 0; c_schemaFile[1].schemaPage = (SchemaFile*)c_schemaPageRecordArray.getPtr(1 * NDB_SF_MAX_PAGES); c_schemaFile[1].noOfPages = 0; // Initialize BAT for interface to file system NewVARIABLE* bat = allocateBat(2); bat[0].WA = &c_schemaPageRecordArray.getPtr(0)->word[0]; bat[0].nrr = 2 * NDB_SF_MAX_PAGES; bat[0].ClusterSize = NDB_SF_PAGE_SIZE; bat[0].bits.q = NDB_SF_PAGE_SIZE_IN_WORDS_LOG2; bat[0].bits.v = 5; // 32 bits per element bat[1].WA = &c_pageRecordArray.getPtr(0)->word[0]; bat[1].nrr = ZNUMBER_OF_PAGES; bat[1].ClusterSize = ZSIZE_OF_PAGES_IN_WORDS * 4; bat[1].bits.q = ZLOG_SIZE_OF_PAGES_IN_WORDS; // 2**13 = 8192 elements bat[1].bits.v = 5; // 32 bits per element initCommonData(); initRecords(); ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtrSend(); conf->senderRef = reference(); conf->senderData = senderData; sendSignal(ref, GSN_READ_CONFIG_CONF, signal, ReadConfigConf::SignalLength, JBB);}//execSIZEALT_REP()/* ---------------------------------------------------------------- */// Start phase signals sent by CNTR. We reply with NDB_STTORRY when// we completed this phase./* ---------------------------------------------------------------- */void Dbdict::execNDB_STTOR(Signal* signal) { jamEntry(); c_startPhase = signal->theData[2]; const Uint32 restartType = signal->theData[3]; if (restartType == NodeState::ST_INITIAL_START) { jam(); c_initialStart = true; } else if (restartType == NodeState::ST_SYSTEM_RESTART) { jam(); c_systemRestart = true; } else if (restartType == NodeState::ST_INITIAL_NODE_RESTART) { jam(); c_initialNodeRestart = true; } else if (restartType == NodeState::ST_NODE_RESTART) { jam(); c_nodeRestart = true; } else { ndbrequire(false); }//if switch (c_startPhase) { case 1: jam(); initSchemaFile(signal); break; case 3: jam(); signal->theData[0] = reference(); sendSignal(NDBCNTR_REF, GSN_READ_NODESREQ, signal, 1, JBB); break; case 6: jam(); c_initialStart = false; c_systemRestart = false; c_initialNodeRestart = false; c_nodeRestart = false; sendNDB_STTORRY(signal); break; case 7: // uses c_restartType if(restartType == NodeState::ST_SYSTEM_RESTART && c_masterNodeId == getOwnNodeId()){ rebuildIndexes(signal, 0); return; } sendNDB_STTORRY(signal); break; default: jam(); sendNDB_STTORRY(signal); break; }//switch}//execNDB_STTOR()void Dbdict::sendNDB_STTORRY(Signal* signal) { signal->theData[0] = reference(); sendSignal(NDBCNTR_REF, GSN_NDB_STTORRY, signal, 1, JBB); return;}//sendNDB_STTORRY()/* ---------------------------------------------------------------- */// We receive the information about which nodes that are up and down./* ---------------------------------------------------------------- */void Dbdict::execREAD_NODESCONF(Signal* signal) { jamEntry(); ReadNodesConf * const readNodes = (ReadNodesConf *)&signal->theData[0]; c_numberNode = readNodes->noOfNodes; c_masterNodeId = readNodes->masterNodeId; c_noNodesFailed = 0; c_aliveNodes.clear(); for (unsigned i = 1; i < MAX_NDB_NODES; i++) { jam(); NodeRecordPtr nodePtr; c_nodes.getPtr(nodePtr, i); if (NodeBitmask::get(readNodes->allNodes, i)) { jam(); nodePtr.p->nodeState = NodeRecord::NDB_NODE_ALIVE; if (NodeBitmask::get(readNodes->inactiveNodes, i)) { jam(); /**------------------------------------------------------------------- * * THIS NODE IS DEFINED IN THE CLUSTER BUT IS NOT ALIVE CURRENTLY. * WE ADD THE NODE TO THE SET OF FAILED NODES AND ALSO SET THE * BLOCKSTATE TO BUSY TO AVOID ADDING TABLES WHILE NOT ALL NODES ARE * ALIVE. *------------------------------------------------------------------*/ nodePtr.p->nodeState = NodeRecord::NDB_NODE_DEAD; c_noNodesFailed++; } else { c_aliveNodes.set(i); } }//if }//for sendNDB_STTORRY(signal);}//execREAD_NODESCONF()/* ---------------------------------------------------------------- */// HOT_SPAREREP informs DBDICT about which nodes that have become// hot spare nodes./* ---------------------------------------------------------------- */void Dbdict::execHOT_SPAREREP(Signal* signal) { Uint32 hotSpareNodes = 0; jamEntry(); HotSpareRep * const hotSpare = (HotSpareRep*)&signal->theData[0]; for (unsigned i = 1; i < MAX_NDB_NODES; i++) { if (NodeBitmask::get(hotSpare->theHotSpareNodes, i)) { NodeRecordPtr nodePtr; c_nodes.getPtr(nodePtr, i); nodePtr.p->hotSpare = true; hotSpareNodes++; }//if }//for ndbrequire(hotSpareNodes == hotSpare->noHotSpareNodes); c_noHotSpareNodes = hotSpareNodes; return;}//execHOT_SPAREREP()void Dbdict::initSchemaFile(Signal* signal) { XSchemaFile * xsf = &c_schemaFile[c_schemaRecord.schemaPage != 0]; xs
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -