📄 dbtuppagemap.cpp
字号:
regPRPtr.i = parentPtr; ptrCheckGuard(regPRPtr, cnoOfPageRangeRec, pageRange); continue; }//if ljam(); ndbrequire(regPRPtr.i == regFragPtr->rootPageRange); initFragRange(regFragPtr); return; } else { if (regPRPtr.p->type[indexPos] == ZNON_LEAF) { jam(); /* ---------------------------------------------------------------- */ // A non-leaf node, we must release everything below it before we // release this node. /* ---------------------------------------------------------------- */ regPRPtr.i = basePageId; ptrCheckGuard(regPRPtr, cnoOfPageRangeRec, pageRange); } else { jam(); ndbrequire(regPRPtr.p->type[indexPos] == ZLEAF); /* ---------------------------------------------------------------- */ /* PAGE_RANGE_PTR /= RNIL AND THE CURRENT POS IS NOT A CHLED. */ /*----------------------------------------------------------------- */ const Uint32 start = regPRPtr.p->startRange[indexPos]; const Uint32 stop = regPRPtr.p->endRange[indexPos]; ndbrequire(stop >= start); const Uint32 retNo = (stop - start + 1); returnCommonArea(basePageId, retNo); }//if }//if }//while}//Dbtup::releaseFragPages()void Dbtup::initializePageRange() { PageRangePtr regPTRPtr; for (regPTRPtr.i = 0; regPTRPtr.i < cnoOfPageRangeRec; regPTRPtr.i++) { ptrAss(regPTRPtr, pageRange); regPTRPtr.p->nextFree = regPTRPtr.i + 1; }//for regPTRPtr.i = cnoOfPageRangeRec - 1; ptrAss(regPTRPtr, pageRange); regPTRPtr.p->nextFree = RNIL; cfirstfreerange = 0; c_noOfFreePageRanges = cnoOfPageRangeRec;}//Dbtup::initializePageRange()void Dbtup::initFragRange(Fragrecord* const regFragPtr){ regFragPtr->emptyPrimPage = RNIL; regFragPtr->rootPageRange = RNIL; regFragPtr->currentPageRange = RNIL; regFragPtr->noOfPages = 0; regFragPtr->nextStartRange = 0;}//initFragRange()Uint32 Dbtup::allocFragPages(Fragrecord* const regFragPtr, Uint32 tafpNoAllocRequested) { Uint32 tafpPagesAllocated = 0; while (true) { Uint32 noOfPagesAllocated = 0; Uint32 noPagesToAllocate = tafpNoAllocRequested - tafpPagesAllocated; Uint32 retPageRef = RNIL; allocConsPages(noPagesToAllocate, noOfPagesAllocated, retPageRef); if (noOfPagesAllocated == 0) { ljam(); return tafpPagesAllocated; }//if/* ---------------------------------------------------------------- *//* IT IS NOW TIME TO PUT THE ALLOCATED AREA INTO THE PAGE *//* RANGE TABLE. *//* ---------------------------------------------------------------- */ Uint32 startRange = regFragPtr->nextStartRange; if (!insertPageRangeTab(regFragPtr, retPageRef, noOfPagesAllocated)) { ljam(); returnCommonArea(retPageRef, noOfPagesAllocated); return tafpPagesAllocated; }//if tafpPagesAllocated += noOfPagesAllocated; Uint32 loopLimit = retPageRef + noOfPagesAllocated; PagePtr loopPagePtr;/* ---------------------------------------------------------------- *//* SINCE A NUMBER OF PAGES WERE ALLOCATED FROM COMMON AREA *//* WITH SUCCESS IT IS NOW TIME TO CHANGE THE STATE OF *//* THOSE PAGES TO EMPTY_MM AND LINK THEM INTO THE EMPTY *//* PAGE LIST OF THE FRAGMENT. *//* ---------------------------------------------------------------- */ for (loopPagePtr.i = retPageRef; loopPagePtr.i < loopLimit; loopPagePtr.i++) { ljam(); ptrCheckGuard(loopPagePtr, cnoOfPage, page); loopPagePtr.p->pageWord[ZPAGE_STATE_POS] = ZEMPTY_MM; loopPagePtr.p->pageWord[ZPAGE_FRAG_PAGE_ID_POS] = startRange + (loopPagePtr.i - retPageRef); loopPagePtr.p->pageWord[ZPAGE_NEXT_POS] = loopPagePtr.p->pageWord[ZPAGE_FRAG_PAGE_ID_POS] + 1; }//for loopPagePtr.i = (retPageRef + noOfPagesAllocated) - 1; ptrCheckGuard(loopPagePtr, cnoOfPage, page); loopPagePtr.p->pageWord[ZPAGE_NEXT_POS] = regFragPtr->emptyPrimPage; regFragPtr->emptyPrimPage = startRange;/* ---------------------------------------------------------------- *//* WAS ENOUGH PAGES ALLOCATED OR ARE MORE NEEDED. *//* ---------------------------------------------------------------- */ if (tafpPagesAllocated < tafpNoAllocRequested) { ljam(); } else { ndbrequire(tafpPagesAllocated == tafpNoAllocRequested); ljam(); return tafpNoAllocRequested; }//if }//while}//Dbtup::allocFragPages()void Dbtup::allocMoreFragPages(Fragrecord* const regFragPtr) { Uint32 noAllocPages = regFragPtr->noOfPages >> 3; // 12.5% noAllocPages += regFragPtr->noOfPages >> 4; // 6.25% noAllocPages += 2;/* -----------------------------------------------------------------*/// We will grow by 18.75% plus two more additional pages to grow// a little bit quicker in the beginning./* -----------------------------------------------------------------*/ allocFragPages(regFragPtr, noAllocPages);}//Dbtup::allocMoreFragPages()Uint32 Dbtup::leafPageRangeFull(Fragrecord* const regFragPtr, PageRangePtr currPageRangePtr){/* ---------------------------------------------------------------- *//* THE COMPLEX CASE WHEN THE LEAF NODE IS FULL. GO UP THE TREE*//* TO FIND THE FIRST RECORD WITH A FREE ENTRY. ALLOCATE NEW *//* PAGE RANGE RECORDS THEN ALL THE WAY DOWN TO THE LEAF LEVEL *//* AGAIN. THE TREE SHOULD ALWAYS REMAIN BALANCED. *//* ---------------------------------------------------------------- */ PageRangePtr parentPageRangePtr; PageRangePtr foundPageRangePtr; parentPageRangePtr = currPageRangePtr; Uint32 tiprNoLevels = 1; while (true) { ljam(); parentPageRangePtr.i = parentPageRangePtr.p->parentPtr; if (parentPageRangePtr.i == RNIL) { ljam();/* ---------------------------------------------------------------- *//* WE HAVE REACHED THE ROOT. A NEW ROOT MUST BE ALLOCATED. *//* ---------------------------------------------------------------- */ if (c_noOfFreePageRanges < tiprNoLevels) { ljam(); return RNIL; }//if PageRangePtr oldRootPRPtr; PageRangePtr newRootPRPtr; oldRootPRPtr.i = regFragPtr->rootPageRange; ptrCheckGuard(oldRootPRPtr, cnoOfPageRangeRec, pageRange); seizePagerange(newRootPRPtr); regFragPtr->rootPageRange = newRootPRPtr.i; oldRootPRPtr.p->parentPtr = newRootPRPtr.i; newRootPRPtr.p->basePageId[0] = oldRootPRPtr.i; newRootPRPtr.p->parentPtr = RNIL; newRootPRPtr.p->startRange[0] = 0; newRootPRPtr.p->endRange[0] = regFragPtr->nextStartRange - 1; newRootPRPtr.p->type[0] = ZNON_LEAF; newRootPRPtr.p->startRange[1] = regFragPtr->nextStartRange; newRootPRPtr.p->endRange[1] = regFragPtr->nextStartRange - 1; newRootPRPtr.p->type[1] = ZNON_LEAF; newRootPRPtr.p->currentIndexPos = 1; foundPageRangePtr = newRootPRPtr; break; } else { ljam(); ptrCheckGuard(parentPageRangePtr, cnoOfPageRangeRec, pageRange); if (parentPageRangePtr.p->currentIndexPos < 3) { ljam();/* ---------------------------------------------------------------- *//* WE HAVE FOUND AN EMPTY ENTRY IN A PAGE RANGE RECORD. *//* ALLOCATE A NEW PAGE RANGE RECORD, FILL IN THE START RANGE, *//* ALLOCATE A NEW PAGE RANGE RECORD AND UPDATE THE POINTERS *//* ---------------------------------------------------------------- */ parentPageRangePtr.p->currentIndexPos++; parentPageRangePtr.p->startRange[parentPageRangePtr.p->currentIndexPos] = regFragPtr->nextStartRange; parentPageRangePtr.p->endRange[parentPageRangePtr.p->currentIndexPos] = regFragPtr->nextStartRange - 1; parentPageRangePtr.p->type[parentPageRangePtr.p->currentIndexPos] = ZNON_LEAF; foundPageRangePtr = parentPageRangePtr; break; } else { ljam(); ndbrequire(parentPageRangePtr.p->currentIndexPos == 3);/* ---------------------------------------------------------------- *//* THE PAGE RANGE RECORD WAS FULL. FIND THE PARENT RECORD *//* AND INCREASE THE NUMBER OF LEVELS WE HAVE TRAVERSED *//* GOING UP THE TREE. *//* ---------------------------------------------------------------- */ tiprNoLevels++; }//if }//if }//while/* ---------------------------------------------------------------- *//* REMEMBER THE ERROR LEVEL IN CASE OF ALLOCATION ERRORS *//* ---------------------------------------------------------------- */ PageRangePtr newPageRangePtr; PageRangePtr prevPageRangePtr; prevPageRangePtr = foundPageRangePtr; if (c_noOfFreePageRanges < tiprNoLevels) { ljam(); return RNIL; }//if/* ---------------------------------------------------------------- *//* NOW WE HAVE PERFORMED THE SEARCH UPWARDS AND FILLED IN THE *//* PROPER FIELDS IN THE PAGE RANGE RECORD WHERE SOME SPACE *//* WAS FOUND. THE NEXT STEP IS TO ALLOCATE PAGE RANGES SO *//* THAT WE KEEP THE B-TREE BALANCED. THE NEW PAGE RANGE *//* ARE ALSO PROPERLY UPDATED ON THE PATH TO THE LEAF LEVEL. *//* ---------------------------------------------------------------- */ while (true) { ljam(); seizePagerange(newPageRangePtr); tiprNoLevels--; ndbrequire(prevPageRangePtr.p->currentIndexPos < 4); prevPageRangePtr.p->basePageId[prevPageRangePtr.p->currentIndexPos] = newPageRangePtr.i; newPageRangePtr.p->parentPtr = prevPageRangePtr.i; newPageRangePtr.p->currentIndexPos = 0; if (tiprNoLevels > 0) { ljam(); newPageRangePtr.p->startRange[0] = regFragPtr->nextStartRange; newPageRangePtr.p->endRange[0] = regFragPtr->nextStartRange - 1; newPageRangePtr.p->type[0] = ZNON_LEAF; prevPageRangePtr = newPageRangePtr; } else { ljam(); break; }//if }//while return newPageRangePtr.i;}//Dbtup::leafPageRangeFull()void Dbtup::releasePagerange(PageRangePtr regPRPtr) { regPRPtr.p->nextFree = cfirstfreerange; cfirstfreerange = regPRPtr.i; c_noOfFreePageRanges++;}//Dbtup::releasePagerange()void Dbtup::seizePagerange(PageRangePtr& regPageRangePtr) { regPageRangePtr.i = cfirstfreerange; ptrCheckGuard(regPageRangePtr, cnoOfPageRangeRec, pageRange); cfirstfreerange = regPageRangePtr.p->nextFree; regPageRangePtr.p->nextFree = RNIL; regPageRangePtr.p->currentIndexPos = 0; regPageRangePtr.p->parentPtr = RNIL; for (Uint32 i = 0; i < 4; i++) { regPageRangePtr.p->startRange[i] = 1; regPageRangePtr.p->endRange[i] = 0; regPageRangePtr.p->type[i] = ZNON_LEAF; regPageRangePtr.p->basePageId[i] = (Uint32)-1; }//for c_noOfFreePageRanges--;}//Dbtup::seizePagerange()void Dbtup::errorHandler(Uint32 errorCode){ switch (errorCode) { case 0: ljam(); break; case 1: ljam(); break; case 2: ljam(); break; default: ljam(); } ndbrequire(false);}//Dbtup::errorHandler()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -