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

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. #include <AttributeDescriptor.hpp>
  19. #include "AttributeOffset.hpp"
  20. #include <AttributeHeader.hpp>
  21. #include <Interpreter.hpp>
  22. #include <signaldata/FsConf.hpp>
  23. #include <signaldata/FsRemoveReq.hpp>
  24. #include <signaldata/TupCommit.hpp>
  25. #include <signaldata/TupKey.hpp>
  26. #include <signaldata/DropTab.hpp>
  27. #define DEBUG(x) { ndbout << "TUP::" << x << endl; }
  28. #define ljam() { jamLine(24000 + __LINE__); }
  29. #define ljamEntry() { jamEntryLine(24000 + __LINE__); }
  30. void Dbtup::initData() 
  31. {
  32.   cnoOfAttrbufrec = ZNO_OF_ATTRBUFREC;
  33.   cnoOfLcpRec = ZNO_OF_LCP_REC;
  34.   cnoOfConcurrentOpenOp = ZNO_OF_CONCURRENT_OPEN_OP;
  35.   cnoOfConcurrentWriteOp = ZNO_OF_CONCURRENT_WRITE_OP;
  36.   cnoOfFragoprec = 2 * MAX_FRAG_PER_NODE;
  37.   cnoOfPageRangeRec = ZNO_OF_PAGE_RANGE_REC;
  38.   cnoOfParallellUndoFiles = ZNO_OF_PARALLELL_UNDO_FILES;
  39.   cnoOfRestartInfoRec = ZNO_OF_RESTART_INFO_REC;
  40.   c_maxTriggersPerTable = ZDEFAULT_MAX_NO_TRIGGERS_PER_TABLE;
  41.   c_noOfBuildIndexRec = 32;
  42.   attrbufrec = 0;
  43.   checkpointInfo = 0;
  44.   diskBufferSegmentInfo = 0;
  45.   fragoperrec = 0;
  46.   fragrecord = 0;
  47.   hostBuffer = 0;
  48.   localLogInfo = 0;
  49.   operationrec = 0;
  50.   page = 0;
  51.   pageRange = 0;
  52.   pendingFileOpenInfo = 0;
  53.   restartInfoRecord = 0;
  54.   tablerec = 0;
  55.   tableDescriptor = 0;
  56.   undoPage = 0;
  57.   totNoOfPagesAllocated = 0;
  58.   cnoOfAllocatedPages = 0;
  59.   
  60.   // Records with constant sizes
  61. }//Dbtup::initData()
  62. Dbtup::Dbtup(const class Configuration & conf)
  63.   : SimulatedBlock(DBTUP, conf),
  64.   c_storedProcPool(),
  65.   c_buildIndexList(c_buildIndexPool)
  66. {
  67.   Uint32 log_page_size= 0;
  68.   BLOCK_CONSTRUCTOR(Dbtup);
  69.   const ndb_mgm_configuration_iterator * p = conf.getOwnConfigIterator();
  70.   ndbrequire(p != 0);
  71.   ndb_mgm_get_int_parameter(p, CFG_DB_UNDO_DATA_BUFFER,  
  72.     &log_page_size);
  73.   /**
  74.    * Always set page size in half MBytes
  75.    */
  76.   cnoOfUndoPage= (log_page_size / sizeof(UndoPage));
  77.   Uint32 mega_byte_part= cnoOfUndoPage & 15;
  78.   if (mega_byte_part != 0) {
  79.     jam();
  80.     cnoOfUndoPage+= (16 - mega_byte_part);
  81.   }
  82.   addRecSignal(GSN_DEBUG_SIG, &Dbtup::execDEBUG_SIG);
  83.   addRecSignal(GSN_CONTINUEB, &Dbtup::execCONTINUEB);
  84.   addRecSignal(GSN_DUMP_STATE_ORD, &Dbtup::execDUMP_STATE_ORD);
  85.   addRecSignal(GSN_SEND_PACKED, &Dbtup::execSEND_PACKED);
  86.   addRecSignal(GSN_ATTRINFO, &Dbtup::execATTRINFO);
  87.   addRecSignal(GSN_STTOR, &Dbtup::execSTTOR);
  88.   addRecSignal(GSN_TUP_LCPREQ, &Dbtup::execTUP_LCPREQ);
  89.   addRecSignal(GSN_END_LCPREQ, &Dbtup::execEND_LCPREQ);
  90.   addRecSignal(GSN_START_RECREQ, &Dbtup::execSTART_RECREQ);
  91.   addRecSignal(GSN_MEMCHECKREQ, &Dbtup::execMEMCHECKREQ);
  92.   addRecSignal(GSN_TUPKEYREQ, &Dbtup::execTUPKEYREQ);
  93.   addRecSignal(GSN_TUPSEIZEREQ, &Dbtup::execTUPSEIZEREQ);
  94.   addRecSignal(GSN_TUPRELEASEREQ, &Dbtup::execTUPRELEASEREQ);
  95.   addRecSignal(GSN_STORED_PROCREQ, &Dbtup::execSTORED_PROCREQ);
  96.   addRecSignal(GSN_TUPFRAGREQ, &Dbtup::execTUPFRAGREQ);
  97.   addRecSignal(GSN_TUP_ADD_ATTRREQ, &Dbtup::execTUP_ADD_ATTRREQ);
  98.   addRecSignal(GSN_TUP_COMMITREQ, &Dbtup::execTUP_COMMITREQ);
  99.   addRecSignal(GSN_TUP_ABORTREQ, &Dbtup::execTUP_ABORTREQ);
  100.   addRecSignal(GSN_TUP_SRREQ, &Dbtup::execTUP_SRREQ);
  101.   addRecSignal(GSN_TUP_PREPLCPREQ, &Dbtup::execTUP_PREPLCPREQ);
  102.   addRecSignal(GSN_FSOPENCONF, &Dbtup::execFSOPENCONF);
  103.   addRecSignal(GSN_FSCLOSECONF, &Dbtup::execFSCLOSECONF);
  104.   addRecSignal(GSN_FSWRITECONF, &Dbtup::execFSWRITECONF);
  105.   addRecSignal(GSN_FSREADCONF, &Dbtup::execFSREADCONF);
  106.   addRecSignal(GSN_NDB_STTOR, &Dbtup::execNDB_STTOR);
  107.   addRecSignal(GSN_READ_CONFIG_REQ, &Dbtup::execREAD_CONFIG_REQ, true);
  108.   addRecSignal(GSN_SET_VAR_REQ,  &Dbtup::execSET_VAR_REQ);
  109.   // Trigger Signals
  110.   addRecSignal(GSN_CREATE_TRIG_REQ, &Dbtup::execCREATE_TRIG_REQ);
  111.   addRecSignal(GSN_DROP_TRIG_REQ,  &Dbtup::execDROP_TRIG_REQ);
  112.   addRecSignal(GSN_DROP_TAB_REQ, &Dbtup::execDROP_TAB_REQ);
  113.   addRecSignal(GSN_FSREMOVECONF, &Dbtup::execFSREMOVECONF);
  114.   addRecSignal(GSN_TUP_ALLOCREQ, &Dbtup::execTUP_ALLOCREQ);
  115.   addRecSignal(GSN_TUP_DEALLOCREQ, &Dbtup::execTUP_DEALLOCREQ);
  116.   addRecSignal(GSN_TUP_WRITELOG_REQ, &Dbtup::execTUP_WRITELOG_REQ);
  117.   // Ordered index related
  118.   addRecSignal(GSN_BUILDINDXREQ, &Dbtup::execBUILDINDXREQ);
  119.   initData();
  120. }//Dbtup::Dbtup()
  121. Dbtup::~Dbtup() 
  122. {
  123.   // Records with dynamic sizes
  124.   deallocRecord((void **)&attrbufrec,"Attrbufrec", 
  125. sizeof(Attrbufrec), 
  126. cnoOfAttrbufrec);
  127.   
  128.   deallocRecord((void **)&checkpointInfo,"CheckpointInfo",
  129. sizeof(CheckpointInfo), 
  130. cnoOfLcpRec);
  131.   
  132.   deallocRecord((void **)&diskBufferSegmentInfo,
  133. "DiskBufferSegmentInfo",
  134. sizeof(DiskBufferSegmentInfo), 
  135. cnoOfConcurrentWriteOp);
  136.   
  137.   deallocRecord((void **)&fragoperrec,"Fragoperrec",
  138. sizeof(Fragoperrec),
  139. cnoOfFragoprec);
  140.   
  141.   deallocRecord((void **)&fragrecord,"Fragrecord",
  142. sizeof(Fragrecord), 
  143. cnoOfFragrec);
  144.   
  145.   deallocRecord((void **)&hostBuffer,"HostBuffer",
  146. sizeof(HostBuffer), 
  147. MAX_NODES);
  148.   
  149.   deallocRecord((void **)&localLogInfo,"LocalLogInfo",
  150. sizeof(LocalLogInfo), 
  151. cnoOfParallellUndoFiles);
  152.   
  153.   deallocRecord((void **)&operationrec,"Operationrec",
  154. sizeof(Operationrec),
  155. cnoOfOprec);
  156.   deallocRecord((void **)&page,"Page", 
  157. sizeof(Page), 
  158. cnoOfPage);
  159.   
  160.   deallocRecord((void **)&pageRange,"PageRange",
  161. sizeof(PageRange), 
  162. cnoOfPageRangeRec);
  163.   deallocRecord((void **)&pendingFileOpenInfo,
  164. "PendingFileOpenInfo",
  165. sizeof(PendingFileOpenInfo), 
  166. cnoOfConcurrentOpenOp);
  167.   
  168.   deallocRecord((void **)&restartInfoRecord,
  169. "RestartInfoRecord",
  170. sizeof(RestartInfoRecord),
  171. cnoOfRestartInfoRec);
  172.   
  173.   deallocRecord((void **)&tablerec,"Tablerec",
  174. sizeof(Tablerec), 
  175. cnoOfTablerec);
  176.   
  177.   deallocRecord((void **)&tableDescriptor, "TableDescriptor",
  178. sizeof(TableDescriptor),
  179. cnoOfTabDescrRec);
  180.   
  181.   deallocRecord((void **)&undoPage,"UndoPage",
  182. sizeof(UndoPage),
  183. cnoOfUndoPage);
  184. }//Dbtup::~Dbtup()
  185. BLOCK_FUNCTIONS(Dbtup)
  186. /* **************************************************************** */
  187. /* ---------------------------------------------------------------- */
  188. /* ----- GENERAL SIGNAL MULTIPLEXER (FS + CONTINUEB) -------------- */
  189. /* ---------------------------------------------------------------- */
  190. /* **************************************************************** */
  191. void Dbtup::execFSCLOSECONF(Signal* signal) 
  192. {
  193.   PendingFileOpenInfoPtr pfoPtr;
  194.   ljamEntry();
  195.   pfoPtr.i = signal->theData[0];
  196.   ptrCheckGuard(pfoPtr, cnoOfConcurrentOpenOp, pendingFileOpenInfo);
  197.   switch (pfoPtr.p->pfoOpenType) {
  198.   case LCP_DATA_FILE_CLOSE:
  199.   {
  200.     CheckpointInfoPtr ciPtr;
  201.     ljam();
  202.     ciPtr.i = pfoPtr.p->pfoCheckpointInfoP;
  203.     ptrCheckGuard(ciPtr, cnoOfLcpRec, checkpointInfo);
  204.     ciPtr.p->lcpDataFileHandle = RNIL;
  205.     lcpClosedDataFileLab(signal, ciPtr);
  206.     break;
  207.   }
  208.   case LCP_UNDO_FILE_CLOSE:
  209.   {
  210.     LocalLogInfoPtr lliPtr;
  211.     ljam();
  212.     lliPtr.i = pfoPtr.p->pfoCheckpointInfoP;
  213.     ptrCheckGuard(lliPtr, cnoOfParallellUndoFiles, localLogInfo);
  214.     lliPtr.p->lliUndoFileHandle = RNIL;
  215.     lcpEndconfLab(signal);
  216.     break;
  217.   }
  218.   case LCP_UNDO_FILE_READ:
  219.     ljam();
  220.     endExecUndoLogLab(signal, pfoPtr.p->pfoCheckpointInfoP);
  221.     break;
  222.   case LCP_DATA_FILE_READ:
  223.     ljam();
  224.     rfrClosedDataFileLab(signal, pfoPtr.p->pfoCheckpointInfoP);
  225.     break;
  226.   default:
  227.     ndbrequire(false);
  228.     break;
  229.   }//switch
  230.   releasePendingFileOpenInfoRecord(pfoPtr);
  231. }//Dbtup::execFSCLOSECONF()
  232. void Dbtup::execFSOPENCONF(Signal* signal) 
  233. {
  234.   PendingFileOpenInfoPtr pfoPtr;
  235.   ljamEntry();
  236.   pfoPtr.i = signal->theData[0];
  237.   Uint32 fileHandle = signal->theData[1];
  238.   ptrCheckGuard(pfoPtr, cnoOfConcurrentOpenOp, pendingFileOpenInfo);
  239.   switch (pfoPtr.p->pfoOpenType) {
  240.   case LCP_DATA_FILE_READ:
  241.   {
  242.     RestartInfoRecordPtr riPtr;
  243.     ljam();
  244.     riPtr.i = pfoPtr.p->pfoRestartInfoP;
  245.     ptrCheckGuard(riPtr, cnoOfRestartInfoRec, restartInfoRecord);
  246.     riPtr.p->sriDataFileHandle = fileHandle;
  247.     rfrReadRestartInfoLab(signal, riPtr);
  248.     break;
  249.   }
  250.   case LCP_UNDO_FILE_READ:
  251.   {
  252.     RestartInfoRecordPtr riPtr;
  253.     LocalLogInfoPtr lliPtr;
  254.     DiskBufferSegmentInfoPtr dbsiPtr;
  255.     ljam();
  256.     riPtr.i = pfoPtr.p->pfoRestartInfoP;
  257.     ptrCheckGuard(riPtr, cnoOfRestartInfoRec, restartInfoRecord);
  258.     lliPtr.i = riPtr.p->sriLocalLogInfoP;
  259.     ptrCheckGuard(lliPtr, cnoOfParallellUndoFiles, localLogInfo);
  260.     lliPtr.p->lliUndoFileHandle = fileHandle;
  261.     dbsiPtr.i = riPtr.p->sriDataBufferSegmentP;
  262.     ptrCheckGuard(dbsiPtr, cnoOfConcurrentWriteOp, diskBufferSegmentInfo);
  263.     rfrLoadDataPagesLab(signal, riPtr, dbsiPtr);
  264.     break;
  265.   }
  266.   case LCP_DATA_FILE_WRITE_WITH_UNDO:
  267.   {
  268.     CheckpointInfoPtr ciPtr;
  269.     LocalLogInfoPtr lliPtr;
  270.     ljam();
  271.     ciPtr.i = pfoPtr.p->pfoCheckpointInfoP;
  272.     ptrCheckGuard(ciPtr, cnoOfLcpRec, checkpointInfo);
  273.     lliPtr.i = ciPtr.p->lcpLocalLogInfoP;
  274.     ptrCheckGuard(lliPtr, cnoOfParallellUndoFiles, localLogInfo);
  275.     ciPtr.p->lcpDataFileHandle = fileHandle;
  276.     if (lliPtr.p->lliUndoFileHandle != RNIL) {
  277.       ljam();
  278.       signal->theData[0] = ciPtr.p->lcpUserptr;
  279.       signal->theData[1] = ciPtr.i;
  280.       sendSignal(ciPtr.p->lcpBlockref, GSN_TUP_PREPLCPCONF, signal, 2, JBB);
  281.     }//if
  282.     break;
  283.   }
  284.   case LCP_DATA_FILE_WRITE:
  285.   {
  286.     CheckpointInfoPtr ciPtr;
  287.     ljam();
  288.     ciPtr.i = pfoPtr.p->pfoCheckpointInfoP;
  289.     ptrCheckGuard(ciPtr, cnoOfLcpRec, checkpointInfo);
  290.     ciPtr.p->lcpDataFileHandle = fileHandle;
  291.     signal->theData[0] = ciPtr.p->lcpUserptr;
  292.     signal->theData[1] = ciPtr.i;
  293.     sendSignal(ciPtr.p->lcpBlockref, GSN_TUP_PREPLCPCONF, signal, 2, JBB);
  294.     break;
  295.   }
  296.   case LCP_UNDO_FILE_WRITE:
  297.   {
  298.     CheckpointInfoPtr ciPtr;
  299.     LocalLogInfoPtr lliPtr;
  300.     ljam();
  301.     ciPtr.i = pfoPtr.p->pfoCheckpointInfoP;
  302.     ptrCheckGuard(ciPtr, cnoOfLcpRec, checkpointInfo);
  303.     lliPtr.i = ciPtr.p->lcpLocalLogInfoP;
  304.     ptrCheckGuard(lliPtr, cnoOfParallellUndoFiles, localLogInfo);
  305.     lliPtr.p->lliUndoFileHandle = fileHandle;
  306.     if (ciPtr.p->lcpDataFileHandle != RNIL) {
  307.       ljam();
  308.       signal->theData[0] = ciPtr.p->lcpUserptr;
  309.       signal->theData[1] = ciPtr.i;
  310.       sendSignal(ciPtr.p->lcpBlockref, GSN_TUP_PREPLCPCONF, signal, 2, JBB);
  311.     }//if
  312.     break;
  313.   }
  314.   default:
  315.     ndbrequire(false);
  316.     break;
  317.   }//switch
  318.   releasePendingFileOpenInfoRecord(pfoPtr);
  319. }//Dbtup::execFSOPENCONF()
  320. void Dbtup::execFSREADCONF(Signal* signal) 
  321. {
  322.   DiskBufferSegmentInfoPtr dbsiPtr;
  323.   ljamEntry();
  324.   dbsiPtr.i = signal->theData[0];
  325.   ptrCheckGuard(dbsiPtr, cnoOfConcurrentWriteOp, diskBufferSegmentInfo);
  326.   switch (dbsiPtr.p->pdxOperation) {
  327.   case CHECKPOINT_DATA_READ:
  328.   {
  329.     RestartInfoRecordPtr riPtr;
  330.     ljam();
  331.     riPtr.i = dbsiPtr.p->pdxRestartInfoP;
  332.     ptrCheckGuard(riPtr, cnoOfRestartInfoRec, restartInfoRecord);
  333. /************************************************************/
  334. /*       VERIFY THAT THE PAGES ARE CORRECT, HAVE A CORRECT  */
  335. /*       STATE AND A CORRECT PAGE ID.                       */
  336. /************************************************************/
  337.     ndbrequire(dbsiPtr.p->pdxNumDataPages <= 16);
  338.     for (Uint32 i = 0; i < dbsiPtr.p->pdxNumDataPages; i++) {
  339.       PagePtr pagePtr;
  340.       ljam();
  341.       pagePtr.i = dbsiPtr.p->pdxDataPage[i];
  342.       ptrCheckGuard(pagePtr, cnoOfPage, page);
  343.       ndbrequire(pagePtr.p->pageWord[ZPAGE_STATE_POS] != 0);
  344.       ndbrequire(pagePtr.p->pageWord[ZPAGE_STATE_POS] <= ZAC_MM_FREE_COPY);
  345.       ndbrequire(pagePtr.p->pageWord[ZPAGE_FRAG_PAGE_ID_POS] == ((dbsiPtr.p->pdxFilePage - 1) + i));
  346.     }//for
  347.     rfrLoadDataPagesLab(signal, riPtr, dbsiPtr);
  348.     break;
  349.   }
  350.   case CHECKPOINT_DATA_READ_PAGE_ZERO:
  351.   {
  352.     ljam();
  353.     rfrInitRestartInfoLab(signal, dbsiPtr);
  354.     break;
  355.   }
  356.   case CHECKPOINT_UNDO_READ:
  357.   {
  358.     LocalLogInfoPtr lliPtr;
  359.     ljam();
  360.     lliPtr.i = dbsiPtr.p->pdxCheckpointInfoP;
  361.     ptrCheckGuard(lliPtr, cnoOfParallellUndoFiles, localLogInfo);
  362.     xlcGetNextRecordLab(signal, dbsiPtr, lliPtr);
  363.     break;
  364.   }
  365.   case CHECKPOINT_UNDO_READ_FIRST:
  366.     ljam();
  367.     rfrReadSecondUndoLogLab(signal, dbsiPtr);
  368.     break;
  369.   default:
  370.     ndbrequire(false);
  371.     break;
  372.   }//switch
  373. }//Dbtup::execFSREADCONF()
  374. void Dbtup::execFSWRITECONF(Signal* signal) 
  375. {
  376.   DiskBufferSegmentInfoPtr dbsiPtr;
  377.   ljamEntry();
  378.   dbsiPtr.i = signal->theData[0];
  379.   ptrCheckGuard(dbsiPtr, cnoOfConcurrentWriteOp, diskBufferSegmentInfo);
  380.   switch (dbsiPtr.p->pdxOperation) {
  381.   case CHECKPOINT_DATA_WRITE:
  382.     ljam();
  383.     lcpSaveDataPageLab(signal, dbsiPtr.p->pdxCheckpointInfoP);
  384.     break;
  385.   case CHECKPOINT_DATA_WRITE_LAST:
  386.   {
  387.     CheckpointInfoPtr ciPtr;
  388.     ljam();
  389.     ciPtr.i = dbsiPtr.p->pdxCheckpointInfoP;
  390.     ptrCheckGuard(ciPtr, cnoOfLcpRec, checkpointInfo);
  391.     lcpFlushLogLab(signal, ciPtr);
  392.     break;
  393.   }
  394.   case CHECKPOINT_DATA_WRITE_FLUSH:
  395.   {
  396.     ljam();
  397.     Uint32 ciIndex = dbsiPtr.p->pdxCheckpointInfoP;
  398.     freeDiskBufferSegmentRecord(signal, dbsiPtr);
  399.     lcpCompletedLab(signal, ciIndex);
  400.     break;
  401.   }
  402.   case CHECKPOINT_UNDO_WRITE_FLUSH:
  403.   {
  404.     ljam();
  405.     Uint32 ciIndex = dbsiPtr.p->pdxCheckpointInfoP;
  406.     freeDiskBufferSegmentRecord(signal, dbsiPtr);
  407.     lcpFlushRestartInfoLab(signal, ciIndex);
  408.     break;
  409.   }
  410.   case CHECKPOINT_UNDO_WRITE:
  411.     ljam();
  412.     freeDiskBufferSegmentRecord(signal, dbsiPtr);
  413.     break;
  414.   default:
  415.     ndbrequire(false);
  416.     break;
  417.   }//switch
  418.   return;
  419. }//Dbtup::execFSWRITECONF()
  420. void Dbtup::execCONTINUEB(Signal* signal) 
  421. {
  422.   ljamEntry();
  423.   Uint32 actionType = signal->theData[0];
  424.   Uint32 dataPtr = signal->theData[1];
  425.   switch (actionType) {
  426.   case ZSTART_EXEC_UNDO_LOG:
  427.     ljam();
  428.     startExecUndoLogLab(signal, dataPtr);
  429.     break;
  430.   case ZCONT_SAVE_DP:
  431.     ljam();
  432.     lcpSaveDataPageLab(signal, dataPtr);
  433.     break;
  434.   case ZCONT_START_SAVE_CL:
  435.   {
  436.     CheckpointInfoPtr ciPtr;
  437.     ljam();
  438.     ciPtr.i = dataPtr;
  439.     ptrCheckGuard(ciPtr, cnoOfLcpRec, checkpointInfo);
  440.     lcpSaveCopyListLab(signal, ciPtr);
  441.     break;
  442.   }
  443.   case ZCONT_EXECUTE_LC:
  444.   {
  445.     LocalLogInfoPtr lliPtr;
  446.     DiskBufferSegmentInfoPtr dbsiPtr;
  447.     ljam();
  448.     lliPtr.i = dataPtr;
  449.     ptrCheckGuard(lliPtr, cnoOfParallellUndoFiles, localLogInfo);
  450.     dbsiPtr.i = lliPtr.p->lliUndoBufferSegmentP;
  451.     ptrCheckGuard(dbsiPtr, cnoOfConcurrentWriteOp, diskBufferSegmentInfo);
  452.     xlcGetNextRecordLab(signal, dbsiPtr, lliPtr);
  453.     break;
  454.   }
  455.   case ZCONT_LOAD_DP:
  456.   {
  457.     DiskBufferSegmentInfoPtr dbsiPtr;
  458.     RestartInfoRecordPtr riPtr;
  459.     ljam();
  460.     riPtr.i = dataPtr;
  461.     ptrCheckGuard(riPtr, cnoOfRestartInfoRec, restartInfoRecord);
  462.     dbsiPtr.i = riPtr.p->sriDataBufferSegmentP;
  463.     ptrCheckGuard(dbsiPtr, cnoOfConcurrentWriteOp, diskBufferSegmentInfo);
  464.     rfrLoadDataPagesLab(signal, riPtr, dbsiPtr);
  465.     break;
  466.   }
  467.   case ZLOAD_BAL_LCP_TIMER:
  468.     ljam();
  469.     clblPageCounter = clblPagesPerTick;
  470.     signal->theData[0] = ZLOAD_BAL_LCP_TIMER;
  471.     sendSignalWithDelay(cownref, GSN_CONTINUEB, signal, 400, 1);
  472.     break;
  473.   case ZINITIALISE_RECORDS:
  474.     ljam();
  475.     initialiseRecordsLab(signal, dataPtr, 
  476.  signal->theData[2], signal->theData[3]);
  477.     break;
  478.   case ZREL_FRAG:
  479.     ljam();
  480.     releaseFragment(signal, dataPtr);
  481.     break;
  482.   case ZREPORT_MEMORY_USAGE:{
  483.     ljam();
  484.     static int c_currentMemUsed = 0;
  485.     int now = (cnoOfAllocatedPages * 100)/cnoOfPage;
  486.     const int thresholds[] = { 100, 90, 80, 0 };
  487.     
  488.     Uint32 i = 0;
  489.     const Uint32 sz = sizeof(thresholds)/sizeof(thresholds[0]);
  490.     for(i = 0; i<sz; i++){
  491.       if(now >= thresholds[i]){
  492. now = thresholds[i];
  493. break;
  494.       }
  495.     }
  496.     if(now != c_currentMemUsed){
  497.       reportMemoryUsage(signal, now > c_currentMemUsed ? 1 : -1);
  498.       c_currentMemUsed = now;
  499.     }
  500.     signal->theData[0] = ZREPORT_MEMORY_USAGE;
  501.     sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 2000, 1);    
  502.     return;
  503.   }
  504.   case ZBUILD_INDEX:
  505.     ljam();
  506.     buildIndex(signal, dataPtr);
  507.     break;
  508.   default:
  509.     ndbrequire(false);
  510.     break;
  511.   }//switch
  512. }//Dbtup::execTUP_CONTINUEB()
  513. /* **************************************************************** */
  514. /* ---------------------------------------------------------------- */
  515. /* ------------------- SYSTEM RESTART MODULE ---------------------- */
  516. /* ---------------------------------------------------------------- */
  517. /* **************************************************************** */
  518. void Dbtup::execSTTOR(Signal* signal) 
  519. {
  520.   ljamEntry();
  521.   Uint32 startPhase = signal->theData[1];
  522.   Uint32 sigKey = signal->theData[6];
  523.   switch (startPhase) {
  524.   case ZSTARTPHASE1:
  525.     ljam();
  526.     CLEAR_ERROR_INSERT_VALUE;
  527.     cownref = calcTupBlockRef(0);
  528.     break;
  529.   default:
  530.     ljam();
  531.     break;
  532.   }//switch
  533.   signal->theData[0] = sigKey;
  534.   signal->theData[1] = 3;
  535.   signal->theData[2] = 2;
  536.   signal->theData[3] = ZSTARTPHASE1;
  537.   signal->theData[4] = 255;
  538.   sendSignal(NDBCNTR_REF, GSN_STTORRY, signal, 5, JBB);
  539.   return;
  540. }//Dbtup::execSTTOR()
  541. /************************************************************************************************/
  542. // SIZE_ALTREP INITIALIZE DATA STRUCTURES, FILES AND DS VARIABLES, GET READY FOR EXTERNAL 
  543. // CONNECTIONS.
  544. /************************************************************************************************/
  545. void Dbtup::execREAD_CONFIG_REQ(Signal* signal) 
  546. {
  547.   const ReadConfigReq * req = (ReadConfigReq*)signal->getDataPtr();
  548.   Uint32 ref = req->senderRef;
  549.   Uint32 senderData = req->senderData;
  550.   ndbrequire(req->noOfParameters == 0);
  551.   
  552.   ljamEntry();
  553.   const ndb_mgm_configuration_iterator * p = 
  554.     theConfiguration.getOwnConfigIterator();
  555.   ndbrequire(p != 0);
  556.   
  557.   ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_FRAG, &cnoOfFragrec));
  558.   ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_OP_RECS, &cnoOfOprec));
  559.   
  560.   ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_PAGE, &cnoOfPage));
  561.   Uint32 noOfTriggers= 0;
  562.   
  563.   Uint32 tmp= 0;
  564.   ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_PAGE_RANGE, &tmp));
  565.   initPageRangeSize(tmp);
  566.   ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_TABLE, &cnoOfTablerec));
  567.   ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_TABLE_DESC, 
  568. &cnoOfTabDescrRec));
  569.   Uint32 noOfStoredProc;
  570.   ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_TUP_STORED_PROC, 
  571. &noOfStoredProc));
  572.   ndbrequire(!ndb_mgm_get_int_parameter(p, CFG_DB_NO_TRIGGERS, 
  573. &noOfTriggers));
  574.   cnoOfTabDescrRec = (cnoOfTabDescrRec & 0xFFFFFFF0) + 16;
  575.   c_storedProcPool.setSize(noOfStoredProc);
  576.   c_buildIndexPool.setSize(c_noOfBuildIndexRec);
  577.   c_triggerPool.setSize(noOfTriggers);
  578.   initRecords();
  579.   czero = 0;
  580.   cminusOne = czero - 1;
  581.   clastBitMask = 1;
  582.   clastBitMask = clastBitMask << 31;
  583.   cnoOfLocalLogInfo = 0;
  584.   cnoFreeUndoSeg = 0;
  585.   initialiseRecordsLab(signal, 0, ref, senderData);
  586.   clblPagesPerTick = 50;
  587.   ndb_mgm_get_int_parameter(p, CFG_DB_LCP_DISC_PAGES_TUP_SR, 
  588.     &clblPagesPerTick);
  589.   clblPagesPerTickAfterSr = 50;
  590.   ndb_mgm_get_int_parameter(p, CFG_DB_LCP_DISC_PAGES_TUP, 
  591.     &clblPagesPerTickAfterSr);
  592. }//Dbtup::execSIZEALT_REP()
  593. void Dbtup::initRecords() 
  594. {
  595.   // Records with dynamic sizes
  596.   attrbufrec = (Attrbufrec*)allocRecord("Attrbufrec", 
  597. sizeof(Attrbufrec), 
  598. cnoOfAttrbufrec);
  599.   checkpointInfo = (CheckpointInfo*)allocRecord("CheckpointInfo",
  600. sizeof(CheckpointInfo), 
  601. cnoOfLcpRec);
  602.   diskBufferSegmentInfo = (DiskBufferSegmentInfo*)
  603.     allocRecord("DiskBufferSegmentInfo",
  604. sizeof(DiskBufferSegmentInfo), 
  605. cnoOfConcurrentWriteOp);
  606.   fragoperrec = (Fragoperrec*)allocRecord("Fragoperrec",
  607.   sizeof(Fragoperrec),
  608.   cnoOfFragoprec);
  609.   fragrecord = (Fragrecord*)allocRecord("Fragrecord",
  610. sizeof(Fragrecord), 
  611. cnoOfFragrec);
  612.   hostBuffer = (HostBuffer*)allocRecord("HostBuffer",
  613. sizeof(HostBuffer), 
  614. MAX_NODES);
  615.   localLogInfo = (LocalLogInfo*)allocRecord("LocalLogInfo",
  616.     sizeof(LocalLogInfo), 
  617.     cnoOfParallellUndoFiles);
  618.   operationrec = (Operationrec*)allocRecord("Operationrec",
  619.     sizeof(Operationrec),
  620.     cnoOfOprec);
  621.   page = (Page*)allocRecord("Page", 
  622.     sizeof(Page), 
  623.     cnoOfPage,
  624.     false);
  625.   
  626.   pageRange = (PageRange*)allocRecord("PageRange",
  627.       sizeof(PageRange), 
  628.       cnoOfPageRangeRec);
  629.   
  630.   pendingFileOpenInfo = (PendingFileOpenInfo*)
  631.     allocRecord("PendingFileOpenInfo",
  632. sizeof(PendingFileOpenInfo), 
  633. cnoOfConcurrentOpenOp);
  634.   
  635.   restartInfoRecord = (RestartInfoRecord*)
  636.     allocRecord("RestartInfoRecord",
  637. sizeof(RestartInfoRecord),
  638. cnoOfRestartInfoRec);
  639.   
  640.   tablerec = (Tablerec*)allocRecord("Tablerec",
  641.     sizeof(Tablerec), 
  642.     cnoOfTablerec);
  643.   
  644.   for(unsigned i = 0; i<cnoOfTablerec; i++) {
  645.     void * p = &tablerec[i];
  646.     new (p) Tablerec(c_triggerPool);
  647.   }
  648.   
  649.   tableDescriptor = (TableDescriptor*)
  650.     allocRecord("TableDescriptor",
  651. sizeof(TableDescriptor),
  652. cnoOfTabDescrRec);
  653.   
  654.   undoPage = (UndoPage*)allocRecord("UndoPage",
  655.     sizeof(UndoPage),
  656.     cnoOfUndoPage);
  657.   
  658.   
  659.   // Initialize BAT for interface to file system
  660.   NewVARIABLE* bat = allocateBat(3);
  661.   bat[1].WA = &page->pageWord[0];
  662.   bat[1].nrr = cnoOfPage;
  663.   bat[1].ClusterSize = sizeof(Page);
  664.   bat[1].bits.q = 13; /* 8192 words/page */
  665.   bat[1].bits.v = 5;
  666.   bat[2].WA = &undoPage->undoPageWord[0];
  667.   bat[2].nrr = cnoOfUndoPage;
  668.   bat[2].ClusterSize = sizeof(UndoPage);
  669.   bat[2].bits.q = 13; /* 8192 words/page */
  670.   bat[2].bits.v = 5;
  671. }//Dbtup::initRecords()
  672. void Dbtup::initialiseRecordsLab(Signal* signal, Uint32 switchData,
  673.  Uint32 retRef, Uint32 retData) 
  674. {
  675.   switch (switchData) {
  676.   case 0:
  677.     ljam();
  678.     initializeHostBuffer();
  679.     break;
  680.   case 1:
  681.     ljam();
  682.     initializeOperationrec();
  683.     break;
  684.   case 2:
  685.     ljam();
  686.     initializePage();
  687.     break;
  688.   case 3:
  689.     ljam();
  690.     initializeUndoPage();
  691.     break;
  692.   case 4:
  693.     ljam();
  694.     initializeTablerec();
  695.     break;
  696.   case 5:
  697.     ljam();
  698.     initializeCheckpointInfoRec();
  699.     break;
  700.   case 6:
  701.     ljam();
  702.     initializeFragrecord();
  703.     break;
  704.   case 7:
  705.     ljam();
  706.     initializeFragoperrec();
  707.     break;
  708.   case 8:
  709.     ljam();
  710.     initializePageRange();
  711.     break;
  712.   case 9:
  713.     ljam();
  714.     initializeTabDescr();
  715.     break;
  716.   case 10:
  717.     ljam();
  718.     initializeDiskBufferSegmentRecord();
  719.     break;
  720.   case 11:
  721.     ljam();
  722.     initializeLocalLogInfo();
  723.     break;
  724.   case 12:
  725.     ljam();
  726.     initializeAttrbufrec();
  727.     break;
  728.   case 13:
  729.     ljam();
  730.     initializePendingFileOpenInfoRecord();
  731.     break;
  732.   case 14:
  733.     ljam();
  734.     initializeRestartInfoRec();
  735.     {
  736.       ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtrSend();
  737.       conf->senderRef = reference();
  738.       conf->senderData = retData;
  739.       sendSignal(retRef, GSN_READ_CONFIG_CONF, signal, 
  740.  ReadConfigConf::SignalLength, JBB);
  741.     }
  742.     return;
  743.   default:
  744.     ndbrequire(false);
  745.     break;
  746.   }//switch
  747.   signal->theData[0] = ZINITIALISE_RECORDS;
  748.   signal->theData[1] = switchData + 1;
  749.   signal->theData[2] = retRef;
  750.   signal->theData[3] = retData;
  751.   sendSignal(reference(), GSN_CONTINUEB, signal, 4, JBB);
  752.   return;
  753. }//Dbtup::initialiseRecordsLab()
  754. void Dbtup::execNDB_STTOR(Signal* signal) 
  755. {
  756.   ljamEntry();
  757.   cndbcntrRef = signal->theData[0];
  758.   Uint32 ownNodeId = signal->theData[1];
  759.   Uint32 startPhase = signal->theData[2];
  760.   switch (startPhase) {
  761.   case ZSTARTPHASE1:
  762.     ljam();
  763.     cownNodeId = ownNodeId;
  764.     cownref = calcTupBlockRef(ownNodeId);
  765.     break;
  766.   case ZSTARTPHASE2:
  767.     ljam();
  768.     break;
  769.   case ZSTARTPHASE3:
  770.     ljam();
  771.     startphase3Lab(signal, ~0, ~0);
  772.     break;
  773.   case ZSTARTPHASE4:
  774.     ljam();
  775.     break;
  776.   case ZSTARTPHASE6:
  777.     ljam();
  778. /*****************************************/
  779. /*       NOW SET THE DISK WRITE SPEED TO */
  780. /*       PAGES PER TICK AFTER SYSTEM     */
  781. /*       RESTART.                        */
  782. /*****************************************/
  783.     clblPagesPerTick = clblPagesPerTickAfterSr;
  784.     signal->theData[0] = ZREPORT_MEMORY_USAGE;
  785.     sendSignalWithDelay(reference(), GSN_CONTINUEB, signal, 2000, 1);    
  786.     break;
  787.   default:
  788.     ljam();
  789.     break;
  790.   }//switch
  791.   signal->theData[0] = cownref;
  792.   sendSignal(cndbcntrRef, GSN_NDB_STTORRY, signal, 1, JBB);
  793. }//Dbtup::execNDB_STTOR()
  794. void Dbtup::startphase3Lab(Signal* signal, Uint32 config1, Uint32 config2) 
  795. {
  796.   clblPageCounter = clblPagesPerTick;
  797.   signal->theData[0] = ZLOAD_BAL_LCP_TIMER;
  798.   sendSignalWithDelay(cownref, GSN_CONTINUEB, signal, 100, 1);
  799. }//Dbtup::startphase3Lab()
  800. void Dbtup::initializeAttrbufrec() 
  801. {
  802.   AttrbufrecPtr attrBufPtr;
  803.   for (attrBufPtr.i = 0;
  804.        attrBufPtr.i < cnoOfAttrbufrec; attrBufPtr.i++) {
  805.     refresh_watch_dog();
  806.     ptrAss(attrBufPtr, attrbufrec);
  807.     attrBufPtr.p->attrbuf[ZBUF_NEXT] = attrBufPtr.i + 1;
  808.   }//for
  809.   attrBufPtr.i = cnoOfAttrbufrec - 1;
  810.   ptrAss(attrBufPtr, attrbufrec);
  811.   attrBufPtr.p->attrbuf[ZBUF_NEXT] = RNIL;
  812.   cfirstfreeAttrbufrec = 0;
  813.   cnoFreeAttrbufrec = cnoOfAttrbufrec;
  814. }//Dbtup::initializeAttrbufrec()
  815. void Dbtup::initializeCheckpointInfoRec() 
  816. {
  817.   CheckpointInfoPtr checkpointInfoPtr;
  818.   for (checkpointInfoPtr.i = 0;
  819.        checkpointInfoPtr.i < cnoOfLcpRec; checkpointInfoPtr.i++) {
  820.     ptrAss(checkpointInfoPtr, checkpointInfo);
  821.     checkpointInfoPtr.p->lcpNextRec = checkpointInfoPtr.i + 1;
  822.   }//for
  823.   checkpointInfoPtr.i = cnoOfLcpRec - 1;
  824.   ptrAss(checkpointInfoPtr, checkpointInfo);
  825.   checkpointInfoPtr.p->lcpNextRec = RNIL;
  826.   cfirstfreeLcp = 0;
  827. }//Dbtup::initializeCheckpointInfoRec()
  828. void Dbtup::initializeDiskBufferSegmentRecord() 
  829. {
  830.   DiskBufferSegmentInfoPtr diskBufferSegmentPtr;
  831.   for (diskBufferSegmentPtr.i = 0;
  832.        diskBufferSegmentPtr.i < cnoOfConcurrentWriteOp; diskBufferSegmentPtr.i++) {
  833.     ptrAss(diskBufferSegmentPtr, diskBufferSegmentInfo);
  834.     diskBufferSegmentPtr.p->pdxNextRec = diskBufferSegmentPtr.i + 1;
  835.     diskBufferSegmentPtr.p->pdxBuffertype = NOT_INITIALIZED;
  836.   }//for
  837.   diskBufferSegmentPtr.i = cnoOfConcurrentWriteOp - 1;
  838.   ptrAss(diskBufferSegmentPtr, diskBufferSegmentInfo);
  839.   diskBufferSegmentPtr.p->pdxNextRec = RNIL;
  840.   cfirstfreePdx = 0;
  841. }//Dbtup::initializeDiskBufferSegmentRecord()
  842. void Dbtup::initializeFragoperrec() 
  843. {
  844.   FragoperrecPtr fragoperPtr;
  845.   for (fragoperPtr.i = 0; fragoperPtr.i < cnoOfFragoprec; fragoperPtr.i++) {
  846.     ptrAss(fragoperPtr, fragoperrec);
  847.     fragoperPtr.p->nextFragoprec = fragoperPtr.i + 1;
  848.   }//for
  849.   fragoperPtr.i = cnoOfFragoprec - 1;
  850.   ptrAss(fragoperPtr, fragoperrec);
  851.   fragoperPtr.p->nextFragoprec = RNIL;
  852.   cfirstfreeFragopr = 0;
  853. }//Dbtup::initializeFragoperrec()
  854. void Dbtup::initializeFragrecord() 
  855. {
  856.   FragrecordPtr regFragPtr;
  857.   for (regFragPtr.i = 0; regFragPtr.i < cnoOfFragrec; regFragPtr.i++) {
  858.     refresh_watch_dog();
  859.     ptrAss(regFragPtr, fragrecord);
  860.     regFragPtr.p->nextfreefrag = regFragPtr.i + 1;
  861.     regFragPtr.p->checkpointVersion = RNIL;
  862.     regFragPtr.p->firstusedOprec = RNIL;
  863.     regFragPtr.p->lastusedOprec = RNIL;
  864.     regFragPtr.p->fragStatus = IDLE;
  865.   }//for
  866.   regFragPtr.i = cnoOfFragrec - 1;
  867.   ptrAss(regFragPtr, fragrecord);
  868.   regFragPtr.p->nextfreefrag = RNIL;
  869.   cfirstfreefrag = 0;
  870. }//Dbtup::initializeFragrecord()
  871. void Dbtup::initializeHostBuffer() 
  872. {
  873.   Uint32 hostId;
  874.   cpackedListIndex = 0;
  875.   for (hostId = 0; hostId < MAX_NODES; hostId++) {
  876.     hostBuffer[hostId].inPackedList = false;
  877.     hostBuffer[hostId].noOfPacketsTA = 0;
  878.     hostBuffer[hostId].packetLenTA = 0;
  879.   }//for
  880. }//Dbtup::initializeHostBuffer()
  881. void Dbtup::initializeLocalLogInfo() 
  882. {
  883.   LocalLogInfoPtr localLogInfoPtr;
  884.   for (localLogInfoPtr.i = 0;
  885.        localLogInfoPtr.i < cnoOfParallellUndoFiles; localLogInfoPtr.i++) {
  886.     ptrAss(localLogInfoPtr, localLogInfo);
  887.     localLogInfoPtr.p->lliActiveLcp = 0;
  888.     localLogInfoPtr.p->lliUndoFileHandle = RNIL;
  889.   }//for
  890. }//Dbtup::initializeLocalLogInfo()
  891. void Dbtup::initializeOperationrec() 
  892. {
  893.   OperationrecPtr regOpPtr;
  894.   for (regOpPtr.i = 0; regOpPtr.i < cnoOfOprec; regOpPtr.i++) {
  895.     refresh_watch_dog();
  896.     ptrAss(regOpPtr, operationrec);
  897.     regOpPtr.p->firstAttrinbufrec = RNIL;
  898.     regOpPtr.p->lastAttrinbufrec = RNIL;
  899.     regOpPtr.p->prevOprecInList = RNIL;
  900.     regOpPtr.p->nextOprecInList = regOpPtr.i + 1;
  901.     regOpPtr.p->optype = ZREAD;
  902.     regOpPtr.p->inFragList = ZFALSE;
  903.     regOpPtr.p->inActiveOpList = ZFALSE;
  904. /* FOR ABORT HANDLING BEFORE ANY SUCCESSFUL OPERATION */
  905.     regOpPtr.p->transstate = DISCONNECTED;
  906.     regOpPtr.p->storedProcedureId = ZNIL;
  907.     regOpPtr.p->prevActiveOp = RNIL;
  908.     regOpPtr.p->nextActiveOp = RNIL;
  909.     regOpPtr.p->tupVersion = ZNIL;
  910.     regOpPtr.p->deleteInsertFlag = 0;
  911.   }//for
  912.   regOpPtr.i = cnoOfOprec - 1;
  913.   ptrAss(regOpPtr, operationrec);
  914.   regOpPtr.p->nextOprecInList = RNIL;
  915.   cfirstfreeOprec = 0;
  916. }//Dbtup::initializeOperationrec()
  917. void Dbtup::initializePendingFileOpenInfoRecord() 
  918. {
  919.   PendingFileOpenInfoPtr pendingFileOpenInfoPtr;
  920.   for (pendingFileOpenInfoPtr.i = 0;
  921.        pendingFileOpenInfoPtr.i < cnoOfConcurrentOpenOp; pendingFileOpenInfoPtr.i++) {
  922.     ptrAss(pendingFileOpenInfoPtr, pendingFileOpenInfo);
  923.     pendingFileOpenInfoPtr.p->pfoNextRec = pendingFileOpenInfoPtr.i + 1;
  924.   }//for
  925.   pendingFileOpenInfoPtr.i = cnoOfConcurrentOpenOp - 1;
  926.   ptrAss(pendingFileOpenInfoPtr, pendingFileOpenInfo);
  927.   pendingFileOpenInfoPtr.p->pfoNextRec = RNIL;
  928.   cfirstfreePfo = 0;
  929. }//Dbtup::initializePendingFileOpenInfoRecord()
  930. void Dbtup::initializeRestartInfoRec() 
  931. {
  932.   RestartInfoRecordPtr restartInfoPtr;
  933.   for (restartInfoPtr.i = 0; restartInfoPtr.i < cnoOfRestartInfoRec; restartInfoPtr.i++) {
  934.     ptrAss(restartInfoPtr, restartInfoRecord);
  935.     restartInfoPtr.p->sriNextRec = restartInfoPtr.i + 1;
  936.   }//for
  937.   restartInfoPtr.i = cnoOfRestartInfoRec - 1;
  938.   ptrAss(restartInfoPtr, restartInfoRecord);
  939.   restartInfoPtr.p->sriNextRec = RNIL;
  940.   cfirstfreeSri = 0;
  941. }//Dbtup::initializeRestartInfoRec()
  942. void Dbtup::initializeTablerec() 
  943. {
  944.   TablerecPtr regTabPtr;
  945.   for (regTabPtr.i = 0; regTabPtr.i < cnoOfTablerec; regTabPtr.i++) {
  946.     ljam();
  947.     refresh_watch_dog();
  948.     ptrAss(regTabPtr, tablerec);
  949.     initTab(regTabPtr.p);
  950.   }//for
  951. }//Dbtup::initializeTablerec()
  952. void
  953. Dbtup::initTab(Tablerec* const regTabPtr)
  954. {
  955.   for (Uint32 i = 0; i < (2 * MAX_FRAG_PER_NODE); i++) {
  956.     regTabPtr->fragid[i] = RNIL;
  957.     regTabPtr->fragrec[i] = RNIL;
  958.   }//for
  959.   regTabPtr->readFunctionArray = NULL;
  960.   regTabPtr->updateFunctionArray = NULL;
  961.   regTabPtr->charsetArray = NULL;
  962.   regTabPtr->tabDescriptor = RNIL;
  963.   regTabPtr->attributeGroupDescriptor = RNIL;
  964.   regTabPtr->readKeyArray = RNIL;
  965.   regTabPtr->checksumIndicator = false;
  966.   regTabPtr->GCPIndicator = false;
  967.   regTabPtr->noOfAttr = 0;
  968.   regTabPtr->noOfKeyAttr = 0;
  969.   regTabPtr->noOfNewAttr = 0;
  970.   regTabPtr->noOfAttributeGroups = 0;
  971.   regTabPtr->tupheadsize = 0;
  972.   regTabPtr->tupNullIndex = 0;
  973.   regTabPtr->tupNullWords = 0;
  974.   regTabPtr->tupChecksumIndex = 0;
  975.   regTabPtr->tupGCPIndex = 0;
  976.   regTabPtr->m_dropTable.tabUserPtr = RNIL;
  977.   regTabPtr->m_dropTable.tabUserRef = 0;
  978.   regTabPtr->tableStatus = NOT_DEFINED;
  979.   // Clear trigger data
  980.   if (!regTabPtr->afterInsertTriggers.isEmpty())
  981.     regTabPtr->afterInsertTriggers.release();
  982.   if (!regTabPtr->afterDeleteTriggers.isEmpty())
  983.     regTabPtr->afterDeleteTriggers.release();
  984.   if (!regTabPtr->afterUpdateTriggers.isEmpty())
  985.     regTabPtr->afterUpdateTriggers.release();
  986.   if (!regTabPtr->subscriptionInsertTriggers.isEmpty())
  987.     regTabPtr->subscriptionInsertTriggers.release();
  988.   if (!regTabPtr->subscriptionDeleteTriggers.isEmpty())
  989.     regTabPtr->subscriptionDeleteTriggers.release();
  990.   if (!regTabPtr->subscriptionUpdateTriggers.isEmpty())
  991.     regTabPtr->subscriptionUpdateTriggers.release();
  992.   if (!regTabPtr->constraintUpdateTriggers.isEmpty())
  993.     regTabPtr->constraintUpdateTriggers.release();
  994.   if (!regTabPtr->tuxCustomTriggers.isEmpty())
  995.     regTabPtr->tuxCustomTriggers.release();
  996. }//Dbtup::initTab()
  997. void Dbtup::initializeTabDescr() 
  998. {
  999.   TableDescriptorPtr regTabDesPtr;
  1000.   for (Uint32 i = 0; i < 16; i++) {
  1001.     cfreeTdList[i] = RNIL;
  1002.   }//for
  1003.   for (regTabDesPtr.i = 0; regTabDesPtr.i < cnoOfTabDescrRec; regTabDesPtr.i++) {
  1004.     refresh_watch_dog();
  1005.     ptrAss(regTabDesPtr, tableDescriptor);
  1006.     regTabDesPtr.p->tabDescr = RNIL;
  1007.   }//for
  1008.   freeTabDescr(0, cnoOfTabDescrRec);
  1009. }//Dbtup::initializeTabDescr()
  1010. void Dbtup::initializeUndoPage() 
  1011. {
  1012.   UndoPagePtr undoPagep;
  1013.   for (undoPagep.i = 0;
  1014.        undoPagep.i < cnoOfUndoPage;
  1015.        undoPagep.i = undoPagep.i + ZUB_SEGMENT_SIZE) {
  1016.     refresh_watch_dog();
  1017.     ptrAss(undoPagep, undoPage);
  1018.     undoPagep.p->undoPageWord[ZPAGE_NEXT_POS] = undoPagep.i + 
  1019.                                                  ZUB_SEGMENT_SIZE;
  1020.     cnoFreeUndoSeg++;
  1021.   }//for
  1022.   undoPagep.i = cnoOfUndoPage - ZUB_SEGMENT_SIZE;
  1023.   ptrAss(undoPagep, undoPage);
  1024.   undoPagep.p->undoPageWord[ZPAGE_NEXT_POS] = RNIL;
  1025.   cfirstfreeUndoSeg = 0;
  1026. }//Dbtup::initializeUndoPage()
  1027. /* ---------------------------------------------------------------- */
  1028. /* ---------------------------------------------------------------- */
  1029. /* --------------- CONNECT/DISCONNECT MODULE ---------------------- */
  1030. /* ---------------------------------------------------------------- */
  1031. /* ---------------------------------------------------------------- */
  1032. void Dbtup::execTUPSEIZEREQ(Signal* signal)
  1033. {
  1034.   OperationrecPtr regOperPtr;
  1035.   ljamEntry();
  1036.   Uint32 userPtr = signal->theData[0];
  1037.   BlockReference userRef = signal->theData[1];
  1038.   if (cfirstfreeOprec != RNIL) {
  1039.     ljam();
  1040.     seizeOpRec(regOperPtr);
  1041.   } else {
  1042.     ljam();
  1043.     signal->theData[0] = userPtr;
  1044.     signal->theData[1] = ZGET_OPREC_ERROR;
  1045.     sendSignal(userRef, GSN_TUPSEIZEREF, signal, 2, JBB);
  1046.     return;
  1047.   }//if
  1048.   regOperPtr.p->optype = ZREAD;
  1049.   initOpConnection(regOperPtr.p, 0);
  1050.   regOperPtr.p->userpointer = userPtr;
  1051.   regOperPtr.p->userblockref = userRef;
  1052.   signal->theData[0] = regOperPtr.p->userpointer;
  1053.   signal->theData[1] = regOperPtr.i;
  1054.   sendSignal(userRef, GSN_TUPSEIZECONF, signal, 2, JBB);
  1055.   return;
  1056. }//Dbtup::execTUPSEIZEREQ()
  1057. #define printFragment(t){ for(Uint32 i = 0; i < (2 * MAX_FRAG_PER_NODE);i++){
  1058.   ndbout_c("table = %d fragid[%d] = %d fragrec[%d] = %d", 
  1059.            t.i, t.p->fragid[i], i, t.p->fragrec[i]); }}
  1060. void Dbtup::execTUPRELEASEREQ(Signal* signal) 
  1061. {
  1062.   OperationrecPtr regOperPtr;
  1063.   ljamEntry();
  1064.   regOperPtr.i = signal->theData[0];
  1065.   ptrCheckGuard(regOperPtr, cnoOfOprec, operationrec);
  1066.   regOperPtr.p->transstate = DISCONNECTED;
  1067.   regOperPtr.p->nextOprecInList = cfirstfreeOprec;
  1068.   cfirstfreeOprec = regOperPtr.i;
  1069.   signal->theData[0] = regOperPtr.p->userpointer;
  1070.   sendSignal(regOperPtr.p->userblockref, GSN_TUPRELEASECONF, signal, 1, JBB);
  1071.   return;
  1072. }//Dbtup::execTUPRELEASEREQ()
  1073. /* ---------------------------------------------------------------- */
  1074. /* ---------------- FREE_DISK_BUFFER_SEGMENT_RECORD --------------- */
  1075. /* ---------------------------------------------------------------- */
  1076. /*                                                                  */
  1077. /* THIS ROUTINE DEALLOCATES A DISK SEGMENT AND ITS DATA PAGES       */
  1078. /*                                                                  */
  1079. /* INPUT:  DISK_BUFFER_SEGMENT_PTR    THE DISK SEGMENT              */
  1080. /*                                                                  */
  1081. /* -----------------------------------------------------------------*/
  1082. void Dbtup::freeDiskBufferSegmentRecord(Signal* signal, DiskBufferSegmentInfoPtr dbsiPtr) 
  1083. {
  1084.   switch (dbsiPtr.p->pdxBuffertype) {
  1085.   case UNDO_PAGES:
  1086.   case COMMON_AREA_PAGES:
  1087.     ljam();
  1088.     freeUndoBufferPages(signal, dbsiPtr);
  1089.     break;
  1090.   case UNDO_RESTART_PAGES:
  1091.     ljam();
  1092.     dbsiPtr.p->pdxDataPage[0] = dbsiPtr.p->pdxUndoBufferSet[0];
  1093.     freeUndoBufferPages(signal, dbsiPtr);
  1094.     dbsiPtr.p->pdxDataPage[0] = dbsiPtr.p->pdxUndoBufferSet[1];
  1095.     freeUndoBufferPages(signal, dbsiPtr);
  1096.     break;
  1097.   default:
  1098.     ndbrequire(false);
  1099.     break;
  1100.   }//switch
  1101.   releaseDiskBufferSegmentRecord(dbsiPtr);
  1102. }//Dbtup::freeDiskBufferSegmentRecord()
  1103. /* ---------------------------------------------------------------- */
  1104. /* -------------------- FREE_UNDO_BUFFER_PAGES -------------------- */
  1105. /* ---------------------------------------------------------------- */
  1106. /*                                                                  */
  1107. /* THIS ROUTINE DEALLOCATES A SEGMENT OF UNDO PAGES                 */
  1108. /*                                                                  */
  1109. /* INPUT:  UNDO_PAGEP    POINTER TO FIRST PAGE IN SEGMENT          */
  1110. /*                                                                  */
  1111. /* -----------------------------------------------------------------*/
  1112. void Dbtup::freeUndoBufferPages(Signal* signal, DiskBufferSegmentInfoPtr dbsiPtr) 
  1113. {
  1114.   UndoPagePtr undoPagePtr;
  1115.   undoPagePtr.i = dbsiPtr.p->pdxDataPage[0];
  1116.   ptrCheckGuard(undoPagePtr, cnoOfUndoPage, undoPage);
  1117.   undoPagePtr.p->undoPageWord[ZPAGE_NEXT_POS] = cfirstfreeUndoSeg;
  1118.   cfirstfreeUndoSeg = undoPagePtr.i;
  1119.   cnoFreeUndoSeg++;
  1120.   if (cnoFreeUndoSeg == ZMIN_PAGE_LIMIT_TUP_COMMITREQ) {
  1121.     EXECUTE_DIRECT(DBLQH, GSN_TUP_COM_UNBLOCK, signal, 1);
  1122.     ljamEntry();
  1123.   }//if
  1124. }//Dbtup::freeUndoBufferPages()
  1125. void Dbtup::releaseCheckpointInfoRecord(CheckpointInfoPtr ciPtr) 
  1126. {
  1127.   ciPtr.p->lcpNextRec = cfirstfreeLcp;
  1128.   cfirstfreeLcp = ciPtr.i;
  1129. }//Dbtup::releaseCheckpointInfoRecord()
  1130. void Dbtup::releaseDiskBufferSegmentRecord(DiskBufferSegmentInfoPtr dbsiPtr) 
  1131. {
  1132.   dbsiPtr.p->pdxNextRec = cfirstfreePdx;
  1133.   cfirstfreePdx = dbsiPtr.i;
  1134. }//Dbtup::releaseDiskBufferSegmentRecord()
  1135. void Dbtup::releaseFragrec(FragrecordPtr regFragPtr) 
  1136. {
  1137.   regFragPtr.p->nextfreefrag = cfirstfreefrag;
  1138.   cfirstfreefrag = regFragPtr.i;
  1139. }//Dbtup::releaseFragrec()
  1140. void Dbtup::releasePendingFileOpenInfoRecord(PendingFileOpenInfoPtr pfoPtr) 
  1141. {
  1142.   pfoPtr.p->pfoNextRec = cfirstfreePfo;
  1143.   cfirstfreePfo = pfoPtr.i;
  1144. }//Dbtup::releasePendingFileOpenInfoRecord()
  1145. void Dbtup::releaseRestartInfoRecord(RestartInfoRecordPtr riPtr) 
  1146. {
  1147.   riPtr.p->sriNextRec = cfirstfreeSri;
  1148.   cfirstfreeSri = riPtr.i;
  1149. }//Dbtup::releaseRestartInfoRecord()
  1150. void Dbtup::seizeCheckpointInfoRecord(CheckpointInfoPtr& ciPtr) 
  1151. {
  1152.   ciPtr.i = cfirstfreeLcp;
  1153.   ptrCheckGuard(ciPtr, cnoOfLcpRec, checkpointInfo);
  1154.   cfirstfreeLcp = ciPtr.p->lcpNextRec;
  1155.   ciPtr.p->lcpNextRec = RNIL;
  1156. }//Dbtup::seizeCheckpointInfoRecord()
  1157. void Dbtup::seizeDiskBufferSegmentRecord(DiskBufferSegmentInfoPtr& dbsiPtr) 
  1158. {
  1159.   dbsiPtr.i = cfirstfreePdx;
  1160.   ptrCheckGuard(dbsiPtr, cnoOfConcurrentWriteOp, diskBufferSegmentInfo);
  1161.   cfirstfreePdx = dbsiPtr.p->pdxNextRec;
  1162.   dbsiPtr.p->pdxNextRec = RNIL;
  1163.   for (Uint32 i = 0; i < 16; i++) {
  1164.     dbsiPtr.p->pdxDataPage[i] = RNIL;
  1165.   }//for
  1166.   dbsiPtr.p->pdxCheckpointInfoP = RNIL;
  1167.   dbsiPtr.p->pdxRestartInfoP = RNIL;
  1168.   dbsiPtr.p->pdxLocalLogInfoP = RNIL;
  1169.   dbsiPtr.p->pdxFilePage = 0;
  1170.   dbsiPtr.p->pdxNumDataPages = 0;
  1171. }//Dbtup::seizeDiskBufferSegmentRecord()
  1172. void Dbtup::seizeOpRec(OperationrecPtr& regOperPtr) 
  1173. {
  1174.   regOperPtr.i = cfirstfreeOprec;
  1175.   ptrCheckGuard(regOperPtr, cnoOfOprec, operationrec);
  1176.   cfirstfreeOprec = regOperPtr.p->nextOprecInList;
  1177. }//Dbtup::seizeOpRec()
  1178. void Dbtup::seizePendingFileOpenInfoRecord(PendingFileOpenInfoPtr& pfoiPtr) 
  1179. {
  1180.   pfoiPtr.i = cfirstfreePfo;
  1181.   ptrCheckGuard(pfoiPtr, cnoOfConcurrentOpenOp, pendingFileOpenInfo);
  1182.   cfirstfreePfo = pfoiPtr.p->pfoNextRec;
  1183.   pfoiPtr.p->pfoNextRec = RNIL;
  1184. }//Dbtup::seizePendingFileOpenInfoRecord()
  1185. void Dbtup::execSET_VAR_REQ(Signal* signal) 
  1186. {
  1187. #if 0
  1188.   SetVarReq* const setVarReq = (SetVarReq*)signal->getDataPtrSend();
  1189.   ConfigParamId var = setVarReq->variable();
  1190.   int val = setVarReq->value();
  1191.   switch (var) {
  1192.   case NoOfDiskPagesToDiskAfterRestartTUP:
  1193.     clblPagesPerTick = val;
  1194.     sendSignal(CMVMI_REF, GSN_SET_VAR_CONF, signal, 1, JBB);
  1195.     break;
  1196.   case NoOfDiskPagesToDiskDuringRestartTUP:
  1197.     // Valid only during start so value not set.
  1198.     sendSignal(CMVMI_REF, GSN_SET_VAR_CONF, signal, 1, JBB);
  1199.     break;
  1200.   default:
  1201.     sendSignal(CMVMI_REF, GSN_SET_VAR_REF, signal, 1, JBB);
  1202.   } // switch
  1203. #endif
  1204. }//execSET_VAR_REQ()