📄 dbtuxmeta.cpp
字号:
jam(); errorCode = TuxAddAttrRef::InvalidNodeSize; break; } tree.m_minOccup = tree.m_maxOccup - maxSlack; // root node does not exist (also set by ctor) tree.m_root = NullTupLoc;#ifdef VM_TRACE if (debugFlags & DebugMeta) { if (fragOpPtr.p->m_fragNo == 0) { debugOut << "Index id=" << indexPtr.i; debugOut << " nodeSize=" << tree.m_nodeSize; debugOut << " headSize=" << NodeHeadSize; debugOut << " prefSize=" << tree.m_prefSize; debugOut << " entrySize=" << TreeEntSize; debugOut << " minOccup=" << tree.m_minOccup; debugOut << " maxOccup=" << tree.m_maxOccup; debugOut << endl; } }#endif // fragment is defined#ifdef VM_TRACE if (debugFlags & DebugMeta) { debugOut << "Release frag op " << fragOpPtr.i << " " << *fragOpPtr.p << endl; }#endif c_fragOpPool.release(fragOpPtr); } // success TuxAddAttrConf* conf = (TuxAddAttrConf*)signal->getDataPtrSend(); conf->userPtr = fragOpPtr.p->m_userPtr; conf->lastAttr = lastAttr; sendSignal(fragOpPtr.p->m_userRef, GSN_TUX_ADD_ATTRCONF, signal, TuxAddAttrConf::SignalLength, JBB); return; } while (0); // error TuxAddAttrRef* ref = (TuxAddAttrRef*)signal->getDataPtrSend(); ref->userPtr = fragOpPtr.p->m_userPtr; ref->errorCode = errorCode; sendSignal(fragOpPtr.p->m_userRef, GSN_TUX_ADD_ATTRREF, signal, TuxAddAttrRef::SignalLength, JBB);#ifdef VM_TRACE if (debugFlags & DebugMeta) { debugOut << "Release on attr error frag op " << fragOpPtr.i << " " << *fragOpPtr.p << endl; }#endif c_fragOpPool.release(fragOpPtr); // let DICT drop the unfinished index}/* * LQH aborts on-going create index operation. */voidDbtux::abortAddFragOp(Signal* signal){ FragOpPtr fragOpPtr; IndexPtr indexPtr; c_fragOpPool.getPtr(fragOpPtr, signal->theData[1]); c_indexPool.getPtr(indexPtr, fragOpPtr.p->m_indexId);#ifdef VM_TRACE if (debugFlags & DebugMeta) { debugOut << "Release on abort frag op " << fragOpPtr.i << " " << *fragOpPtr.p << endl; }#endif c_fragOpPool.release(fragOpPtr); // let DICT drop the unfinished index}/* * Set index online. Currently at system restart this arrives before * build and is therefore not correct. */voidDbtux::execALTER_INDX_REQ(Signal* signal){ jamEntry(); const AlterIndxReq reqCopy = *(const AlterIndxReq*)signal->getDataPtr(); const AlterIndxReq* const req = &reqCopy; // set index online after build IndexPtr indexPtr; c_indexPool.getPtr(indexPtr, req->getIndexId()); indexPtr.p->m_state = Index::Online;#ifdef VM_TRACE if (debugFlags & DebugMeta) { debugOut << "Online index " << indexPtr.i << " " << *indexPtr.p << endl; }#endif // success AlterIndxConf* const conf = (AlterIndxConf*)signal->getDataPtrSend(); conf->setUserRef(reference()); conf->setConnectionPtr(req->getConnectionPtr()); conf->setRequestType(req->getRequestType()); conf->setTableId(req->getTableId()); conf->setIndexId(req->getIndexId()); conf->setIndexVersion(req->getIndexVersion()); sendSignal(req->getUserRef(), GSN_ALTER_INDX_CONF, signal, AlterIndxConf::SignalLength, JBB);}/* * Drop index. * * Uses same DROP_TAB_REQ signal as normal tables. */voidDbtux::execDROP_TAB_REQ(Signal* signal){ jamEntry(); const DropTabReq reqCopy = *(const DropTabReq*)signal->getDataPtr(); const DropTabReq* const req = &reqCopy; IndexPtr indexPtr; Uint32 tableId = req->tableId; Uint32 senderRef = req->senderRef; Uint32 senderData = req->senderData; if (tableId >= c_indexPool.getSize()) { jam(); // reply to sender DropTabConf* const conf = (DropTabConf*)signal->getDataPtrSend(); conf->senderRef = reference(); conf->senderData = senderData; conf->tableId = tableId; sendSignal(senderRef, GSN_DROP_TAB_CONF, signal, DropTabConf::SignalLength, JBB); return; } c_indexPool.getPtr(indexPtr, req->tableId); // drop works regardless of index state#ifdef VM_TRACE if (debugFlags & DebugMeta) { debugOut << "Drop index " << indexPtr.i << " " << *indexPtr.p << endl; }#endif ndbrequire(req->senderRef != 0); dropIndex(signal, indexPtr, req->senderRef, req->senderData);}voidDbtux::dropIndex(Signal* signal, IndexPtr indexPtr, Uint32 senderRef, Uint32 senderData){ jam(); indexPtr.p->m_state = Index::Dropping; // drop fragments while (indexPtr.p->m_numFrags > 0) { jam(); Uint32 i = --indexPtr.p->m_numFrags; FragPtr fragPtr; c_fragPool.getPtr(fragPtr, indexPtr.p->m_fragPtrI[i]); c_fragPool.release(fragPtr); } // drop attributes if (indexPtr.p->m_descPage != RNIL) { jam(); freeDescEnt(indexPtr); indexPtr.p->m_descPage = RNIL; } if (senderRef != 0) { jam(); // reply to sender DropTabConf* const conf = (DropTabConf*)signal->getDataPtrSend(); conf->senderRef = reference(); conf->senderData = senderData; conf->tableId = indexPtr.i; sendSignal(senderRef, GSN_DROP_TAB_CONF, signal, DropTabConf::SignalLength, JBB); } new (indexPtr.p) Index();}/* * Subroutines. */boolDbtux::allocDescEnt(IndexPtr indexPtr){ jam(); const unsigned size = DescHeadSize + indexPtr.p->m_numAttrs * DescAttrSize; DescPagePtr pagePtr; pagePtr.i = c_descPageList; while (pagePtr.i != RNIL) { jam(); c_descPagePool.getPtr(pagePtr); if (pagePtr.p->m_numFree >= size) { jam(); break; } pagePtr.i = pagePtr.p->m_nextPage; } if (pagePtr.i == RNIL) { jam(); if (! c_descPagePool.seize(pagePtr)) { jam(); return false; } new (pagePtr.p) DescPage(); // add in front of list pagePtr.p->m_nextPage = c_descPageList; c_descPageList = pagePtr.i; pagePtr.p->m_numFree = DescPageSize; } ndbrequire(pagePtr.p->m_numFree >= size); indexPtr.p->m_descPage = pagePtr.i; indexPtr.p->m_descOff = DescPageSize - pagePtr.p->m_numFree; pagePtr.p->m_numFree -= size; DescEnt& descEnt = getDescEnt(indexPtr.p->m_descPage, indexPtr.p->m_descOff); descEnt.m_descHead.m_indexId = indexPtr.i; descEnt.m_descHead.pad1 = 0; return true;}voidDbtux::freeDescEnt(IndexPtr indexPtr){ DescPagePtr pagePtr; c_descPagePool.getPtr(pagePtr, indexPtr.p->m_descPage); Uint32* const data = pagePtr.p->m_data; const unsigned size = DescHeadSize + indexPtr.p->m_numAttrs * DescAttrSize; unsigned off = indexPtr.p->m_descOff; // move the gap to the free area at the top while (off + size < DescPageSize - pagePtr.p->m_numFree) { jam(); // next entry to move over the gap DescEnt& descEnt2 = *(DescEnt*)&data[off + size]; Uint32 indexId2 = descEnt2.m_descHead.m_indexId; Index& index2 = *c_indexPool.getPtr(indexId2); unsigned size2 = DescHeadSize + index2.m_numAttrs * DescAttrSize; ndbrequire( index2.m_descPage == pagePtr.i && index2.m_descOff == off + size); // move the entry (overlapping copy if size < size2) unsigned i; for (i = 0; i < size2; i++) { jam(); data[off + i] = data[off + size + i]; } off += size2; // adjust page offset in index and all fragments index2.m_descOff -= size; for (i = 0; i < index2.m_numFrags; i++) { jam(); Frag& frag2 = *c_fragPool.getPtr(index2.m_fragPtrI[i]); frag2.m_descOff -= size; ndbrequire( frag2.m_descPage == index2.m_descPage && frag2.m_descOff == index2.m_descOff); } } ndbrequire(off + size == DescPageSize - pagePtr.p->m_numFree); pagePtr.p->m_numFree += size;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -