⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbtuplcp.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* Copyright (C) 2003 MySQL AB   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#define DBTUP_C#include "Dbtup.hpp"#include <RefConvert.hpp>#include <ndb_limits.h>#include <pc.hpp>#include <signaldata/FsConf.hpp>#include <signaldata/FsRef.hpp>#define ljam() { jamLine(10000 + __LINE__); }#define ljamEntry() { jamEntryLine(10000 + __LINE__); }/* ---------------------------------------------------------------- *//* ---------------------------------------------------------------- *//* -------------------- LOCAL CHECKPOINT MODULE ------------------- *//* ---------------------------------------------------------------- *//* ---------------------------------------------------------------- */void Dbtup::execTUP_PREPLCPREQ(Signal* signal) {  CheckpointInfoPtr ciPtr;  DiskBufferSegmentInfoPtr dbsiPtr;  FragrecordPtr regFragPtr;  LocalLogInfoPtr lliPtr;  TablerecPtr regTabPtr;  ljamEntry();  Uint32 userptr = signal->theData[0];  BlockReference userblockref = signal->theData[1];  regTabPtr.i = signal->theData[2];  ptrCheckGuard(regTabPtr, cnoOfTablerec, tablerec);  Uint32 fragId = signal->theData[3];  Uint32 checkpointNumber = signal->theData[4];  cundoFileVersion = signal->theData[5];  getFragmentrec(regFragPtr, fragId, regTabPtr.p);  ndbrequire(regTabPtr.i != RNIL);  seizeCheckpointInfoRecord(ciPtr);  lliPtr.i = (cundoFileVersion << 2) + (regTabPtr.i & 0x3);  ptrCheckGuard(lliPtr, cnoOfParallellUndoFiles, localLogInfo);  cnoOfDataPagesToDiskWithoutSynch = 0;  ciPtr.p->lcpDataFileHandle = RNIL;  ciPtr.p->lcpCheckpointVersion = checkpointNumber;  ciPtr.p->lcpLocalLogInfoP = lliPtr.i;  ciPtr.p->lcpFragmentP = regFragPtr.i;	/* SET THE FRAGMENT              */  ciPtr.p->lcpFragmentId = fragId;	/* SAVE THE FRAGMENT IDENTITY    */  ciPtr.p->lcpTabPtr = regTabPtr.i;	/* SET THE TABLE POINTER         */  ciPtr.p->lcpBlockref = userblockref;	/* SET THE BLOCK REFERENCE       */  ciPtr.p->lcpUserptr = userptr;	/* SET THE USERPOINTER           */   /***************************************************************/   /* OPEN THE UNDO FILE FOR WRITE                                */   /* UPON FSOPENCONF                                             */   /***************************************************************/  if (lliPtr.p->lliActiveLcp == 0) {                  /* IS THE UNDO LOG FILE OPEN?    */    PendingFileOpenInfoPtr undoPfoiPtr;    UndoPagePtr regUndoPagePtr;    ljam();    lliPtr.p->lliPrevRecordId = 0;    lliPtr.p->lliLogFilePage = 0;    lliPtr.p->lliUndoPagesToDiskWithoutSynch = 0;    lliPtr.p->lliUndoWord = ZUNDO_PAGE_HEADER_SIZE;    seizeUndoBufferSegment(signal, regUndoPagePtr);    seizeDiskBufferSegmentRecord(dbsiPtr);    dbsiPtr.p->pdxBuffertype = UNDO_PAGES;    for (Uint32 i = 0; i < ZUB_SEGMENT_SIZE; i++) {      dbsiPtr.p->pdxDataPage[i] = regUndoPagePtr.i + i;    }//for    dbsiPtr.p->pdxFilePage = lliPtr.p->lliLogFilePage;    lliPtr.p->lliUndoPage = regUndoPagePtr.i;    lliPtr.p->lliUndoBufferSegmentP = dbsiPtr.i;                                                /* F LEVEL NOT USED              */    Uint32 fileType = 1;	                /* VERSION                       */    fileType = (fileType << 8) | 2;	        /* .LOCLOG                       */    fileType = (fileType << 8) | 6;	        /* D6                            */    fileType = (fileType << 8) | 0xff;	        /* DON'T USE P DIRECTORY LEVEL   */    Uint32 fileFlag = 0x301;	                /* CREATE, WRITE ONLY, TRUNCATE  */    seizePendingFileOpenInfoRecord(undoPfoiPtr);    undoPfoiPtr.p->pfoOpenType = LCP_UNDO_FILE_WRITE;    undoPfoiPtr.p->pfoCheckpointInfoP = ciPtr.i;    signal->theData[0] = cownref;    signal->theData[1] = undoPfoiPtr.i;    signal->theData[2] = lliPtr.i;    signal->theData[3] = 0xFFFFFFFF;    signal->theData[4] = cundoFileVersion;    signal->theData[5] = fileType;    signal->theData[6] = fileFlag;    sendSignal(NDBFS_REF, GSN_FSOPENREQ, signal, 7, JBA);  }//if   /***************************************************************/   /* OPEN THE DATA FILE FOR WRITE                                */   /* THE FILE HANDLE WILL BE SET IN THE CHECKPOINT_INFO_RECORD   */   /* UPON FSOPENCONF                                             */   /***************************************************************/   /* OPEN THE DATA FILE IN THE FOLLOWING FORM              */   /* D5/DBTUP/T<TABID>/F<FRAGID>/S<CHECKPOINT_NUMBER>.DATA */  PendingFileOpenInfoPtr dataPfoiPtr;  Uint32 fileType = 1;	                /* VERSION                       */  fileType = (fileType << 8) | 0;	/* .DATA                         */  fileType = (fileType << 8) | 5;	/* D5                            */  fileType = (fileType << 8) | 0xff;	/* DON'T USE P DIRECTORY LEVEL   */  Uint32 fileFlag = 0x301;	        /* CREATE, WRITE ONLY, TRUNCATE  */  seizePendingFileOpenInfoRecord(dataPfoiPtr);	/* SEIZE A NEW FILE OPEN INFO    */  if (lliPtr.p->lliActiveLcp == 0) {    ljam();    dataPfoiPtr.p->pfoOpenType = LCP_DATA_FILE_WRITE_WITH_UNDO;  } else {    ljam();    dataPfoiPtr.p->pfoOpenType = LCP_DATA_FILE_WRITE;  }//if  dataPfoiPtr.p->pfoCheckpointInfoP = ciPtr.i;   /* LET'S OPEN THE DATA FILE FOR WRITE */   /* INCREASE NUMBER OF ACTIVE CHECKPOINTS */  lliPtr.p->lliActiveLcp = 1;  signal->theData[0] = cownref;  signal->theData[1] = dataPfoiPtr.i;  signal->theData[2] = ciPtr.p->lcpTabPtr;  signal->theData[3] = ciPtr.p->lcpFragmentId;  signal->theData[4] = ciPtr.p->lcpCheckpointVersion;  signal->theData[5] = fileType;  signal->theData[6] = fileFlag;  sendSignal(NDBFS_REF, GSN_FSOPENREQ, signal, 7, JBA);  return;}//Dbtup::execTUP_PREPLCPREQ()/* ---------------------------------------------------------------- *//* ------------------------ START CHECKPOINT  --------------------- *//* ---------------------------------------------------------------- */void Dbtup::execTUP_LCPREQ(Signal* signal) {  CheckpointInfoPtr ciPtr;  DiskBufferSegmentInfoPtr dbsiPtr;  FragrecordPtr regFragPtr;  LocalLogInfoPtr lliPtr;  ljamEntry();//  Uint32 userptr = signal->theData[0];//  BlockReference userblockref = signal->theData[1];  ciPtr.i = signal->theData[2];  ptrCheckGuard(ciPtr, cnoOfLcpRec, checkpointInfo);  regFragPtr.i = ciPtr.p->lcpFragmentP;  ptrCheckGuard(regFragPtr, cnoOfFragrec, fragrecord);/* ---------------------------------------------------------------- *//*       ASSIGNING A VALUE DIFFERENT FROM RNIL TO CHECKPOINT VERSION*//*       TRIGGERS THAT UNDO LOGGING WILL START FOR THIS FRAGMENT.   *//*       WE ASSIGN IT THE POINTER TO THE CHECKPOINT RECORD FOR      *//*       OPTIMISATION OF THE WRITING OF THE UNDO LOG.               *//* ---------------------------------------------------------------- */  regFragPtr.p->checkpointVersion = ciPtr.p->lcpLocalLogInfoP;	/* MARK START OF UNDO LOGGING */  regFragPtr.p->maxPageWrittenInCheckpoint = getNoOfPages(regFragPtr.p);  regFragPtr.p->minPageNotWrittenInCheckpoint = 0;  ndbrequire(getNoOfPages(regFragPtr.p) > 0);  allocDataBufferSegment(signal, dbsiPtr);  dbsiPtr.p->pdxNumDataPages =  0;  dbsiPtr.p->pdxFilePage = 1;  ciPtr.p->lcpDataBufferSegmentP = dbsiPtr.i;  dbsiPtr.p->pdxCheckpointInfoP = ciPtr.i;  ciPtr.p->lcpNoOfPages = getNoOfPages(regFragPtr.p);  ciPtr.p->lcpNoCopyPagesAlloc = regFragPtr.p->noCopyPagesAlloc;  ciPtr.p->lcpEmptyPrimPage = regFragPtr.p->emptyPrimPage;  ciPtr.p->lcpThFreeFirst = regFragPtr.p->thFreeFirst;  ciPtr.p->lcpThFreeCopyFirst = regFragPtr.p->thFreeCopyFirst;  lliPtr.i = ciPtr.p->lcpLocalLogInfoP;  ptrCheckGuard(lliPtr, cnoOfParallellUndoFiles, localLogInfo);/* ---------------------------------------------------------------- *//* --- PERFORM A COPY OF THE TABLE DESCRIPTOR FOR THIS FRAGMENT --- *//* ---------------------------------------------------------------- */  cprAddLogHeader(signal,                  lliPtr.p,                  ZTABLE_DESCRIPTOR,                  ciPtr.p->lcpTabPtr,                  ciPtr.p->lcpFragmentId);/* ---------------------------------------------------------------- *//*       CONTINUE WITH SAVING ACTIVE OPERATIONS AFTER A REAL-TIME   *//*       BREAK.                                                     *//* ---------------------------------------------------------------- */  ciPtr.p->lcpTmpOperPtr = regFragPtr.p->firstusedOprec;  lcpSaveCopyListLab(signal, ciPtr);  return;}//Dbtup::execTUP_LCPREQ()void Dbtup::allocDataBufferSegment(Signal* signal, DiskBufferSegmentInfoPtr& dbsiPtr) {  UndoPagePtr regUndoPagePtr;  seizeDiskBufferSegmentRecord(dbsiPtr);  dbsiPtr.p->pdxBuffertype = COMMON_AREA_PAGES;  ndbrequire(cfirstfreeUndoSeg != RNIL);  if (cnoFreeUndoSeg == ZMIN_PAGE_LIMIT_TUP_COMMITREQ) {    EXECUTE_DIRECT(DBLQH, GSN_TUP_COM_BLOCK, signal, 1);    ljamEntry();  }//if  cnoFreeUndoSeg--;  ndbrequire(cnoFreeUndoSeg >= 0);  regUndoPagePtr.i = cfirstfreeUndoSeg;  ptrCheckGuard(regUndoPagePtr, cnoOfUndoPage, undoPage);  cfirstfreeUndoSeg = regUndoPagePtr.p->undoPageWord[ZPAGE_NEXT_POS];  regUndoPagePtr.p->undoPageWord[ZPAGE_NEXT_POS] = RNIL;  for (Uint32 i = 0; i < ZUB_SEGMENT_SIZE; i++) {    dbsiPtr.p->pdxDataPage[i] = regUndoPagePtr.i + i;  }//for}//Dbtup::allocDataBufferSegment()/* ---------------------------------------------------------------- *//* --- PERFORM A COPY OF THE ACTIVE OPERATIONS FOR THIS FRAGMENT -- *//* ---------------------------------------------------------------- */void Dbtup::lcpSaveCopyListLab(Signal* signal, CheckpointInfoPtr ciPtr) {  FragrecordPtr regFragPtr;  LocalLogInfoPtr lliPtr;  OperationrecPtr regOpPtr;  regFragPtr.i = ciPtr.p->lcpFragmentP;  ptrCheckGuard(regFragPtr, cnoOfFragrec, fragrecord);  lliPtr.i = ciPtr.p->lcpLocalLogInfoP;  ptrCheckGuard(lliPtr, cnoOfParallellUndoFiles, localLogInfo);  regOpPtr.i = ciPtr.p->lcpTmpOperPtr;/* -------------------------------------------------------------------------------- *//* TRAVERSE THE ENTIRE BLOCK OF OPERATIONS. CHECK IF THERE ARE EXISTING COPYS OF    *//* TUPLES IN THE CHECKPOINTED FRAGMENT. SAVE THOSE IN A LIST IN THE FOLLOWING FORM: *//*                                                                                  *//*    SOURCE PAGE                                                                   *//*    SOURCE INDEX                                                                  *//*    COPY PAGE                                                                     *//*    COPY INDEX                                                                    *//* -------------------------------------------------------------------------------- */  Uint32 loopCount = 0;  while ((regOpPtr.i != RNIL) && (loopCount < 50)) {    ljam();    ptrCheckGuard(regOpPtr, cnoOfOprec, operationrec);    if (regOpPtr.p->realPageId != RNIL) {/* ---------------------------------------------------------------- */// We ensure that we have actually allocated the tuple header and// also found it. Otherwise we will fill the undo log with garbage./* ---------------------------------------------------------------- */      if (regOpPtr.p->optype == ZUPDATE || 	  (regOpPtr.p->optype == ZINSERT && regOpPtr.p->deleteInsertFlag)) {        ljam();        if (regOpPtr.p->realPageIdC != RNIL) {/* ---------------------------------------------------------------- */// We ensure that we have actually allocated the tuple header copy.// Otherwise we will fill the undo log with garbage./* ---------------------------------------------------------------- */          cprAddLogHeader(signal,                          lliPtr.p,                          ZLCPR_ABORT_UPDATE,                          ciPtr.p->lcpTabPtr,                          ciPtr.p->lcpFragmentId);          cprAddAbortUpdate(signal, lliPtr.p, regOpPtr.p);        }//if      } else if (regOpPtr.p->optype == ZINSERT) {        ljam();        cprAddUndoLogRecord(signal,                            ZLCPR_ABORT_INSERT,                            regOpPtr.p->fragPageId,                            regOpPtr.p->pageIndex,                            regOpPtr.p->tableRef,                            regOpPtr.p->fragId,                            regFragPtr.p->checkpointVersion);      } else {        ndbrequire(regOpPtr.p->optype == ZDELETE);        ljam();        cprAddUndoLogRecord(signal,                            ZINDICATE_NO_OP_ACTIVE,                            regOpPtr.p->fragPageId,                            regOpPtr.p->pageIndex,                            regOpPtr.p->tableRef,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -