📄 dbtupfixalloc.cpp
字号:
regPagePtr->pageWord[ZFREELIST_HEADER_POS] = (startOfList << 16) + endOfList;}//Dbtup::convertThPage()void Dbtup::getEmptyPageTh(Fragrecord* const regFragPtr, Signal* signal, Page* const regPagePtr) { if (isUndoLoggingNeeded(regFragPtr, regPagePtr->pageWord[ZPAGE_FRAG_PAGE_ID_POS])) { cprAddUndoLogPageHeader(signal, regPagePtr, regFragPtr); }//if regPagePtr->pageWord[ZPAGE_NEXT_POS] = regFragPtr->thFreeFirst; regPagePtr->pageWord[ZPAGE_STATE_POS] = ZTH_MM_FREE; regFragPtr->thFreeFirst = regPagePtr->pageWord[ZPAGE_FRAG_PAGE_ID_POS];ndbrequire(regFragPtr->thFreeFirst != (RNIL -1));}//Dbtup::getEmptyPageTh()void Dbtup::getEmptyPageThCopy(Fragrecord* const regFragPtr, Signal* signal, Page* const regPagePtr) { if (isUndoLoggingNeeded(regFragPtr, regPagePtr->pageWord[ZPAGE_FRAG_PAGE_ID_POS])) { cprAddUndoLogPageHeader(signal, regPagePtr, regFragPtr); }//if regPagePtr->pageWord[ZPAGE_NEXT_POS] = regFragPtr->thFreeCopyFirst; regPagePtr->pageWord[ZPAGE_STATE_POS] = ZTH_MM_FREE_COPY; regFragPtr->thFreeCopyFirst = regPagePtr->pageWord[ZPAGE_FRAG_PAGE_ID_POS]; regFragPtr->noCopyPagesAlloc++;}//Dbtup::getEmptyPageThCopy()void Dbtup::getThAtPage(Fragrecord* const regFragPtr, Page* const regPagePtr, Signal* signal, Uint32& pageOffset) { Uint32 freeListHeader = regPagePtr->pageWord[ZFREELIST_HEADER_POS]; Uint32 startTuple = freeListHeader >> 16; Uint32 endTuple = freeListHeader & 0xffff; pageOffset = startTuple; /* START IS THE ONE ALLOCATED */ if (startTuple > 0) { if (startTuple != endTuple) {/* ---------------------------------------------------------------- *//* NOT THE LAST, SIMPLY RESHUFFLE POINTERS. *//* ---------------------------------------------------------------- */ ndbrequire(startTuple < ZWORDS_ON_PAGE); startTuple = regPagePtr->pageWord[startTuple] & 0xffff; regPagePtr->pageWord[ZFREELIST_HEADER_POS] = endTuple + (startTuple << 16); return; } else {/* ---------------------------------------------------------------- *//* THIS WAS THE LAST TUPLE HEADER IN THIS PAGE. REMOVE IT FROM*//* THE TUPLE HEADER FREE LIST OR TH COPY FREE LIST. ALSO SET *//* A PROPER PAGE STATE. *//* *//* WE ALSO HAVE TO INSERT AN UNDO LOG ENTRY TO ENSURE PAGE *//* ARE MAINTAINED EVEN AFTER A SYSTEM CRASH. *//* ---------------------------------------------------------------- */ if (isUndoLoggingNeeded(regFragPtr, regPagePtr->pageWord[ZPAGE_FRAG_PAGE_ID_POS])) { cprAddUndoLogPageHeader(signal, regPagePtr, regFragPtr); }//if if (regPagePtr->pageWord[ZPAGE_STATE_POS] == ZTH_MM_FREE) { ljam(); regFragPtr->thFreeFirst = regPagePtr->pageWord[ZPAGE_NEXT_POS]; regPagePtr->pageWord[ZPAGE_STATE_POS] = ZTH_MM_FULL; } else if (regPagePtr->pageWord[ZPAGE_STATE_POS] == ZTH_MM_FREE_COPY) { ljam(); regFragPtr->thFreeCopyFirst = regPagePtr->pageWord[ZPAGE_NEXT_POS]; regPagePtr->pageWord[ZPAGE_STATE_POS] = ZTH_MM_FULL_COPY; } else { ndbrequire(false); }//if regPagePtr->pageWord[ZFREELIST_HEADER_POS] = 0; regPagePtr->pageWord[ZPAGE_NEXT_POS] = RNIL; }//if } else { ndbrequire(false); }//if return;}//Dbtup::getThAtPage()void Dbtup::getThAtPageSr(Page* const regPagePtr, Uint32& pageOffset) { Uint32 freeListHeader = regPagePtr->pageWord[ZFREELIST_HEADER_POS]; Uint32 startTuple = freeListHeader >> 16; Uint32 endTuple = freeListHeader & 0xffff; ndbrequire(startTuple > 0); pageOffset = startTuple; /* START IS THE ONE ALLOCATED */ if (startTuple == endTuple) { ljam();/* ---------------------------------------------------------------- *//* THIS WAS THE LAST TUPLE HEADER IN THIS PAGE. SINCE WE ARE *//* UNDOING PAGE UPDATES WE SHALL NOT DO ANYTHING ABOUT THE *//* PAGE HEADER. THIS IS DONE BY SEPARATE LOG RECORDS. *//* ---------------------------------------------------------------- */ regPagePtr->pageWord[ZFREELIST_HEADER_POS] = 0; } else { ljam();/* ---------------------------------------------------------------- *//* NOT THE LAST, SIMPLY RESHUFFLE POINTERS. *//* ---------------------------------------------------------------- */ ndbrequire(startTuple < ZWORDS_ON_PAGE); startTuple = regPagePtr->pageWord[startTuple] & 0xffff; /* GET NEXT POINTER */ regPagePtr->pageWord[ZFREELIST_HEADER_POS] = endTuple + (startTuple << 16); }//if}//Dbtup::getThAtPageSr()void Dbtup::freeTh(Fragrecord* const regFragPtr, Tablerec* const regTabPtr, Signal* signal, Page* const regPagePtr, Uint32 freePageOffset) { Uint32 startOfList = regPagePtr->pageWord[ZFREELIST_HEADER_POS] >> 16; Uint32 endOfList = regPagePtr->pageWord[ZFREELIST_HEADER_POS] & 0xffff;/* LINK THE NOW FREE TUPLE SPACE INTO BEGINNING OF FREE LIST OF OF THE PAGE *//* SET THE SIZE OF THE NEW FREE SPACE AND LINK TO THE OLD START OF FREELIST */ ndbrequire(freePageOffset < ZWORDS_ON_PAGE); regPagePtr->pageWord[freePageOffset] = (regTabPtr->tupheadsize << 16) + startOfList; if (endOfList == 0) { ljam(); ndbrequire(startOfList == 0);/* ---------------------------------------------------------------- *//* THE PAGE WAS PREVIOUSLY FULL, NO EMPTY SPACE AT ALL. *//* THIS ENTRY WILL THEN BE BOTH THE START AND THE END OF THE *//* LIST. IT WILL ALSO BE PUT ON THE PROPER FREE LIST. *//* *//* UPDATE OF NEXT POINTER AND PAGE STATE MUST BE LOGGED TO *//* THE UNDO LOG TO ENSURE THAT FREE LISTS ARE OK AFTER A *//* SYSTEM RESTART. *//* ---------------------------------------------------------------- */ if (isUndoLoggingNeeded(regFragPtr, regPagePtr->pageWord[ZPAGE_FRAG_PAGE_ID_POS])) { cprAddUndoLogPageHeader(signal, regPagePtr, regFragPtr); }//if regPagePtr->pageWord[ZFREELIST_HEADER_POS] = (freePageOffset << 16) + freePageOffset; if (regPagePtr->pageWord[ZPAGE_STATE_POS] == ZTH_MM_FULL) { ljam(); regPagePtr->pageWord[ZPAGE_NEXT_POS] = regFragPtr->thFreeFirst; regFragPtr->thFreeFirst = regPagePtr->pageWord[ZPAGE_FRAG_PAGE_ID_POS]; regPagePtr->pageWord[ZPAGE_STATE_POS] = ZTH_MM_FREE; } else { ndbrequire(regPagePtr->pageWord[ZPAGE_STATE_POS] == ZTH_MM_FULL_COPY); ljam(); regPagePtr->pageWord[ZPAGE_NEXT_POS] = regFragPtr->thFreeCopyFirst; regFragPtr->thFreeCopyFirst = regPagePtr->pageWord[ZPAGE_FRAG_PAGE_ID_POS]; regPagePtr->pageWord[ZPAGE_STATE_POS] = ZTH_MM_FREE_COPY; }//if } else { ljam(); regPagePtr->pageWord[ZFREELIST_HEADER_POS] = (freePageOffset << 16) + endOfList; }//if}//Dbtup::freeTh()void Dbtup::freeThSr(Tablerec* const regTabPtr, Page* const regPagePtr, Uint32 freePageOffset) {/* ------------------------------------------------------------------------ *//* LINK THE NOW FREE TUPLE SPACE INTO BEGINNING OF FREE LIST OF OF THE PAGE *//* SET THE SIZE OF THE NEW FREE SPACE AND LINK TO THE OLD START OF FREELIST *//* ------------------------------------------------------------------------ */ Uint32 startOfList = regPagePtr->pageWord[ZFREELIST_HEADER_POS] >> 16; Uint32 endOfList = regPagePtr->pageWord[ZFREELIST_HEADER_POS] & 0xffff; ndbrequire(freePageOffset < ZWORDS_ON_PAGE); regPagePtr->pageWord[freePageOffset] = (regTabPtr->tupheadsize << 16) + startOfList; if (endOfList == 0) { ljam(); ndbrequire(startOfList == 0);/* ---------------------------------------------------------------- *//* THE PAGE WAS PREVIOUSLY FULL, NO EMPTY SPACE AT ALL. *//* THIS ENTRY WILL THEN BE BOTH THE START AND THE END OF THE *//* LIST. IT WILL ALSO BE PUT ON THE PROPER FREE LIST. *//* ---------------------------------------------------------------- */ regPagePtr->pageWord[ZFREELIST_HEADER_POS] = (freePageOffset << 16) + freePageOffset; } else { ljam(); regPagePtr->pageWord[ZFREELIST_HEADER_POS] = (freePageOffset << 16) + endOfList; }//if}//Dbtup::freeThSr()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -