DbtupUndoLog.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:11k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #define DBTUP_C
  14. #include "Dbtup.hpp"
  15. #include <RefConvert.hpp>
  16. #include <ndb_limits.h>
  17. #include <pc.hpp>
  18. #define ljam() { jamLine(12000 + __LINE__); }
  19. #define ljamEntry() { jamEntryLine(12000 + __LINE__); }
  20. void Dbtup::cprAddData(Signal* signal,
  21.                        Fragrecord* const regFragPtr,
  22.                        Uint32 pageIndex,
  23.                        Uint32 noOfWords,
  24.                        Uint32 startOffset)
  25. {
  26.   UndoPagePtr undoPagePtr;
  27.   PagePtr pagePtr;
  28.   LocalLogInfoPtr regLliPtr;
  29.   regLliPtr.i = regFragPtr->checkpointVersion;
  30.   ptrCheckGuard(regLliPtr, cnoOfParallellUndoFiles, localLogInfo);
  31.   pagePtr.i = pageIndex;
  32.   ptrCheckGuard(pagePtr, cnoOfPage, page);
  33.   undoPagePtr.i = regLliPtr.p->lliUndoPage;
  34.   ptrCheckGuard(undoPagePtr, cnoOfUndoPage, undoPage);
  35.   startOffset++;
  36.   noOfWords--;
  37.   if ((regLliPtr.p->lliUndoWord + noOfWords) < ZWORDS_ON_PAGE) {
  38.     ljam();
  39.     MEMCOPY_NO_WORDS(&undoPagePtr.p->undoPageWord[regLliPtr.p->lliUndoWord],
  40.                      &pagePtr.p->pageWord[startOffset],
  41.                      noOfWords);
  42.     regLliPtr.p->lliUndoWord += noOfWords;
  43.   } else {
  44.     for (Uint32 i = 0; i < noOfWords; i++) {
  45.       ljam();
  46.       Uint32 undoWord = pagePtr.p->pageWord[startOffset + i];
  47.       cprAddUndoLogWord(signal, regLliPtr.p, undoWord);
  48.     }//for
  49.   }//if
  50. }//Dbtup::cprAddData()
  51. void Dbtup::cprAddLogHeader(Signal* signal,
  52.                             LocalLogInfo* const lliPtr,
  53.                             Uint32 recordType,
  54.                             Uint32 tableId,
  55.                             Uint32 fragId)
  56. {
  57.   Uint32 prevRecId = lliPtr->lliPrevRecordId;
  58.   lliPtr->lliPrevRecordId = lliPtr->lliUndoWord + (lliPtr->lliLogFilePage << ZUNDO_RECORD_ID_PAGE_INDEX);
  59.   cprAddUndoLogWord(signal, lliPtr, recordType);
  60.   cprAddUndoLogWord(signal, lliPtr, prevRecId);
  61.   cprAddUndoLogWord(signal, lliPtr, tableId);
  62.   cprAddUndoLogWord(signal, lliPtr, fragId);
  63. }//Dbtup::cprAddLogHeader()
  64. void Dbtup::cprAddGCIUpdate(Signal* signal,
  65.                             Uint32 prevGCI,
  66.                             Fragrecord* const regFragPtr)
  67. {
  68.   LocalLogInfoPtr regLliPtr;
  69.   regLliPtr.i = regFragPtr->checkpointVersion;
  70.   ptrCheckGuard(regLliPtr, cnoOfParallellUndoFiles, localLogInfo);
  71.   cprAddUndoLogWord(signal, regLliPtr.p, prevGCI);
  72. }//Dbtup::cprAddLogHeader()
  73. void Dbtup::cprAddUndoLogPageHeader(Signal* signal,
  74.                                     Page* const regPagePtr,
  75.                                     Fragrecord* const regFragPtr)
  76. {
  77.   UndoPagePtr regUndoPagePtr;
  78.   LocalLogInfoPtr regLliPtr;
  79.   regLliPtr.i = regFragPtr->checkpointVersion;
  80.   ptrCheckGuard(regLliPtr, cnoOfParallellUndoFiles, localLogInfo);
  81.   Uint32 prevRecId = regLliPtr.p->lliPrevRecordId;
  82.   Uint32 lliWord = regLliPtr.p->lliUndoWord;
  83.   regLliPtr.p->lliPrevRecordId = lliWord +
  84.                                  (regLliPtr.p->lliLogFilePage << ZUNDO_RECORD_ID_PAGE_INDEX);
  85.   if ((lliWord + 7) < ZWORDS_ON_PAGE) {
  86.     ljam();
  87.     regUndoPagePtr.i = regLliPtr.p->lliUndoPage;
  88.     ptrCheckGuard(regUndoPagePtr, cnoOfUndoPage, undoPage);
  89.     regUndoPagePtr.p->undoPageWord[lliWord] = ZLCPR_UNDO_LOG_PAGE_HEADER;
  90.     regUndoPagePtr.p->undoPageWord[lliWord + 1] = prevRecId;
  91.     regUndoPagePtr.p->undoPageWord[lliWord + 2] = regFragPtr->fragTableId;
  92.     regUndoPagePtr.p->undoPageWord[lliWord + 3] = regFragPtr->fragmentId;
  93.     regUndoPagePtr.p->undoPageWord[lliWord + 4] = regPagePtr->pageWord[ZPAGE_FRAG_PAGE_ID_POS];
  94.     regUndoPagePtr.p->undoPageWord[lliWord + 5] = regPagePtr->pageWord[ZPAGE_STATE_POS];
  95.     regUndoPagePtr.p->undoPageWord[lliWord + 6] = regPagePtr->pageWord[ZPAGE_NEXT_POS];
  96.     regLliPtr.p->lliUndoWord = lliWord + 7;
  97.   } else {
  98.     ljam();
  99.     cprAddUndoLogWord(signal, regLliPtr.p, ZLCPR_UNDO_LOG_PAGE_HEADER);
  100.     cprAddUndoLogWord(signal, regLliPtr.p, prevRecId);
  101.     cprAddUndoLogWord(signal, regLliPtr.p, regFragPtr->fragTableId);
  102.     cprAddUndoLogWord(signal, regLliPtr.p, regFragPtr->fragmentId);
  103.     cprAddUndoLogWord(signal, regLliPtr.p, regPagePtr->pageWord[ZPAGE_FRAG_PAGE_ID_POS]);
  104.     cprAddUndoLogWord(signal, regLliPtr.p, regPagePtr->pageWord[ZPAGE_STATE_POS]);
  105.     cprAddUndoLogWord(signal, regLliPtr.p, regPagePtr->pageWord[ZPAGE_NEXT_POS]);
  106.   }//if
  107. }//Dbtup::cprAddUndoLogPageHeader()
  108. void Dbtup::cprAddUndoLogRecord(Signal* signal,
  109.                                 Uint32 recordType,
  110.                                 Uint32 pageId,
  111.                                 Uint32 pageIndex,
  112.                                 Uint32 tableId,
  113.                                 Uint32 fragId,
  114.                                 Uint32 localLogIndex)
  115. {
  116.   LocalLogInfoPtr regLliPtr;
  117.   UndoPagePtr regUndoPagePtr;
  118.   regLliPtr.i = localLogIndex;
  119.   ptrCheckGuard(regLliPtr, cnoOfParallellUndoFiles, localLogInfo);
  120.   Uint32 prevRecId = regLliPtr.p->lliPrevRecordId;
  121.   Uint32 lliWord = regLliPtr.p->lliUndoWord;
  122.   regLliPtr.p->lliPrevRecordId = lliWord +
  123.                                  (regLliPtr.p->lliLogFilePage << ZUNDO_RECORD_ID_PAGE_INDEX);
  124.   if ((lliWord + 6) < ZWORDS_ON_PAGE) {
  125.     ljam();
  126.     regUndoPagePtr.i = regLliPtr.p->lliUndoPage;
  127.     ptrCheckGuard(regUndoPagePtr, cnoOfUndoPage, undoPage);
  128.     regUndoPagePtr.p->undoPageWord[lliWord] = recordType;
  129.     regUndoPagePtr.p->undoPageWord[lliWord + 1] = prevRecId;
  130.     regUndoPagePtr.p->undoPageWord[lliWord + 2] = tableId;
  131.     regUndoPagePtr.p->undoPageWord[lliWord + 3] = fragId;
  132.     regUndoPagePtr.p->undoPageWord[lliWord + 4] = pageId;
  133.     regUndoPagePtr.p->undoPageWord[lliWord + 5] = pageIndex;
  134.     regLliPtr.p->lliUndoWord = lliWord + 6;
  135.   } else {
  136.     ljam();
  137.     cprAddUndoLogWord(signal, regLliPtr.p, recordType);
  138.     cprAddUndoLogWord(signal, regLliPtr.p, prevRecId);
  139.     cprAddUndoLogWord(signal, regLliPtr.p, tableId);
  140.     cprAddUndoLogWord(signal, regLliPtr.p, fragId);
  141.     cprAddUndoLogWord(signal, regLliPtr.p, pageId);
  142.     cprAddUndoLogWord(signal, regLliPtr.p, pageIndex);
  143.   }//if
  144. }//Dbtup::cprAddUndoLogRecord()
  145. void Dbtup::cprAddAbortUpdate(Signal* signal,
  146.                               LocalLogInfo* const lliPtr,
  147.                               Operationrec* const regOperPtr) 
  148. {
  149.   Uint32 lliWord = lliPtr->lliUndoWord;
  150.   if ((lliWord + 4) < ZWORDS_ON_PAGE) {
  151.     ljam();
  152.     UndoPagePtr regUndoPagePtr;
  153.     regUndoPagePtr.i = lliPtr->lliUndoPage;
  154.     ptrCheckGuard(regUndoPagePtr, cnoOfUndoPage, undoPage);
  155.     regUndoPagePtr.p->undoPageWord[lliWord] = regOperPtr->fragPageId;
  156.     regUndoPagePtr.p->undoPageWord[lliWord + 1] = regOperPtr->pageIndex;
  157.     regUndoPagePtr.p->undoPageWord[lliWord + 2] = regOperPtr->fragPageIdC;
  158.     regUndoPagePtr.p->undoPageWord[lliWord + 3] = regOperPtr->pageIndexC;
  159.     lliPtr->lliUndoWord = lliWord + 4;
  160.   } else {
  161.     ljam();
  162.     cprAddUndoLogWord(signal, lliPtr, regOperPtr->fragPageId);
  163.     cprAddUndoLogWord(signal, lliPtr, regOperPtr->pageIndex);
  164.     cprAddUndoLogWord(signal, lliPtr, regOperPtr->fragPageIdC);
  165.     cprAddUndoLogWord(signal, lliPtr, regOperPtr->pageIndexC);
  166.   }//if
  167. }//Dbtup::cprAddAbortUpdate()
  168. void Dbtup::cprAddUndoLogWord(Signal* signal, LocalLogInfo* const lliPtr, Uint32 undoWord) 
  169. {
  170.   DiskBufferSegmentInfoPtr dbsiPtr;
  171.   UndoPagePtr regUndoPagePtr;
  172.   ljam();
  173.   regUndoPagePtr.i = lliPtr->lliUndoPage;
  174.   ptrCheckGuard(regUndoPagePtr, cnoOfUndoPage, undoPage);
  175.   ndbrequire(lliPtr->lliUndoWord < ZWORDS_ON_PAGE);
  176.   regUndoPagePtr.p->undoPageWord[lliPtr->lliUndoWord] = undoWord;
  177.   lliPtr->lliUndoWord++;
  178.   if (lliPtr->lliUndoWord == ZWORDS_ON_PAGE) {
  179.     ljam();
  180.     lliPtr->lliUndoWord = ZUNDO_PAGE_HEADER_SIZE;
  181.     lliPtr->lliUndoPage++;
  182.     if (clblPageCounter > 0) {
  183.       ljam();
  184.       clblPageCounter--;
  185.     }//if
  186.     dbsiPtr.i = lliPtr->lliUndoBufferSegmentP;
  187.     ptrCheckGuard(dbsiPtr, cnoOfConcurrentWriteOp, diskBufferSegmentInfo);
  188.     dbsiPtr.p->pdxNumDataPages++;
  189.     ndbrequire(dbsiPtr.p->pdxNumDataPages < 16);
  190.     lliPtr->lliLogFilePage++;
  191.     if (dbsiPtr.p->pdxNumDataPages == ZUB_SEGMENT_SIZE) {
  192.       ljam();
  193.       lcpWriteUndoSegment(signal, lliPtr, false);
  194.     }//if
  195.   }//if
  196. }//Dbtup::cprAddUndoLogWord()
  197. void Dbtup::lcpWriteUndoSegment(Signal* signal, LocalLogInfo* const lliPtr, bool flushFlag) 
  198. {
  199.   DiskBufferSegmentInfoPtr dbsiPtr;
  200.   dbsiPtr.i = lliPtr->lliUndoBufferSegmentP;
  201.   ptrCheckGuard(dbsiPtr, cnoOfConcurrentWriteOp, diskBufferSegmentInfo);
  202.   Uint32 flags = 1;
  203.   lliPtr->lliUndoPagesToDiskWithoutSynch += dbsiPtr.p->pdxNumDataPages;
  204.   if ((lliPtr->lliUndoPagesToDiskWithoutSynch > MAX_PAGES_WITHOUT_SYNCH) ||
  205.       (flushFlag)) {
  206.     ljam();
  207. /* ---------------------------------------------------------------- */
  208. // To avoid synching too big chunks at a time we synch after writing
  209. // a certain number of data pages. (e.g. 2 MBytes).
  210. /* ---------------------------------------------------------------- */
  211.     lliPtr->lliUndoPagesToDiskWithoutSynch = 0;
  212.     flags |= 0x10; //Set synch flag unconditionally
  213.   }//if
  214.   dbsiPtr.p->pdxOperation = CHECKPOINT_UNDO_WRITE;
  215.   signal->theData[0] = lliPtr->lliUndoFileHandle;
  216.   signal->theData[1] = cownref;
  217.   signal->theData[2] = dbsiPtr.i;
  218.   signal->theData[3] = flags;
  219.   signal->theData[4] = ZBASE_ADDR_UNDO_WORD;
  220.   signal->theData[5] = dbsiPtr.p->pdxNumDataPages;
  221.   signal->theData[6] = dbsiPtr.p->pdxDataPage[0];
  222.   signal->theData[7] = dbsiPtr.p->pdxFilePage;
  223.   sendSignal(NDBFS_REF, GSN_FSWRITEREQ, signal, 8, JBA);
  224.   DiskBufferSegmentInfoPtr newDbsiPtr;
  225.   UndoPagePtr newUndoPagePtr;
  226.   seizeUndoBufferSegment(signal, newUndoPagePtr);
  227.   seizeDiskBufferSegmentRecord(newDbsiPtr);
  228.   newDbsiPtr.p->pdxBuffertype = UNDO_PAGES;
  229.   for (Uint32 i = 0; i < ZUB_SEGMENT_SIZE; i++) {
  230.     newDbsiPtr.p->pdxDataPage[i] = newUndoPagePtr.i + i;
  231.   }//for
  232.   newDbsiPtr.p->pdxFilePage = lliPtr->lliLogFilePage;
  233.   lliPtr->lliUndoPage = newUndoPagePtr.i;
  234.   lliPtr->lliUndoBufferSegmentP = newDbsiPtr.i;
  235. }//Dbtup::lcpWriteUndoSegment()
  236. void Dbtup::seizeUndoBufferSegment(Signal* signal, UndoPagePtr& regUndoPagePtr)
  237. {
  238.   if (cnoFreeUndoSeg == ZMIN_PAGE_LIMIT_TUP_COMMITREQ) {
  239.     EXECUTE_DIRECT(DBLQH, GSN_TUP_COM_BLOCK, signal, 1);
  240.     ljamEntry();
  241.   }//if
  242.   cnoFreeUndoSeg--;
  243.   ndbrequire(cnoFreeUndoSeg >= 0);
  244.   ndbrequire(cfirstfreeUndoSeg != RNIL);
  245.   regUndoPagePtr.i = cfirstfreeUndoSeg;
  246.   ptrCheckGuard(regUndoPagePtr, cnoOfUndoPage, undoPage);
  247.   cfirstfreeUndoSeg = regUndoPagePtr.p->undoPageWord[ZPAGE_NEXT_POS];
  248.   regUndoPagePtr.p->undoPageWord[ZPAGE_NEXT_POS] = RNIL;
  249. }//Dbtup::seizeUndoBufferSegment()