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

MySQL数据库

开发平台:

Visual C++

  1.       if (logPartPtr.p->logPartState != LogPartRecord::SR_FOURTH_PHASE_STARTED) {
  2.         jam();
  3.         systemErrorLab(signal);
  4.         return;
  5.       } else {
  6.         jam();
  7. /* ------------------------------------------------------------------
  8.  *  THIS LOG PART WAS NOT COMPLETED YET. 
  9.  *  EXIT AND WAIT FOR IT TO COMPLETE
  10.  * ----------------------------------------------------------------- */
  11.         return;
  12.       }//if
  13.     }//if
  14.   }//for
  15.   /* ------------------------------------------------------------------------
  16.    *  ALL LOG PARTS HAVE COMPLETED PHASE FOUR OF THE SYSTEM RESTART. 
  17.    *  WE CAN NOW SEND START_RECCONF TO THE MASTER DIH IF IT WAS A 
  18.    *  SYSTEM RESTART. OTHERWISE WE WILL CONTINUE WITH AN INITIAL START. 
  19.    *  SET LOG PART STATE TO IDLE TO
  20.    *  INDICATE THAT NOTHING IS GOING ON IN THE LOG PART.
  21.    * ----------------------------------------------------------------------- */
  22.   for (logPartPtr.i = 0; logPartPtr.i <= 3; logPartPtr.i++) {
  23.     ptrAss(logPartPtr, logPartRecord);
  24.     logPartPtr.p->logPartState = LogPartRecord::IDLE;
  25.   }//for
  26.   if ((cstartType == NodeState::ST_INITIAL_START) || 
  27.       (cstartType == NodeState::ST_INITIAL_NODE_RESTART)) {
  28.     jam();
  29.     
  30.     ndbrequire(cinitialStartOngoing == ZTRUE);
  31.     cinitialStartOngoing = ZFALSE;
  32.     checkStartCompletedLab(signal);
  33.     return;
  34.   } else if ((cstartType == NodeState::ST_NODE_RESTART) ||
  35.              (cstartType == NodeState::ST_SYSTEM_RESTART)) {
  36.     jam();
  37.     StartRecConf * conf = (StartRecConf*)signal->getDataPtrSend();
  38.     conf->startingNodeId = getOwnNodeId();
  39.     sendSignal(cmasterDihBlockref, GSN_START_RECCONF, signal, 
  40.        StartRecConf::SignalLength, JBB);
  41.     if(cstartType == NodeState::ST_SYSTEM_RESTART){
  42.       fragptr.i = c_redo_log_complete_frags;
  43.       while(fragptr.i != RNIL){
  44. ptrCheckGuard(fragptr, cfragrecFileSize, fragrecord);
  45. signal->theData[0] = fragptr.p->tabRef;
  46. signal->theData[1] = fragptr.p->fragId;
  47. sendSignal(DBACC_REF, GSN_EXPANDCHECK2, signal, 2, JBB);
  48. fragptr.i = fragptr.p->nextFrag;
  49.       }
  50.     }
  51.   } else {
  52.     ndbrequire(false);
  53.   }//if
  54.   return;
  55. }//Dblqh::srFourthComp()
  56. /* ######################################################################### */
  57. /* #######                            ERROR MODULE                   ####### */
  58. /*                                                                           */
  59. /* ######################################################################### */
  60. void Dblqh::warningHandlerLab(Signal* signal) 
  61. {
  62.   systemErrorLab(signal);
  63.   return;
  64. }//Dblqh::warningHandlerLab()
  65. /*---------------------------------------------------------------------------*/
  66. /* AN ERROR OCCURRED THAT WE WILL NOT TREAT AS SYSTEM ERROR. MOST OFTEN THIS */
  67. /* WAS CAUSED BY AN ERRONEUS SIGNAL SENT BY ANOTHER NODE. WE DO NOT WISH TO  */
  68. /* CRASH BECAUSE OF FAULTS IN OTHER NODES. THUS WE ONLY REPORT A WARNING.    */
  69. /* THIS IS CURRENTLY NOT IMPLEMENTED AND FOR THE MOMENT WE GENERATE A SYSTEM */
  70. /* ERROR SINCE WE WANT TO FIND FAULTS AS QUICKLY AS POSSIBLE IN A TEST PHASE.*/
  71. /* IN A LATER PHASE WE WILL CHANGE THIS TO BE A WARNING MESSAGE INSTEAD.     */
  72. /*---------------------------------------------------------------------------*/
  73. /*---------------------------------------------------------------------------*/
  74. /*      THIS TYPE OF ERROR SHOULD NOT GENERATE A SYSTEM ERROR IN A PRODUCT   */
  75. /*      RELEASE. THIS IS A TEMPORARY SOLUTION DURING TEST PHASE TO QUICKLY   */
  76. /*      FIND ERRORS. NORMALLY THIS SHOULD GENERATE A WARNING MESSAGE ONTO    */
  77. /*      SOME ERROR LOGGER. THIS WILL LATER BE IMPLEMENTED BY SOME SIGNAL.    */
  78. /*---------------------------------------------------------------------------*/
  79. /* ------ SYSTEM ERROR SITUATIONS ------- */
  80. /*      IN SITUATIONS WHERE THE STATE IS ERRONEOUS OR IF THE ERROR OCCURS IN */
  81. /*      THE COMMIT, COMPLETE OR ABORT PHASE, WE PERFORM A CRASH OF THE AXE VM*/
  82. /*---------------------------------------------------------------------------*/
  83. void Dblqh::systemErrorLab(Signal* signal) 
  84. {
  85.   progError(0, 0);
  86. /*************************************************************************>*/
  87. /*       WE WANT TO INVOKE AN IMMEDIATE ERROR HERE SO WE GET THAT BY       */
  88. /*       INSERTING A CERTAIN POINTER OUT OF RANGE.                         */
  89. /*************************************************************************>*/
  90. }//Dblqh::systemErrorLab()
  91. /* ------- ERROR SITUATIONS ------- */
  92. void Dblqh::aiStateErrorCheckLab(Signal* signal, Uint32* dataPtr, Uint32 length) 
  93. {
  94.   ndbrequire(tcConnectptr.p->abortState != TcConnectionrec::ABORT_IDLE);
  95.   if (tcConnectptr.p->transactionState != TcConnectionrec::IDLE) {
  96.       jam();
  97. /*************************************************************************>*/
  98. /*       TRANSACTION ABORT IS ONGOING. IT CAN STILL BE A PART OF AN        */
  99. /*       OPERATION THAT SHOULD CONTINUE SINCE THE TUPLE HAS NOT ARRIVED    */
  100. /*       YET. THIS IS POSSIBLE IF ACTIVE CREATION OF THE FRAGMENT IS       */
  101. /*       ONGOING.                                                          */
  102. /*************************************************************************>*/
  103.     if (tcConnectptr.p->activeCreat == ZTRUE) {
  104.         jam();
  105. /*************************************************************************>*/
  106. /*       ONGOING ABORTS DURING ACTIVE CREATION MUST SAVE THE ATTRIBUTE INFO*/
  107. /*       SO THAT IT CAN BE SENT TO THE NEXT NODE IN THE COMMIT CHAIN. THIS */
  108. /*       IS NEEDED SINCE ALL ABORTS DURING CREATION OF A FRAGMENT ARE NOT  */
  109. /*       REALLY ERRORS. A MISSING TUPLE TO BE UPDATED SIMPLY MEANS THAT    */
  110. /*       IT HASN'T BEEN TRANSFERRED TO THE NEW REPLICA YET.                */
  111. /*************************************************************************>*/
  112. /*************************************************************************>*/
  113. /*       AFTER THIS ERROR THE ABORT MUST BE COMPLETED. TO ENSURE THIS SET  */
  114. /*       ACTIVE CREATION TO FALSE. THIS WILL ENSURE THAT THE ABORT IS      */
  115. /*       COMPLETED.                                                        */
  116. /*************************************************************************>*/
  117.       if (saveTupattrbuf(signal, dataPtr, length) == ZOK) {
  118.         jam();
  119.         if (tcConnectptr.p->transactionState == 
  120.             TcConnectionrec::WAIT_AI_AFTER_ABORT) {
  121.           if (tcConnectptr.p->currTupAiLen == tcConnectptr.p->totReclenAi) {
  122.             jam();
  123. /*************************************************************************>*/
  124. /*       WE WERE WAITING FOR MORE ATTRIBUTE INFO AFTER A SUCCESSFUL ABORT  */
  125. /*       IN ACTIVE CREATION STATE. THE TRANSACTION SHOULD CONTINUE AS IF   */
  126. /*       IT WAS COMMITTED. NOW ALL INFO HAS ARRIVED AND WE CAN CONTINUE    */
  127. /*       WITH NORMAL PROCESSING AS IF THE TRANSACTION WAS PREPARED.        */
  128. /*       SINCE THE FRAGMENT IS UNDER CREATION WE KNOW THAT LOGGING IS      */
  129. /*       DISABLED. WE STILL HAVE TO CATER FOR DIRTY OPERATION OR NOT.      */
  130. /*************************************************************************>*/
  131.             tcConnectptr.p->abortState = TcConnectionrec::ABORT_IDLE;
  132.             rwConcludedAiLab(signal);
  133.             return;
  134.           } else {
  135.             ndbrequire(tcConnectptr.p->currTupAiLen < tcConnectptr.p->totReclenAi);
  136.             jam();
  137.             return; /* STILL WAITING FOR MORE ATTRIBUTE INFO */
  138.           }//if
  139.         }//if
  140.       } else {
  141.         jam();
  142. /*************************************************************************>*/
  143. /*       AFTER THIS ERROR THE ABORT MUST BE COMPLETED. TO ENSURE THIS SET  */
  144. /*       ACTIVE CREATION TO ABORT. THIS WILL ENSURE THAT THE ABORT IS      */
  145. /*       COMPLETED AND THAT THE ERROR CODE IS PROPERLY SET                 */
  146. /*************************************************************************>*/
  147.         tcConnectptr.p->errorCode = terrorCode;
  148.         tcConnectptr.p->activeCreat = ZFALSE;
  149.         if (tcConnectptr.p->transactionState == 
  150.     TcConnectionrec::WAIT_AI_AFTER_ABORT) {
  151.           jam();
  152. /*************************************************************************>*/
  153. /*       ABORT IS ALREADY COMPLETED. WE NEED TO RESTART IT FROM WHERE IT   */
  154. /*       WAS INTERRUPTED.                                                  */
  155. /*************************************************************************>*/
  156.           continueAbortLab(signal);
  157.           return;
  158.         } else {
  159.           jam();
  160.           return;
  161. /*************************************************************************>*/
  162. // Abort is ongoing. It will complete since we set the activeCreat = ZFALSE
  163. /*************************************************************************>*/
  164.         }//if
  165.       }//if
  166.     }//if
  167.   }//if
  168. /*************************************************************************>*/
  169. /* TRANSACTION HAVE BEEN ABORTED. THUS IGNORE ALL SIGNALS BELONGING TO IT. */
  170. /*************************************************************************>*/
  171.   return;
  172. }//Dblqh::aiStateErrorCheckLab()
  173. void Dblqh::takeOverErrorLab(Signal* signal) 
  174. {
  175.   terrorCode = ZTAKE_OVER_ERROR;
  176.   abortErrorLab(signal);
  177.   return;
  178. }//Dblqh::takeOverErrorLab()
  179. /* ##########################################################################
  180.  *               TEST MODULE
  181.  * ######################################################################### */
  182. #ifdef VM_TRACE
  183. void Dblqh::execTESTSIG(Signal* signal) 
  184. {
  185.   jamEntry();
  186.   Uint32 userpointer = signal->theData[0];
  187.   BlockReference userblockref = signal->theData[1];
  188.   Uint32 testcase = signal->theData[2];
  189.   signal->theData[0] = userpointer;
  190.   signal->theData[1] = cownref;
  191.   signal->theData[2] = testcase;
  192.   sendSignal(userblockref, GSN_TESTSIG, signal, 25, JBB);
  193.   return;
  194. }//Dblqh::execTESTSIG()
  195. /* *************** */
  196. /*  MEMCHECKREQ  > */
  197. /* *************** */
  198. /* ************************************************************************>>
  199.  * THIS SIGNAL IS PURELY FOR TESTING PURPOSES. IT CHECKS THE FREE LIST 
  200.  * AND REPORTS THE NUMBER OF FREE RECORDS. 
  201.  * THIS CAN BE DONE TO ENSURE THAT NO RECORDS HAS BEEN LOST
  202.  * ************************************************************************> */
  203. void Dblqh::execMEMCHECKREQ(Signal* signal) 
  204. {
  205.   Uint32* dataPtr = &signal->theData[0];
  206.   jamEntry();
  207.   BlockReference userblockref = signal->theData[0];
  208.   Uint32 index = 0;
  209.   for (Uint32 i = 0; i < 7; i++)
  210.     dataPtr[i] = 0;
  211.   addfragptr.i = cfirstfreeAddfragrec;
  212.   while (addfragptr.i != RNIL) {
  213.     ptrCheckGuard(addfragptr, caddfragrecFileSize, addFragRecord);
  214.     addfragptr.i = addfragptr.p->nextAddfragrec;
  215.     dataPtr[index]++;
  216.   }//while
  217.   index++;
  218.   attrinbufptr.i = cfirstfreeAttrinbuf;
  219.   while (attrinbufptr.i != RNIL) {
  220.     ptrCheckGuard(attrinbufptr, cattrinbufFileSize, attrbuf);
  221.     attrinbufptr.i = attrinbufptr.p->attrbuf[ZINBUF_NEXT];
  222.     dataPtr[index]++;
  223.   }//while
  224.   index++;
  225.   databufptr.i = cfirstfreeDatabuf;
  226.   while (databufptr.i != RNIL) {
  227.     ptrCheckGuard(databufptr, cdatabufFileSize, databuf);
  228.     databufptr.i = databufptr.p->nextDatabuf;
  229.     dataPtr[index]++;
  230.   }//while
  231.   index++;
  232.   fragptr.i = cfirstfreeFragrec;
  233.   while (fragptr.i != RNIL) {
  234.     ptrCheckGuard(fragptr, cfragrecFileSize, fragrecord);
  235.     fragptr.i = fragptr.p->nextFrag;
  236.     dataPtr[index]++;
  237.   }//while
  238.   index++;
  239.   for (tabptr.i = 0;
  240.        tabptr.i < ctabrecFileSize;
  241.        tabptr.i++) {
  242.     ptrAss(tabptr, tablerec);
  243.     if (tabptr.p->tableStatus == Tablerec::NOT_DEFINED) {
  244.       dataPtr[index]++;
  245.     }//if
  246.   }//for
  247.   index++;
  248.   tcConnectptr.i = cfirstfreeTcConrec;
  249.   while (tcConnectptr.i != RNIL) {
  250.     ptrCheckGuard(tcConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  251.     tcConnectptr.i = tcConnectptr.p->nextTcConnectrec;
  252.     dataPtr[index]++;
  253.   }//while
  254.   sendSignal(userblockref, GSN_MEMCHECKCONF, signal, 10, JBB);
  255.   return;
  256. }//Dblqh::execMEMCHECKREQ()
  257. #endif
  258. /* ************************************************************************* */
  259. /* ************************* STATEMENT BLOCKS ****************************** */
  260. /* ************************************************************************* */
  261. /* ========================================================================= */
  262. /* ====== BUILD LINKED LIST OF LOG PAGES AFTER RECEIVING FSREADCONF  ======= */
  263. /*                                                                           */
  264. /* ========================================================================= */
  265. void Dblqh::buildLinkedLogPageList(Signal* signal) 
  266. {
  267.   LogPageRecordPtr bllLogPagePtr;
  268.   arrGuard(lfoPtr.p->noPagesRw - 1, 16);
  269.   arrGuard(lfoPtr.p->noPagesRw, 16);
  270.   for (UintR tbllIndex = 0; tbllIndex < lfoPtr.p->noPagesRw; tbllIndex++) {
  271.     jam();
  272.     /* ---------------------------------------------------------------------- 
  273.      *  BUILD LINKED LIST BUT ALSO ENSURE THAT PAGE IS NOT SEEN AS DIRTY 
  274.      *  INITIALLY.
  275.      * --------------------------------------------------------------------- */
  276.     bllLogPagePtr.i = lfoPtr.p->logPageArray[tbllIndex];
  277.     ptrCheckGuard(bllLogPagePtr, clogPageFileSize, logPageRecord);
  278. // #if VM_TRACE
  279. //     // Check logPage checksum before modifying it
  280. //     Uint32 calcCheckSum = calcPageCheckSum(bllLogPagePtr);
  281. //     Uint32 checkSum = bllLogPagePtr.p->logPageWord[ZPOS_CHECKSUM];
  282. //     if (checkSum != calcCheckSum) {
  283. //       ndbout << "Redolog: Checksum failure." << endl;
  284. //       progError(__LINE__, ERR_NDBREQUIRE, "Redolog: Checksum failure.");
  285. //     }
  286. // #endif
  287.     bllLogPagePtr.p->logPageWord[ZNEXT_PAGE] = 
  288.       lfoPtr.p->logPageArray[tbllIndex + 1];
  289.     bllLogPagePtr.p->logPageWord[ZPOS_DIRTY] = ZNOT_DIRTY;
  290.   }//for
  291.   bllLogPagePtr.i = lfoPtr.p->logPageArray[lfoPtr.p->noPagesRw - 1];
  292.   ptrCheckGuard(bllLogPagePtr, clogPageFileSize, logPageRecord);
  293.   bllLogPagePtr.p->logPageWord[ZNEXT_PAGE] = RNIL;
  294. }//Dblqh::buildLinkedLogPageList()
  295. /* ========================================================================= 
  296.  * =======                      CHANGE TO NEXT MBYTE IN LOG           ======= 
  297.  *
  298.  * ========================================================================= */
  299. void Dblqh::changeMbyte(Signal* signal) 
  300. {
  301.   writeNextLog(signal);
  302.   writeFileDescriptor(signal);
  303. }//Dblqh::changeMbyte()
  304. /* ========================================================================= */
  305. /* ======       CHECK IF THIS COMMIT LOG RECORD IS TO BE EXECUTED    ======= */
  306. /*                                                                           */
  307. /*      SUBROUTINE SHORT NAME = CEL                                          */
  308. /* ========================================================================= */
  309. Uint32 Dblqh::checkIfExecLog(Signal* signal) 
  310. {
  311.   tabptr.i = tcConnectptr.p->tableref;
  312.   ptrCheckGuard(tabptr, ctabrecFileSize, tablerec);
  313.   if (getFragmentrec(signal, tcConnectptr.p->fragmentid) &&
  314.       (table_version_major(tabptr.p->schemaVersion) == table_version_major(tcConnectptr.p->schemaVersion))) {
  315.     if (fragptr.p->execSrStatus != Fragrecord::IDLE) {
  316.       if (fragptr.p->execSrNoReplicas > logPartPtr.p->execSrExecuteIndex) {
  317.         ndbrequire((fragptr.p->execSrNoReplicas - 1) < 4);
  318.         for (Uint32 i = logPartPtr.p->execSrExecuteIndex; 
  319.      i < fragptr.p->execSrNoReplicas; 
  320.      i++) {
  321.           jam();
  322.           if (tcConnectptr.p->gci >= fragptr.p->execSrStartGci[i]) {
  323.             if (tcConnectptr.p->gci <= fragptr.p->execSrLastGci[i]) {
  324.               jam();
  325.               logPartPtr.p->execSrExecuteIndex = i;
  326.               return ZOK;
  327.             }//if
  328.           }//if
  329.         }//for
  330.       }//if
  331.     }//if
  332.   }//if
  333.   return ZNOT_OK;
  334. }//Dblqh::checkIfExecLog()
  335. /* ========================================================================= */
  336. /* == CHECK IF THERE IS LESS THAN 192 KBYTE IN THE BUFFER PLUS INCOMING  === */
  337. /*      READS ALREADY STARTED. IF SO IS THE CASE THEN START ANOTHER READ IF  */
  338. /*      THERE ARE MORE PAGES IN THIS MBYTE.                                  */
  339. /*                                                                           */
  340. /* ========================================================================= */
  341. void Dblqh::checkReadExecSr(Signal* signal) 
  342. {
  343.   logPartPtr.p->logExecState = LogPartRecord::LES_EXEC_LOG;
  344.   logPartPtr.p->execSrPagesRead = logPartPtr.p->execSrPagesRead + 8;
  345.   logPartPtr.p->execSrPagesReading = logPartPtr.p->execSrPagesReading - 8;
  346.   if ((logPartPtr.p->execSrPagesRead + logPartPtr.p->execSrPagesReading) < 
  347.       ZREAD_AHEAD_SIZE) {
  348.     jam();
  349.     /* ----------------------------------------------------------------------
  350.      *  WE HAVE LESS THAN 64 KBYTE OF LOG PAGES REMAINING IN MEMORY OR ON 
  351.      *  ITS WAY TO MAIN MEMORY. READ IN 8 MORE PAGES.
  352.      * --------------------------------------------------------------------- */
  353.     if ((logPartPtr.p->execSrPagesRead + logPartPtr.p->execSrPagesExecuted) < 
  354. ZPAGES_IN_MBYTE) {
  355.       jam();
  356.       /* --------------------------------------------------------------------
  357.        *  THERE ARE MORE PAGES TO READ IN THIS MBYTE. READ THOSE FIRST
  358.        *  IF >= ZPAGES_IN_MBYTE THEN THERE ARE NO MORE PAGES TO READ. THUS
  359.        *  WE PROCEED WITH EXECUTION OF THE LOG.
  360.        * ------------------------------------------------------------------- */
  361.       readExecSr(signal);
  362.       logPartPtr.p->logExecState = LogPartRecord::LES_WAIT_READ_EXEC_SR;
  363.     }//if
  364.   }//if
  365. }//Dblqh::checkReadExecSr()
  366. /* ========================================================================= */
  367. /* ==== CHECK IF START OF NEW FRAGMENT IS COMPLETED AND WE CAN       ======= */
  368. /* ==== GET THE START GCI                                            ======= */
  369. /*                                                                           */
  370. /*      SUBROUTINE SHORT NAME = CTC                                          */
  371. /* ========================================================================= */
  372. void Dblqh::checkScanTcCompleted(Signal* signal) 
  373. {
  374.   tcConnectptr.p->logWriteState = TcConnectionrec::NOT_STARTED;
  375.   fragptr.i = tcConnectptr.p->fragmentptr;
  376.   ptrCheckGuard(fragptr, cfragrecFileSize, fragrecord);
  377.   fragptr.p->activeTcCounter = fragptr.p->activeTcCounter - 1;
  378.   if (fragptr.p->activeTcCounter == 0) {
  379.     jam();
  380.     fragptr.p->startGci = cnewestGci + 1;
  381.     tabptr.i = tcConnectptr.p->tableref;
  382.     ptrCheckGuard(tabptr, ctabrecFileSize, tablerec);
  383.     sendCopyActiveConf(signal, tcConnectptr.p->tableref);
  384.   }//if
  385. }//Dblqh::checkScanTcCompleted()
  386. /* ========================================================================== 
  387.  * === CHECK IF ALL PARTS OF A SYSTEM RESTART ON A FRAGMENT ARE COMPLETED === 
  388.  *
  389.  *       SUBROUTINE SHORT NAME = CSC
  390.  * ========================================================================= */
  391. void Dblqh::checkSrCompleted(Signal* signal) 
  392. {
  393.   LcpLocRecordPtr cscLcpLocptr;
  394.   
  395.   terrorCode = ZOK;
  396.   ptrGuard(lcpPtr);
  397.   cscLcpLocptr.i = lcpPtr.p->firstLcpLocAcc;
  398. CSC_ACC_DOWHILE:
  399.   ptrCheckGuard(cscLcpLocptr, clcpLocrecFileSize, lcpLocRecord);
  400.   if (cscLcpLocptr.p->lcpLocstate != LcpLocRecord::SR_ACC_COMPLETED) {
  401.     jam();
  402.     if (cscLcpLocptr.p->lcpLocstate != LcpLocRecord::SR_ACC_STARTED) {
  403.       jam();
  404.       systemErrorLab(signal);
  405.       return;
  406.     }//if
  407.     return;
  408.   }//if
  409.   cscLcpLocptr.i = cscLcpLocptr.p->nextLcpLoc;
  410.   if (cscLcpLocptr.i != RNIL) {
  411.     jam();
  412.     goto CSC_ACC_DOWHILE;
  413.   }//if
  414.   cscLcpLocptr.i = lcpPtr.p->firstLcpLocTup;
  415. CSC_TUP_DOWHILE:
  416.   ptrCheckGuard(cscLcpLocptr, clcpLocrecFileSize, lcpLocRecord);
  417.   if (cscLcpLocptr.p->lcpLocstate != LcpLocRecord::SR_TUP_COMPLETED) {
  418.     jam();
  419.     if (cscLcpLocptr.p->lcpLocstate != LcpLocRecord::SR_TUP_STARTED) {
  420.       jam();
  421.       systemErrorLab(signal);
  422.       return;
  423.     }//if
  424.     return;
  425.   }//if
  426.   cscLcpLocptr.i = cscLcpLocptr.p->nextLcpLoc;
  427.   if (cscLcpLocptr.i != RNIL) {
  428.     jam();
  429.     goto CSC_TUP_DOWHILE;
  430.   }//if
  431.   lcpPtr.p->lcpState = LcpRecord::LCP_SR_COMPLETED;
  432. }//Dblqh::checkSrCompleted()
  433. /* ------------------------------------------------------------------------- */
  434. /* ------       CLOSE A FILE DURING EXECUTION OF FRAGMENT LOG        ------- */
  435. /*                                                                           */
  436. /* ------------------------------------------------------------------------- */
  437. void Dblqh::closeFile(Signal* signal, LogFileRecordPtr clfLogFilePtr) 
  438. {
  439.   signal->theData[0] = clfLogFilePtr.p->fileRef;
  440.   signal->theData[1] = cownref;
  441.   signal->theData[2] = clfLogFilePtr.i;
  442.   signal->theData[3] = ZCLOSE_NO_DELETE;
  443.   sendSignal(NDBFS_REF, GSN_FSCLOSEREQ, signal, 4, JBA);
  444. }//Dblqh::closeFile()
  445. /* ---------------------------------------------------------------- */
  446. /* ---------------- A LOG PAGE HAVE BEEN COMPLETED ---------------- */
  447. /*                                                                  */
  448. /*       SUBROUTINE SHORT NAME = CLP                                */
  449. // Input Pointers:
  450. // logFilePtr
  451. // logPagePtr
  452. // logPartPtr
  453. // Defines lfoPtr
  454. /* ---------------------------------------------------------------- */
  455. void Dblqh::completedLogPage(Signal* signal, Uint32 clpType, Uint32 place) 
  456. {
  457.   LogPageRecordPtr clpLogPagePtr;
  458.   LogPageRecordPtr wlpLogPagePtr;
  459.   UintR twlpNoPages;
  460.   UintR twlpType;
  461.   if (logFilePtr.p->firstFilledPage == RNIL) {
  462.     jam();
  463.     logFilePtr.p->firstFilledPage = logPagePtr.i;
  464.   } else {
  465.     jam();
  466.     clpLogPagePtr.i = logFilePtr.p->lastFilledPage;
  467.     ptrCheckGuard(clpLogPagePtr, clogPageFileSize, logPageRecord);
  468.     clpLogPagePtr.p->logPageWord[ZNEXT_PAGE] = logPagePtr.i;
  469.   }//if
  470.   logFilePtr.p->lastFilledPage = logPagePtr.i;
  471.   logPagePtr.p->logPageWord[ZNEXT_PAGE] = RNIL;
  472.   logFilePtr.p->noLogpagesInBuffer = logFilePtr.p->noLogpagesInBuffer + 1;
  473.   if (logFilePtr.p->noLogpagesInBuffer != ZMAX_PAGES_WRITTEN) {
  474.     if (clpType != ZLAST_WRITE_IN_FILE) {
  475.       if (clpType != ZENFORCE_WRITE) {
  476.         jam();
  477.         return;
  478.       }//if
  479.     }//if
  480.   }//if
  481.   twlpType = clpType;
  482. /* ------------------------------------------------------------------------- */
  483. /* ------               WRITE A SET OF LOG PAGES TO DISK             ------- */
  484. /*                                                                           */
  485. /*      SUBROUTINE SHORT NAME: WLP                                           */
  486. /* ------------------------------------------------------------------------- */
  487.   seizeLfo(signal);
  488.   initLfo(signal);
  489.   Uint32* dataPtr = &signal->theData[6];
  490.   twlpNoPages = 0;
  491.   wlpLogPagePtr.i = logFilePtr.p->firstFilledPage;
  492.   do {
  493.     dataPtr[twlpNoPages] = wlpLogPagePtr.i;
  494.     twlpNoPages++;
  495.     ptrCheckGuard(wlpLogPagePtr, clogPageFileSize, logPageRecord);
  496.     writeDbgInfoPageHeader(wlpLogPagePtr, place,
  497.                            logFilePtr.p->filePosition + twlpNoPages - 1,
  498.                            ZPAGE_SIZE);
  499.     // Calculate checksum for page
  500.     wlpLogPagePtr.p->logPageWord[ZPOS_CHECKSUM] = calcPageCheckSum(wlpLogPagePtr);
  501.     wlpLogPagePtr.i = wlpLogPagePtr.p->logPageWord[ZNEXT_PAGE];
  502.   } while (wlpLogPagePtr.i != RNIL);
  503.   ndbrequire(twlpNoPages < 9);
  504.   dataPtr[twlpNoPages] = logFilePtr.p->filePosition;
  505. /* -------------------------------------------------- */
  506. /*       SET TIMER ON THIS LOG PART TO SIGNIFY THAT A */
  507. /*       LOG RECORD HAS BEEN SENT AT THIS TIME.       */
  508. /* -------------------------------------------------- */
  509.   logPartPtr.p->logPartTimer = logPartPtr.p->logTimer;
  510.   signal->theData[0] = logFilePtr.p->fileRef;
  511.   signal->theData[1] = cownref;
  512.   signal->theData[2] = lfoPtr.i;
  513.   logFilePtr.p->logFilePagesToDiskWithoutSynch += twlpNoPages;
  514.   if (twlpType == ZLAST_WRITE_IN_FILE) {
  515.     jam();
  516.     logFilePtr.p->logFilePagesToDiskWithoutSynch = 0;
  517.     signal->theData[3] = ZLIST_OF_MEM_PAGES_SYNCH;
  518.   } else if (logFilePtr.p->logFilePagesToDiskWithoutSynch >
  519.              MAX_REDO_PAGES_WITHOUT_SYNCH) {
  520.     jam();
  521.     logFilePtr.p->logFilePagesToDiskWithoutSynch = 0;
  522.     signal->theData[3] = ZLIST_OF_MEM_PAGES_SYNCH;
  523.   } else {
  524.     jam();
  525.     signal->theData[3] = ZLIST_OF_MEM_PAGES;
  526.   }//if
  527.   signal->theData[4] = ZVAR_NO_LOG_PAGE_WORD;
  528.   signal->theData[5] = twlpNoPages;
  529.   sendSignal(NDBFS_REF, GSN_FSWRITEREQ, signal, 15, JBA);
  530.   if (twlpType == ZNORMAL) {
  531.     jam();
  532.     lfoPtr.p->lfoState = LogFileOperationRecord::ACTIVE_WRITE_LOG;
  533.   } else if (twlpType == ZLAST_WRITE_IN_FILE) {
  534.     jam();
  535.     lfoPtr.p->lfoState = LogFileOperationRecord::LAST_WRITE_IN_FILE;
  536.   } else {
  537.     ndbrequire(twlpType == ZENFORCE_WRITE);
  538.     jam();
  539.     lfoPtr.p->lfoState = LogFileOperationRecord::ACTIVE_WRITE_LOG;
  540.   }//if
  541.   /* ----------------------------------------------------------------------- */
  542.   /* ------       MOVE PAGES FROM LOG FILE TO LFO RECORD             ------- */
  543.   /*                                                                         */
  544.   /* ----------------------------------------------------------------------- */
  545.   /* -------------------------------------------------- */
  546.   /*       MOVE PAGES TO LFO RECORD AND REMOVE THEM     */
  547.   /*       FROM LOG FILE RECORD.                        */
  548.   /* -------------------------------------------------- */
  549.   lfoPtr.p->firstLfoPage = logFilePtr.p->firstFilledPage;
  550.   logFilePtr.p->firstFilledPage = RNIL;
  551.   logFilePtr.p->lastFilledPage = RNIL;
  552.   logFilePtr.p->noLogpagesInBuffer = 0;
  553.   lfoPtr.p->noPagesRw = twlpNoPages;
  554.   lfoPtr.p->lfoPageNo = logFilePtr.p->filePosition;
  555.   lfoPtr.p->lfoWordWritten = ZPAGE_SIZE - 1;
  556.   logFilePtr.p->filePosition += twlpNoPages;
  557. }//Dblqh::completedLogPage()
  558. /* ---------------------------------------------------------------- */
  559. /* ---------------- DELETE FRAGMENT RECORD ------------------------ */
  560. /*                                                                  */
  561. /*       SUBROUTINE SHORT NAME = DFR                                */
  562. /* ---------------------------------------------------------------- */
  563. void Dblqh::deleteFragrec(Uint32 fragId) 
  564. {
  565.   Uint32 indexFound= RNIL;
  566.   fragptr.i = RNIL;
  567.   for (Uint32 i = (MAX_FRAG_PER_NODE - 1); (Uint32)~i; i--) {
  568.     jam();
  569.     if (tabptr.p->fragid[i] == fragId) {
  570.       fragptr.i = tabptr.p->fragrec[i];
  571.       indexFound = i;
  572.       break;
  573.     }//if
  574.   }//for
  575.   if (fragptr.i != RNIL) {
  576.     jam();
  577.     ptrCheckGuard(fragptr, cfragrecFileSize, fragrecord);
  578.     tabptr.p->fragid[indexFound] = ZNIL;
  579.     tabptr.p->fragrec[indexFound] = RNIL;
  580.     releaseFragrec();
  581.   }//if
  582. }//Dblqh::deleteFragrec()
  583. /* ------------------------------------------------------------------------- */
  584. /* -------          FIND LOG FILE RECORD GIVEN FILE NUMBER           ------- */
  585. /*                                                                           */
  586. /*       INPUT:          TFLF_FILE_NO    THE FILE NUMBER                     */
  587. /*                       FLF_LOG_PART_PTR THE LOG PART RECORD                */
  588. /*       OUTPUT:         FLF_LOG_FILE_PTR THE FOUND LOG FILE RECORD          */
  589. /*       SUBROUTINE SHORT NAME = FLF                                         */
  590. /* ------------------------------------------------------------------------- */
  591. void Dblqh::findLogfile(Signal* signal,
  592.                         Uint32 fileNo,
  593.                         LogPartRecordPtr flfLogPartPtr,
  594.                         LogFileRecordPtr* parLogFilePtr) 
  595. {
  596.   LogFileRecordPtr locLogFilePtr;
  597.   locLogFilePtr.i = flfLogPartPtr.p->firstLogfile;
  598.   Uint32 loopCount = 0;
  599.   while (true) {
  600.     ptrCheckGuard(locLogFilePtr, clogFileFileSize, logFileRecord);
  601.     if (locLogFilePtr.p->fileNo == fileNo) {
  602.       jam();
  603.       ndbrequire(loopCount == fileNo);
  604.       parLogFilePtr->i = locLogFilePtr.i;
  605.       parLogFilePtr->p = locLogFilePtr.p;
  606.       return;
  607.     }//if
  608.     locLogFilePtr.i = locLogFilePtr.p->nextLogFile;
  609.     loopCount++;
  610.     ndbrequire(loopCount < flfLogPartPtr.p->noLogFiles);
  611.   }//while
  612. }//Dblqh::findLogfile()
  613. /* ------------------------------------------------------------------------- */
  614. /* ------     FIND PAGE REFERENCE IN MEMORY BUFFER AT LOG EXECUTION  ------- */
  615. /*                                                                           */
  616. /* ------------------------------------------------------------------------- */
  617. void Dblqh::findPageRef(Signal* signal, CommitLogRecord* commitLogRecord) 
  618. {
  619.   UintR tfprIndex;
  620.   logPagePtr.i = RNIL;
  621.   if (ERROR_INSERTED(5020)) {
  622.     // Force system to read page from disk
  623.     return;
  624.   }
  625.   pageRefPtr.i = logPartPtr.p->lastPageRef;
  626.   do {
  627.     ptrCheckGuard(pageRefPtr, cpageRefFileSize, pageRefRecord);
  628.     if (commitLogRecord->fileNo == pageRefPtr.p->prFileNo) {
  629.       if (commitLogRecord->startPageNo >= pageRefPtr.p->prPageNo) {
  630.         if (commitLogRecord->startPageNo < (Uint16) (pageRefPtr.p->prPageNo + 8)) {
  631.           jam();
  632.           tfprIndex = commitLogRecord->startPageNo - pageRefPtr.p->prPageNo;
  633.           logPagePtr.i = pageRefPtr.p->pageRef[tfprIndex];
  634.           ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord);
  635.           return;
  636.         }//if
  637.       }//if
  638.     }//if
  639.     pageRefPtr.i = pageRefPtr.p->prPrev;
  640.   } while (pageRefPtr.i != RNIL);
  641. }//Dblqh::findPageRef()
  642. /* ------------------------------------------------------------------------- */
  643. /* ------         GET FIRST OPERATION QUEUED FOR LOGGING             ------- */
  644. /*                                                                           */
  645. /*      SUBROUTINE SHORT NAME = GFL                                          */
  646. /* ------------------------------------------------------------------------- */
  647. void Dblqh::getFirstInLogQueue(Signal* signal) 
  648. {
  649.   TcConnectionrecPtr gflTcConnectptr;
  650. /* -------------------------------------------------- */
  651. /*       GET THE FIRST FROM THE LOG QUEUE AND REMOVE  */
  652. /*       IT FROM THE QUEUE.                           */
  653. /* -------------------------------------------------- */
  654.   gflTcConnectptr.i = logPartPtr.p->firstLogQueue;
  655.   ptrCheckGuard(gflTcConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  656.   logPartPtr.p->firstLogQueue = gflTcConnectptr.p->nextTcLogQueue;
  657.   if (logPartPtr.p->firstLogQueue == RNIL) {
  658.     jam();
  659.     logPartPtr.p->lastLogQueue = RNIL;
  660.   }//if
  661. }//Dblqh::getFirstInLogQueue()
  662. /* ---------------------------------------------------------------- */
  663. /* ---------------- GET FRAGMENT RECORD --------------------------- */
  664. /*       INPUT:          TFRAGID         FRAGMENT ID LOOKING FOR    */
  665. /*                       TABPTR          TABLE ID                   */
  666. /*       SUBROUTINE SHORT NAME = GFR                                */
  667. /* ---------------------------------------------------------------- */
  668. bool Dblqh::getFragmentrec(Signal* signal, Uint32 fragId) 
  669. {
  670.   for (Uint32 i = (MAX_FRAG_PER_NODE - 1); (UintR)~i; i--) {
  671.     jam();
  672.     if (tabptr.p->fragid[i] == fragId) {
  673.       fragptr.i = tabptr.p->fragrec[i];
  674.       ptrCheckGuard(fragptr, cfragrecFileSize, fragrecord);
  675.       return true;
  676.     }//if
  677.   }//for
  678.   return false;
  679. }//Dblqh::getFragmentrec()
  680. /* ========================================================================= */
  681. /* ======                      INITIATE FRAGMENT RECORD              ======= */
  682. /*                                                                           */
  683. /* ========================================================================= */
  684. void Dblqh::initialiseAddfragrec(Signal* signal) 
  685. {
  686.   if (caddfragrecFileSize != 0) {
  687.     for (addfragptr.i = 0; addfragptr.i < caddfragrecFileSize; addfragptr.i++) {
  688.       ptrAss(addfragptr, addFragRecord);
  689.       addfragptr.p->addfragStatus = AddFragRecord::FREE;
  690.       addfragptr.p->nextAddfragrec = addfragptr.i + 1;
  691.     }//for
  692.     addfragptr.i = caddfragrecFileSize - 1;
  693.     ptrAss(addfragptr, addFragRecord);
  694.     addfragptr.p->nextAddfragrec = RNIL;
  695.     cfirstfreeAddfragrec = 0;
  696.   } else {
  697.     jam();
  698.     cfirstfreeAddfragrec = RNIL;
  699.   }//if
  700. }//Dblqh::initialiseAddfragrec()
  701. /* ========================================================================= */
  702. /* ======              INITIATE ATTRIBUTE IN AND OUT DATA BUFFER     ======= */
  703. /*                                                                           */
  704. /* ========================================================================= */
  705. void Dblqh::initialiseAttrbuf(Signal* signal) 
  706. {
  707.   if (cattrinbufFileSize != 0) {
  708.     for (attrinbufptr.i = 0; 
  709.  attrinbufptr.i < cattrinbufFileSize; 
  710.  attrinbufptr.i++) {
  711.       refresh_watch_dog();
  712.       ptrAss(attrinbufptr, attrbuf);
  713.       attrinbufptr.p->attrbuf[ZINBUF_NEXT] = attrinbufptr.i + 1;
  714.     }//for
  715.                                                   /* NEXT ATTRINBUF */
  716.     attrinbufptr.i = cattrinbufFileSize - 1;
  717.     ptrAss(attrinbufptr, attrbuf);
  718.     attrinbufptr.p->attrbuf[ZINBUF_NEXT] = RNIL; /* NEXT ATTRINBUF */
  719.     cfirstfreeAttrinbuf = 0;
  720.   } else {
  721.     jam();
  722.     cfirstfreeAttrinbuf = RNIL;
  723.   }//if
  724. }//Dblqh::initialiseAttrbuf()
  725. /* ========================================================================= */
  726. /* ======                  INITIATE DATA BUFFER                      ======= */
  727. /*                                                                           */
  728. /* ========================================================================= */
  729. void Dblqh::initialiseDatabuf(Signal* signal) 
  730. {
  731.   if (cdatabufFileSize != 0) {
  732.     for (databufptr.i = 0; databufptr.i < cdatabufFileSize; databufptr.i++) {
  733.       refresh_watch_dog();
  734.       ptrAss(databufptr, databuf);
  735.       databufptr.p->nextDatabuf = databufptr.i + 1;
  736.     }//for
  737.     databufptr.i = cdatabufFileSize - 1;
  738.     ptrAss(databufptr, databuf);
  739.     databufptr.p->nextDatabuf = RNIL;
  740.     cfirstfreeDatabuf = 0;
  741.   } else {
  742.     jam();
  743.     cfirstfreeDatabuf = RNIL;
  744.   }//if
  745. }//Dblqh::initialiseDatabuf()
  746. /* ========================================================================= */
  747. /* ======                INITIATE FRAGMENT RECORD                    ======= */
  748. /*                                                                           */
  749. /* ========================================================================= */
  750. void Dblqh::initialiseFragrec(Signal* signal) 
  751. {
  752.   if (cfragrecFileSize != 0) {
  753.     for (fragptr.i = 0; fragptr.i < cfragrecFileSize; fragptr.i++) {
  754.       refresh_watch_dog();
  755.       ptrAss(fragptr, fragrecord);
  756.       fragptr.p->fragStatus = Fragrecord::FREE;
  757.       fragptr.p->fragActiveStatus = ZFALSE;
  758.       fragptr.p->execSrStatus = Fragrecord::IDLE;
  759.       fragptr.p->srStatus = Fragrecord::SS_IDLE;
  760.       fragptr.p->nextFrag = fragptr.i + 1;
  761.     }//for
  762.     fragptr.i = cfragrecFileSize - 1;
  763.     ptrAss(fragptr, fragrecord);
  764.     fragptr.p->nextFrag = RNIL;
  765.     cfirstfreeFragrec = 0;
  766.   } else {
  767.     jam();
  768.     cfirstfreeFragrec = RNIL;
  769.   }//if
  770. }//Dblqh::initialiseFragrec()
  771. /* ========================================================================= */
  772. /* ======                INITIATE FRAGMENT RECORD                    ======= */
  773. /*                                                                           */
  774. /* ========================================================================= */
  775. void Dblqh::initialiseGcprec(Signal* signal) 
  776. {
  777.   UintR tigpIndex;
  778.   if (cgcprecFileSize != 0) {
  779.     for (gcpPtr.i = 0; gcpPtr.i < cgcprecFileSize; gcpPtr.i++) {
  780.       ptrAss(gcpPtr, gcpRecord);
  781.       for (tigpIndex = 0; tigpIndex <= 3; tigpIndex++) {
  782.         gcpPtr.p->gcpLogPartState[tigpIndex] = ZIDLE;
  783.         gcpPtr.p->gcpSyncReady[tigpIndex] = ZFALSE;
  784.       }//for
  785.     }//for
  786.   }//if
  787. }//Dblqh::initialiseGcprec()
  788. /* ========================================================================= */
  789. /* ======                INITIATE LCP RECORD                         ======= */
  790. /*                                                                           */
  791. /* ========================================================================= */
  792. void Dblqh::initialiseLcpRec(Signal* signal) 
  793. {
  794.   if (clcpFileSize != 0) {
  795.     for (lcpPtr.i = 0; lcpPtr.i < clcpFileSize; lcpPtr.i++) {
  796.       ptrAss(lcpPtr, lcpRecord);
  797.       lcpPtr.p->lcpState = LcpRecord::LCP_IDLE;
  798.       lcpPtr.p->lcpQueued = false;
  799.       lcpPtr.p->firstLcpLocAcc = RNIL;
  800.       lcpPtr.p->firstLcpLocTup = RNIL;
  801.       lcpPtr.p->reportEmpty = false;
  802.       lcpPtr.p->lastFragmentFlag = false;
  803.     }//for
  804.   }//if
  805. }//Dblqh::initialiseLcpRec()
  806. /* ========================================================================= */
  807. /* ======                INITIATE LCP LOCAL RECORD                   ======= */
  808. /*                                                                           */
  809. /* ========================================================================= */
  810. void Dblqh::initialiseLcpLocrec(Signal* signal) 
  811. {
  812.   if (clcpLocrecFileSize != 0) {
  813.     for (lcpLocptr.i = 0; lcpLocptr.i < clcpLocrecFileSize; lcpLocptr.i++) {
  814.       ptrAss(lcpLocptr, lcpLocRecord);
  815.       lcpLocptr.p->nextLcpLoc = lcpLocptr.i + 1;
  816.       lcpLocptr.p->lcpLocstate = LcpLocRecord::IDLE;
  817.       lcpLocptr.p->masterLcpRec = RNIL;
  818.       lcpLocptr.p->waitingBlock = LcpLocRecord::NONE;
  819.     }//for
  820.     lcpLocptr.i = clcpLocrecFileSize - 1;
  821.     ptrAss(lcpLocptr, lcpLocRecord);
  822.     lcpLocptr.p->nextLcpLoc = RNIL;
  823.     cfirstfreeLcpLoc = 0;
  824.   } else {
  825.     jam();
  826.     cfirstfreeLcpLoc = RNIL;
  827.   }//if
  828. }//Dblqh::initialiseLcpLocrec()
  829. /* ========================================================================= */
  830. /* ======         INITIATE LOG FILE OPERATION RECORD                 ======= */
  831. /*                                                                           */
  832. /* ========================================================================= */
  833. void Dblqh::initialiseLfo(Signal* signal) 
  834. {
  835.   if (clfoFileSize != 0) {
  836.     for (lfoPtr.i = 0; lfoPtr.i < clfoFileSize; lfoPtr.i++) {
  837.       ptrAss(lfoPtr, logFileOperationRecord);
  838.       lfoPtr.p->lfoState = LogFileOperationRecord::IDLE;
  839.       lfoPtr.p->lfoTimer = 0;
  840.       lfoPtr.p->nextLfo = lfoPtr.i + 1;
  841.     }//for
  842.     lfoPtr.i = clfoFileSize - 1;
  843.     ptrAss(lfoPtr, logFileOperationRecord);
  844.     lfoPtr.p->nextLfo = RNIL;
  845.     cfirstfreeLfo = 0;
  846.   } else {
  847.     jam();
  848.     cfirstfreeLfo = RNIL;
  849.   }//if
  850. }//Dblqh::initialiseLfo()
  851. /* ========================================================================= */
  852. /* ======                 INITIATE LOG FILE RECORD                   ======= */
  853. /*                                                                           */
  854. /* ========================================================================= */
  855. void Dblqh::initialiseLogFile(Signal* signal) 
  856. {
  857.   if (clogFileFileSize != 0) {
  858.     for (logFilePtr.i = 0; logFilePtr.i < clogFileFileSize; logFilePtr.i++) {
  859.       ptrAss(logFilePtr, logFileRecord);
  860.       logFilePtr.p->nextLogFile = logFilePtr.i + 1;
  861.       logFilePtr.p->logFileStatus = LogFileRecord::LFS_IDLE;
  862.     }//for
  863.     logFilePtr.i = clogFileFileSize - 1;
  864.     ptrAss(logFilePtr, logFileRecord);
  865.     logFilePtr.p->nextLogFile = RNIL;
  866.     cfirstfreeLogFile = 0;
  867.   } else {
  868.     jam();
  869.     cfirstfreeLogFile = RNIL;
  870.   }//if
  871. }//Dblqh::initialiseLogFile()
  872. /* ========================================================================= */
  873. /* ======                  INITIATE LOG PAGES                        ======= */
  874. /*                                                                           */
  875. /* ========================================================================= */
  876. void Dblqh::initialiseLogPage(Signal* signal) 
  877. {
  878.   if (clogPageFileSize != 0) {
  879.     for (logPagePtr.i = 0; logPagePtr.i < clogPageFileSize; logPagePtr.i++) {
  880.       refresh_watch_dog();
  881.       ptrAss(logPagePtr, logPageRecord);
  882.       logPagePtr.p->logPageWord[ZNEXT_PAGE] = logPagePtr.i + 1;
  883.       logPagePtr.p->logPageWord[ZPOS_IN_FREE_LIST]= 1;
  884.       logPagePtr.p->logPageWord[ZPOS_IN_WRITING]= 0;
  885.     }//for
  886.     logPagePtr.i = clogPageFileSize - 1;
  887.     ptrAss(logPagePtr, logPageRecord);
  888.     logPagePtr.p->logPageWord[ZNEXT_PAGE] = RNIL;
  889.     cfirstfreeLogPage = 0;
  890.   } else {
  891.     jam();
  892.     cfirstfreeLogPage = RNIL;
  893.   }//if
  894.   cnoOfLogPages = clogPageFileSize;
  895. }//Dblqh::initialiseLogPage()
  896. /* ========================================================================= 
  897.  * ======                       INITIATE LOG PART RECORD             =======
  898.  *
  899.  * ========================================================================= */
  900. void Dblqh::initialiseLogPart(Signal* signal) 
  901. {
  902.   for (logPartPtr.i = 0; logPartPtr.i <= 3; logPartPtr.i++) {
  903.     ptrAss(logPartPtr, logPartRecord);
  904.     logPartPtr.p->waitWriteGciLog = LogPartRecord::WWGL_FALSE;
  905.     logPartPtr.p->LogLqhKeyReqSent = ZFALSE;
  906.     logPartPtr.p->logPartNewestCompletedGCI = (UintR)-1;
  907.   }//for
  908. }//Dblqh::initialiseLogPart()
  909. void Dblqh::initialisePageRef(Signal* signal) 
  910. {
  911.   if (cpageRefFileSize != 0) {
  912.     for (pageRefPtr.i = 0; 
  913.  pageRefPtr.i < cpageRefFileSize; 
  914.  pageRefPtr.i++) {
  915.       ptrAss(pageRefPtr, pageRefRecord);
  916.       pageRefPtr.p->prNext = pageRefPtr.i + 1;
  917.     }//for
  918.     pageRefPtr.i = cpageRefFileSize - 1;
  919.     ptrAss(pageRefPtr, pageRefRecord);
  920.     pageRefPtr.p->prNext = RNIL;
  921.     cfirstfreePageRef = 0;
  922.   } else {
  923.     jam();
  924.     cfirstfreePageRef = RNIL;
  925.   }//if
  926. }//Dblqh::initialisePageRef()
  927. /* ========================================================================== 
  928.  * =======                        INITIATE RECORDS                    ======= 
  929.  * 
  930.  *       TAKES CARE OF INITIATION OF ALL RECORDS IN THIS BLOCK.
  931.  * ========================================================================= */
  932. void Dblqh::initialiseRecordsLab(Signal* signal, Uint32 data,
  933.  Uint32 retRef, Uint32 retData) 
  934. {
  935.   Uint32 i;
  936.   switch (data) {
  937.   case 0:
  938.     jam();
  939.     for (i = 0; i < MAX_NDB_NODES; i++) {
  940.       cnodeSrState[i] = ZSTART_SR;
  941.       cnodeExecSrState[i] = ZSTART_SR;
  942.     }//for
  943.     for (i = 0; i < 1024; i++) {
  944.       ctransidHash[i] = RNIL;
  945.     }//for
  946.     for (i = 0; i < 4; i++) {
  947.       cactiveCopy[i] = RNIL;
  948.     }//for
  949.     cnoActiveCopy = 0;
  950.     cCounterAccCommitBlocked = 0;
  951.     cCounterTupCommitBlocked = 0;
  952.     caccCommitBlocked = false;
  953.     ctupCommitBlocked = false;
  954.     cCommitBlocked = false;
  955.     ccurrentGcprec = RNIL;
  956.     caddNodeState = ZFALSE;
  957.     cstartRecReq = ZFALSE;
  958.     cnewestGci = (UintR)-1;
  959.     cnewestCompletedGci = (UintR)-1;
  960.     crestartOldestGci = 0;
  961.     crestartNewestGci = 0;
  962.     cfirstWaitFragSr = RNIL;
  963.     cfirstCompletedFragSr = RNIL;
  964.     csrPhaseStarted = ZSR_NO_PHASE_STARTED;
  965.     csrPhasesCompleted = 0;
  966.     cmasterDihBlockref = 0;
  967.     cnoFragmentsExecSr = 0;
  968.     clcpCompletedState = LCP_IDLE;
  969.     csrExecUndoLogState = EULS_IDLE;
  970.     c_lcpId = 0;
  971.     cnoOfFragsCheckpointed = 0;
  972.     break;
  973.   case 1:
  974.     jam();
  975.     initialiseAddfragrec(signal);
  976.     break;
  977.   case 2:
  978.     jam();
  979.     initialiseAttrbuf(signal);
  980.     break;
  981.   case 3:
  982.     jam();
  983.     initialiseDatabuf(signal);
  984.     break;
  985.   case 4:
  986.     jam();
  987.     initialiseFragrec(signal);
  988.     break;
  989.   case 5:
  990.     jam();
  991.     initialiseGcprec(signal);
  992.     initialiseLcpRec(signal);
  993.     initialiseLcpLocrec(signal);
  994.     break;
  995.   case 6:
  996.     jam();
  997.     initialiseLogPage(signal);
  998.     break;
  999.   case 7:
  1000.     jam();
  1001.     initialiseLfo(signal);
  1002.     break;
  1003.   case 8:
  1004.     jam();
  1005.     initialiseLogFile(signal);
  1006.     initialiseLogPart(signal);
  1007.     break;
  1008.   case 9:
  1009.     jam();
  1010.     initialisePageRef(signal);
  1011.     break;
  1012.   case 10:
  1013.     jam();
  1014.     initialiseScanrec(signal);
  1015.     break;
  1016.   case 11:
  1017.     jam();
  1018.     initialiseTabrec(signal);
  1019.     break;
  1020.   case 12:
  1021.     jam();
  1022.     initialiseTcNodeFailRec(signal);
  1023.     initialiseTcrec(signal);
  1024.     {
  1025.       ReadConfigConf * conf = (ReadConfigConf*)signal->getDataPtrSend();
  1026.       conf->senderRef = reference();
  1027.       conf->senderData = retData;
  1028.       sendSignal(retRef, GSN_READ_CONFIG_CONF, signal, 
  1029.  ReadConfigConf::SignalLength, JBB);
  1030.     }
  1031.     return;
  1032.     break;
  1033.   default:
  1034.     ndbrequire(false);
  1035.     break;
  1036.   }//switch
  1037.   signal->theData[0] = ZINITIALISE_RECORDS;
  1038.   signal->theData[1] = data + 1;
  1039.   signal->theData[2] = 0;
  1040.   signal->theData[3] = retRef;
  1041.   signal->theData[4] = retData;
  1042.   sendSignal(DBLQH_REF, GSN_CONTINUEB, signal, 5, JBB);
  1043.   return;
  1044. }//Dblqh::initialiseRecordsLab()
  1045. /* ========================================================================== 
  1046.  * =======                      INITIATE TC CONNECTION RECORD         ======= 
  1047.  *
  1048.  * ========================================================================= */
  1049. void Dblqh::initialiseScanrec(Signal* signal) 
  1050. {
  1051.   ndbrequire(cscanrecFileSize > 1);
  1052.   DLList<ScanRecord> tmp(c_scanRecordPool);
  1053.   while (tmp.seize(scanptr)){
  1054.     //new (scanptr.p) ScanRecord();
  1055.     refresh_watch_dog();
  1056.     scanptr.p->scanType = ScanRecord::ST_IDLE;
  1057.     scanptr.p->scanState = ScanRecord::SCAN_FREE;
  1058.     scanptr.p->scanTcWaiting = ZFALSE;
  1059.     scanptr.p->nextHash = RNIL;
  1060.     scanptr.p->prevHash = RNIL;
  1061.     scanptr.p->scan_acc_index= 0;
  1062.     scanptr.p->scan_acc_attr_recs= 0;
  1063.   }
  1064.   tmp.release();
  1065. }//Dblqh::initialiseScanrec()
  1066. /* ========================================================================== 
  1067.  * =======                      INITIATE TABLE RECORD                 ======= 
  1068.  * 
  1069.  * ========================================================================= */
  1070. void Dblqh::initialiseTabrec(Signal* signal) 
  1071. {
  1072.   if (ctabrecFileSize != 0) {
  1073.     for (tabptr.i = 0; tabptr.i < ctabrecFileSize; tabptr.i++) {
  1074.       refresh_watch_dog();
  1075.       ptrAss(tabptr, tablerec);
  1076.       tabptr.p->tableStatus = Tablerec::NOT_DEFINED;
  1077.       tabptr.p->usageCount = 0;
  1078.       for (Uint32 i = 0; i <= (MAX_FRAG_PER_NODE - 1); i++) {
  1079.         tabptr.p->fragid[i] = ZNIL;
  1080.         tabptr.p->fragrec[i] = RNIL;
  1081.       }//for
  1082.     }//for
  1083.   }//if
  1084. }//Dblqh::initialiseTabrec()
  1085. /* ========================================================================== 
  1086.  * =======                      INITIATE TC CONNECTION RECORD         ======= 
  1087.  * 
  1088.  * ========================================================================= */
  1089. void Dblqh::initialiseTcrec(Signal* signal) 
  1090. {
  1091.   if (ctcConnectrecFileSize != 0) {
  1092.     for (tcConnectptr.i = 0; 
  1093.  tcConnectptr.i < ctcConnectrecFileSize; 
  1094.  tcConnectptr.i++) {
  1095.       refresh_watch_dog();
  1096.       ptrAss(tcConnectptr, tcConnectionrec);
  1097.       tcConnectptr.p->transactionState = TcConnectionrec::TC_NOT_CONNECTED;
  1098.       tcConnectptr.p->tcScanRec = RNIL;
  1099.       tcConnectptr.p->logWriteState = TcConnectionrec::NOT_STARTED;
  1100.       tcConnectptr.p->firstAttrinbuf = RNIL;
  1101.       tcConnectptr.p->lastAttrinbuf = RNIL;
  1102.       tcConnectptr.p->firstTupkeybuf = RNIL;
  1103.       tcConnectptr.p->lastTupkeybuf = RNIL;
  1104.       tcConnectptr.p->tcTimer = 0;
  1105.       tcConnectptr.p->nextTcConnectrec = tcConnectptr.i + 1;
  1106.     }//for
  1107.     tcConnectptr.i = ctcConnectrecFileSize - 1;
  1108.     ptrAss(tcConnectptr, tcConnectionrec);
  1109.     tcConnectptr.p->nextTcConnectrec = RNIL;
  1110.     cfirstfreeTcConrec = 0;
  1111.   } else {
  1112.     jam();
  1113.     cfirstfreeTcConrec = RNIL;
  1114.   }//if
  1115. }//Dblqh::initialiseTcrec()
  1116. /* ========================================================================== 
  1117.  * =======                      INITIATE TC CONNECTION RECORD         =======
  1118.  * 
  1119.  * ========================================================================= */
  1120. void Dblqh::initialiseTcNodeFailRec(Signal* signal) 
  1121. {
  1122.   if (ctcNodeFailrecFileSize != 0) {
  1123.     for (tcNodeFailptr.i = 0; 
  1124.  tcNodeFailptr.i < ctcNodeFailrecFileSize; 
  1125.  tcNodeFailptr.i++) {
  1126.       ptrAss(tcNodeFailptr, tcNodeFailRecord);
  1127.       tcNodeFailptr.p->tcFailStatus = TcNodeFailRecord::TC_STATE_FALSE;
  1128.     }//for
  1129.   }//if
  1130. }//Dblqh::initialiseTcNodeFailRec()
  1131. /* ==========================================================================
  1132.  * =======              INITIATE FRAGMENT RECORD                      ======= 
  1133.  *
  1134.  *       SUBROUTINE SHORT NAME = IF
  1135.  * ========================================================================= */
  1136. void Dblqh::initFragrec(Signal* signal,
  1137.                         Uint32 tableId,
  1138.                         Uint32 fragId,
  1139.                         Uint32 copyType) 
  1140. {
  1141.   new (fragptr.p) Fragrecord();
  1142.   fragptr.p->m_scanNumberMask.set(); // All is free
  1143.   fragptr.p->accBlockref = caccBlockref;
  1144.   fragptr.p->accBlockedList = RNIL;
  1145.   fragptr.p->activeList = RNIL;
  1146.   fragptr.p->firstWaitQueue = RNIL;
  1147.   fragptr.p->lastWaitQueue = RNIL;
  1148.   fragptr.p->fragStatus = Fragrecord::DEFINED;
  1149.   fragptr.p->fragCopy = copyType;
  1150.   fragptr.p->tupBlockref = ctupBlockref;
  1151.   fragptr.p->tuxBlockref = ctuxBlockref;
  1152.   fragptr.p->lcpRef = RNIL;
  1153.   fragptr.p->logFlag = Fragrecord::STATE_TRUE;
  1154.   fragptr.p->lcpFlag = Fragrecord::LCP_STATE_TRUE;
  1155.   for (Uint32 i = 0; i < MAX_LCP_STORED; i++) {
  1156.     fragptr.p->lcpId[i] = 0;
  1157.   }//for
  1158.   fragptr.p->maxGciCompletedInLcp = 0;
  1159.   fragptr.p->maxGciInLcp = 0;
  1160.   fragptr.p->copyFragState = ZIDLE;
  1161.   fragptr.p->nextFrag = RNIL;
  1162.   fragptr.p->newestGci = cnewestGci;
  1163.   fragptr.p->nextLcp = 0;
  1164.   fragptr.p->tabRef = tableId;
  1165.   fragptr.p->fragId = fragId;
  1166.   fragptr.p->srStatus = Fragrecord::SS_IDLE;
  1167.   fragptr.p->execSrStatus = Fragrecord::IDLE;
  1168.   fragptr.p->execSrNoReplicas = 0;
  1169.   fragptr.p->fragDistributionKey = 0;
  1170.   fragptr.p->activeTcCounter = 0;
  1171.   fragptr.p->tableFragptr = RNIL;
  1172. }//Dblqh::initFragrec()
  1173. /* ========================================================================== 
  1174.  * =======       INITIATE FRAGMENT RECORD FOR SYSTEM RESTART          ======= 
  1175.  *
  1176.  *       SUBROUTINE SHORT NAME = IFS
  1177.  * ========================================================================= */
  1178. void Dblqh::initFragrecSr(Signal* signal) 
  1179. {
  1180.   const StartFragReq * const startFragReq = (StartFragReq *)&signal->theData[0];
  1181.   Uint32 lcpNo = startFragReq->lcpNo;
  1182.   Uint32 noOfLogNodes = startFragReq->noOfLogNodes;
  1183.   ndbrequire(noOfLogNodes <= 4);
  1184.   fragptr.p->fragStatus = Fragrecord::CRASH_RECOVERING;
  1185.   fragptr.p->srBlockref = startFragReq->userRef;
  1186.   fragptr.p->srUserptr = startFragReq->userPtr;
  1187.   fragptr.p->srChkpnr = lcpNo;
  1188.   if (lcpNo == (MAX_LCP_STORED - 1)) {
  1189.     jam();
  1190.     fragptr.p->lcpId[lcpNo] = startFragReq->lcpId;
  1191.     fragptr.p->nextLcp = 0;
  1192.   } else if (lcpNo < (MAX_LCP_STORED - 1)) {
  1193.     jam();
  1194.     fragptr.p->lcpId[lcpNo] = startFragReq->lcpId;
  1195.     fragptr.p->nextLcp = lcpNo + 1;
  1196.   } else {
  1197.     ndbrequire(lcpNo == ZNIL);
  1198.     jam();
  1199.     fragptr.p->nextLcp = 0;
  1200.   }//if
  1201.   fragptr.p->srNoLognodes = noOfLogNodes;
  1202.   fragptr.p->logFlag = Fragrecord::STATE_FALSE;
  1203.   fragptr.p->srStatus = Fragrecord::SS_IDLE;
  1204.   if (noOfLogNodes > 0) {
  1205.     jam();
  1206.     for (Uint32 i = 0; i < noOfLogNodes; i++) {
  1207.       jam();
  1208.       fragptr.p->srStartGci[i] = startFragReq->startGci[i];
  1209.       fragptr.p->srLastGci[i] = startFragReq->lastGci[i];
  1210.       fragptr.p->srLqhLognode[i] = startFragReq->lqhLogNode[i];
  1211.     }//for
  1212.     fragptr.p->newestGci = startFragReq->lastGci[noOfLogNodes - 1];
  1213.   } else {
  1214.     fragptr.p->newestGci = cnewestGci;
  1215.   }//if
  1216. }//Dblqh::initFragrecSr()
  1217. /* ========================================================================== 
  1218.  * =======       INITIATE INFORMATION ABOUT GLOBAL CHECKPOINTS        ======= 
  1219.  *               IN LOG FILE RECORDS
  1220.  *
  1221.  *       INPUT:     LOG_FILE_PTR            CURRENT LOG FILE 
  1222.  *                  TNO_FD_DESCRIPTORS      THE NUMBER OF FILE DESCRIPTORS
  1223.  *                                          TO READ FROM THE LOG PAGE
  1224.  *                  LOG_PAGE_PTR            PAGE ZERO IN LOG FILE
  1225.  *       SUBROUTINE SHORT NAME = IGL
  1226.  * ========================================================================= */
  1227. void Dblqh::initGciInLogFileRec(Signal* signal, Uint32 noFdDescriptors) 
  1228. {
  1229.   LogFileRecordPtr iglLogFilePtr;
  1230.   UintR tiglLoop;
  1231.   UintR tiglIndex;
  1232.   tiglLoop = 0;
  1233.   iglLogFilePtr.i = logFilePtr.i;
  1234.   iglLogFilePtr.p = logFilePtr.p;
  1235. IGL_LOOP:
  1236.   for (tiglIndex = 0; tiglIndex <= ZNO_MBYTES_IN_FILE - 1; tiglIndex++) {
  1237.     arrGuard(((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) + 
  1238.       (tiglLoop * ZFD_PART_SIZE)) + tiglIndex, ZPAGE_SIZE);
  1239.     iglLogFilePtr.p->logMaxGciCompleted[tiglIndex] = 
  1240.       logPagePtr.p->logPageWord[((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) + 
  1241.  (tiglLoop * ZFD_PART_SIZE)) + tiglIndex];
  1242.     arrGuard((((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) + ZNO_MBYTES_IN_FILE) + 
  1243.       (tiglLoop * ZFD_PART_SIZE)) + tiglIndex, ZPAGE_SIZE);
  1244.     iglLogFilePtr.p->logMaxGciStarted[tiglIndex] = 
  1245.       logPagePtr.p->logPageWord[(((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) + 
  1246.   ZNO_MBYTES_IN_FILE) + 
  1247.  (tiglLoop * ZFD_PART_SIZE)) + tiglIndex];
  1248.     arrGuard((((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) + 
  1249.        (2 * ZNO_MBYTES_IN_FILE)) + (tiglLoop * ZFD_PART_SIZE)) + 
  1250.      tiglIndex, ZPAGE_SIZE);
  1251.     iglLogFilePtr.p->logLastPrepRef[tiglIndex] = 
  1252.       logPagePtr.p->logPageWord[(((ZPAGE_HEADER_SIZE + ZFD_HEADER_SIZE) + 
  1253.   (2 * ZNO_MBYTES_IN_FILE)) + 
  1254.  (tiglLoop * ZFD_PART_SIZE)) + tiglIndex];
  1255.   }//for
  1256.   tiglLoop = tiglLoop + 1;
  1257.   if (tiglLoop < noFdDescriptors) {
  1258.     jam();
  1259.     iglLogFilePtr.i = iglLogFilePtr.p->prevLogFile;
  1260.     ptrCheckGuard(iglLogFilePtr, clogFileFileSize, logFileRecord);
  1261.     goto IGL_LOOP;
  1262.   }//if
  1263. }//Dblqh::initGciInLogFileRec()
  1264. /* ========================================================================== 
  1265.  * =======        INITIATE LCP RECORD WHEN USED FOR SYSTEM RESTART    ======= 
  1266.  *                                                                 
  1267.  *       SUBROUTINE SHORT NAME = ILS            
  1268.  * ========================================================================= */
  1269. void Dblqh::initLcpSr(Signal* signal,
  1270.                       Uint32 lcpNo,
  1271.                       Uint32 lcpId,
  1272.                       Uint32 tableId,
  1273.                       Uint32 fragId,
  1274.                       Uint32 fragPtr) 
  1275. {
  1276.   lcpPtr.p->lcpQueued = false;
  1277.   lcpPtr.p->currentFragment.fragPtrI = fragPtr;
  1278.   lcpPtr.p->currentFragment.lcpFragOrd.lcpNo = lcpNo;
  1279.   lcpPtr.p->currentFragment.lcpFragOrd.lcpId = lcpId;
  1280.   lcpPtr.p->currentFragment.lcpFragOrd.tableId = tableId;
  1281.   lcpPtr.p->currentFragment.lcpFragOrd.fragmentId = fragId;
  1282.   lcpPtr.p->lcpState = LcpRecord::LCP_SR_WAIT_FRAGID;
  1283.   lcpPtr.p->firstLcpLocAcc = RNIL;
  1284.   lcpPtr.p->firstLcpLocTup = RNIL;
  1285.   lcpPtr.p->lcpAccptr = RNIL;
  1286. }//Dblqh::initLcpSr()
  1287. /* ========================================================================== 
  1288.  * =======              INITIATE LOG PART                             ======= 
  1289.  *                             
  1290.  * ========================================================================= */
  1291. void Dblqh::initLogpart(Signal* signal) 
  1292. {
  1293.   logPartPtr.p->execSrLogPage = RNIL;
  1294.   logPartPtr.p->execSrLogPageIndex = ZNIL;
  1295.   logPartPtr.p->execSrExecuteIndex = 0;
  1296.   logPartPtr.p->noLogFiles = cnoLogFiles;
  1297.   logPartPtr.p->logLap = 0;
  1298.   logPartPtr.p->logTailFileNo = 0;
  1299.   logPartPtr.p->logTailMbyte = 0;
  1300.   logPartPtr.p->lastMbyte = ZNIL;
  1301.   logPartPtr.p->logPartState = LogPartRecord::SR_FIRST_PHASE;
  1302.   logPartPtr.p->logExecState = LogPartRecord::LES_IDLE;
  1303.   logPartPtr.p->firstLogTcrec = RNIL;
  1304.   logPartPtr.p->lastLogTcrec = RNIL;
  1305.   logPartPtr.p->firstLogQueue = RNIL;
  1306.   logPartPtr.p->lastLogQueue = RNIL;
  1307.   logPartPtr.p->gcprec = RNIL;
  1308.   logPartPtr.p->firstPageRef = RNIL;
  1309.   logPartPtr.p->lastPageRef = RNIL;
  1310.   logPartPtr.p->headFileNo = ZNIL;
  1311.   logPartPtr.p->headPageNo = ZNIL;
  1312.   logPartPtr.p->headPageIndex = ZNIL;
  1313. }//Dblqh::initLogpart()
  1314. /* ========================================================================== 
  1315.  * =======              INITIATE LOG POINTERS                         ======= 
  1316.  *
  1317.  * ========================================================================= */
  1318. void Dblqh::initLogPointers(Signal* signal) 
  1319. {
  1320.   logPartPtr.i = tcConnectptr.p->hashValue & 3;
  1321.   ptrCheckGuard(logPartPtr, clogPartFileSize, logPartRecord);
  1322.   logFilePtr.i = logPartPtr.p->currentLogfile;
  1323.   ptrCheckGuard(logFilePtr, clogFileFileSize, logFileRecord);
  1324.   logPagePtr.i = logFilePtr.p->currentLogpage;
  1325.   ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord);
  1326. }//Dblqh::initLogPointers()
  1327. /* ------------------------------------------------------------------------- */
  1328. /* -------    INIT REQUEST INFO BEFORE EXECUTING A LOG RECORD        ------- */
  1329. /*                                                                           */
  1330. /* ------------------------------------------------------------------------- */
  1331. void Dblqh::initReqinfoExecSr(Signal* signal) 
  1332. {
  1333.   UintR Treqinfo = 0;
  1334.   TcConnectionrec * const regTcPtr = tcConnectptr.p;
  1335.   LqhKeyReq::setKeyLen(Treqinfo, regTcPtr->primKeyLen);
  1336. /* ------------------------------------------------------------------------- */
  1337. /* NUMBER OF BACKUPS AND STANDBYS ARE ZERO AND NEED NOT BE SET.              */
  1338. /* REPLICA TYPE IS CLEARED BY SEND_LQHKEYREQ.                                */
  1339. /* ------------------------------------------------------------------------- */
  1340. /* ------------------------------------------------------------------------- */
  1341. /*       SET LAST REPLICA NUMBER TO ZERO (BIT 10-11)                         */
  1342. /* ------------------------------------------------------------------------- */
  1343. /* ------------------------------------------------------------------------- */
  1344. /*       SET DIRTY FLAG                                                      */
  1345. /* ------------------------------------------------------------------------- */
  1346.   LqhKeyReq::setDirtyFlag(Treqinfo, 1);
  1347. /* ------------------------------------------------------------------------- */
  1348. /*       SET SIMPLE TRANSACTION                                              */
  1349. /* ------------------------------------------------------------------------- */
  1350.   LqhKeyReq::setSimpleFlag(Treqinfo, 1);
  1351. /* ------------------------------------------------------------------------- */
  1352. /* SET OPERATION TYPE AND LOCK MODE (NEVER READ OPERATION OR SCAN IN LOG)    */
  1353. /* ------------------------------------------------------------------------- */
  1354.   LqhKeyReq::setLockType(Treqinfo, regTcPtr->operation);
  1355.   LqhKeyReq::setOperation(Treqinfo, regTcPtr->operation);
  1356.   regTcPtr->reqinfo = Treqinfo;
  1357. /* ------------------------------------------------------------------------ */
  1358. /* NO OF BACKUP IS SET TO ONE AND NUMBER OF STANDBY NODES IS SET TO ZERO.   */
  1359. /* THUS THE RECEIVING NODE WILL EXPECT THAT IT IS THE LAST NODE AND WILL    */
  1360. /* SEND COMPLETED AS THE RESPONSE SIGNAL SINCE DIRTY_OP BIT IS SET.         */
  1361. /* ------------------------------------------------------------------------ */
  1362. /* ------------------------------------------------------------------------- */
  1363. /*       SET REPLICA TYPE TO PRIMARY AND NUMBER OF REPLICA TO ONE            */
  1364. /* ------------------------------------------------------------------------- */
  1365.   regTcPtr->lastReplicaNo = 0;
  1366.   regTcPtr->apiVersionNo = 0;
  1367.   regTcPtr->nextSeqNoReplica = 0;
  1368.   regTcPtr->opExec = 0;
  1369.   regTcPtr->storedProcId = ZNIL;
  1370.   regTcPtr->readlenAi = 0;
  1371.   regTcPtr->nodeAfterNext[0] = ZNIL;
  1372.   regTcPtr->nodeAfterNext[1] = ZNIL;
  1373.   regTcPtr->dirtyOp = ZFALSE;
  1374.   regTcPtr->tcBlockref = cownref;
  1375. }//Dblqh::initReqinfoExecSr()
  1376. /* -------------------------------------------------------------------------- 
  1377.  * -------               INSERT FRAGMENT                              ------- 
  1378.  *
  1379.  * ------------------------------------------------------------------------- */
  1380. bool Dblqh::insertFragrec(Signal* signal, Uint32 fragId) 
  1381. {
  1382.   terrorCode = ZOK;
  1383.   if (cfirstfreeFragrec == RNIL) {
  1384.     jam();
  1385.     terrorCode = ZNO_FREE_FRAGMENTREC;
  1386.     return false;
  1387.   }//if
  1388.   seizeFragmentrec(signal);
  1389.   for (Uint32 i = (MAX_FRAG_PER_NODE - 1); (Uint32)~i; i--) {
  1390.     jam();
  1391.     if (tabptr.p->fragid[i] == ZNIL) {
  1392.       jam();
  1393.       tabptr.p->fragid[i] = fragId;
  1394.       tabptr.p->fragrec[i] = fragptr.i;
  1395.       return true;
  1396.     }//if
  1397.   }//for
  1398.   terrorCode = ZTOO_MANY_FRAGMENTS;
  1399.   return false;
  1400. }//Dblqh::insertFragrec()
  1401. /* --------------------------------------------------------------------------
  1402.  * -------               LINK OPERATION IN ACTIVE LIST ON FRAGMENT    ------- 
  1403.  * 
  1404.  *       SUBROUTINE SHORT NAME: LFQ
  1405. // Input Pointers:
  1406. // tcConnectptr
  1407. // fragptr
  1408. * ------------------------------------------------------------------------- */
  1409. void Dblqh::linkFragQueue(Signal* signal) 
  1410. {
  1411.   TcConnectionrecPtr lfqTcConnectptr;
  1412.   TcConnectionrec * const regTcPtr = tcConnectptr.p;
  1413.   Fragrecord * const regFragPtr = fragptr.p;
  1414.   Uint32 tcIndex = tcConnectptr.i;
  1415.   lfqTcConnectptr.i = regFragPtr->lastWaitQueue;
  1416.   regTcPtr->nextTc = RNIL;
  1417.   regFragPtr->lastWaitQueue = tcIndex;
  1418.   regTcPtr->prevTc = lfqTcConnectptr.i;
  1419.   ndbrequire(regTcPtr->listState == TcConnectionrec::NOT_IN_LIST);
  1420.   regTcPtr->listState = TcConnectionrec::WAIT_QUEUE_LIST;
  1421.   if (lfqTcConnectptr.i != RNIL) {
  1422.     jam();
  1423.     ptrCheckGuard(lfqTcConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  1424.     lfqTcConnectptr.p->nextTc = tcIndex;
  1425.   } else {
  1426.     regFragPtr->firstWaitQueue = tcIndex;
  1427.   }//if
  1428.   return;
  1429. }//Dblqh::linkFragQueue()
  1430. /* ------------------------------------------------------------------------- 
  1431.  * -------               LINK OPERATION INTO WAITING FOR LOGGING     ------- 
  1432.  *                                             
  1433.  *       SUBROUTINE SHORT NAME = LWL
  1434. // Input Pointers:
  1435. // tcConnectptr
  1436. // logPartPtr
  1437.  * ------------------------------------------------------------------------- */
  1438. void Dblqh::linkWaitLog(Signal* signal, LogPartRecordPtr regLogPartPtr) 
  1439. {
  1440.   TcConnectionrecPtr lwlTcConnectptr;
  1441. /* -------------------------------------------------- */
  1442. /*       LINK ACTIVE OPERATION INTO QUEUE WAITING FOR */
  1443. /*       ACCESS TO THE LOG PART.                      */
  1444. /* -------------------------------------------------- */
  1445.   lwlTcConnectptr.i = regLogPartPtr.p->lastLogQueue;
  1446.   if (lwlTcConnectptr.i == RNIL) {
  1447.     jam();
  1448.     regLogPartPtr.p->firstLogQueue = tcConnectptr.i;
  1449.   } else {
  1450.     jam();
  1451.     ptrCheckGuard(lwlTcConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  1452.     lwlTcConnectptr.p->nextTcLogQueue = tcConnectptr.i;
  1453.   }//if
  1454.   regLogPartPtr.p->lastLogQueue = tcConnectptr.i;
  1455.   tcConnectptr.p->nextTcLogQueue = RNIL;
  1456.   if (regLogPartPtr.p->LogLqhKeyReqSent == ZFALSE) {
  1457.     jam();
  1458.     regLogPartPtr.p->LogLqhKeyReqSent = ZTRUE;
  1459.     signal->theData[0] = ZLOG_LQHKEYREQ;
  1460.     signal->theData[1] = regLogPartPtr.i;
  1461.     sendSignal(cownref, GSN_CONTINUEB, signal, 2, JBB);
  1462.   }//if
  1463. }//Dblqh::linkWaitLog()
  1464. /* --------------------------------------------------------------------------
  1465.  * -------          START THE NEXT OPERATION ON THIS LOG PART IF ANY  ------- 
  1466.  * -------               OPERATIONS ARE QUEUED.                       -------
  1467.  *
  1468.  *       SUBROUTINE SHORT NAME = LNS
  1469. // Input Pointers:
  1470. // tcConnectptr
  1471. // logPartPtr
  1472.  * ------------------------------------------------------------------------- */
  1473. void Dblqh::logNextStart(Signal* signal) 
  1474. {
  1475.   LogPartRecordPtr lnsLogPartPtr;
  1476.   UintR tlnsStillWaiting;
  1477.   LogPartRecord * const regLogPartPtr = logPartPtr.p;
  1478.   if ((regLogPartPtr->firstLogQueue == RNIL) &&
  1479.       (regLogPartPtr->logPartState == LogPartRecord::ACTIVE) &&
  1480.       (regLogPartPtr->waitWriteGciLog != LogPartRecord::WWGL_TRUE)) {
  1481. // --------------------------------------------------------------------------
  1482. // Optimised route for the common case
  1483. // -------------------------------------------------------------------------- 
  1484.     regLogPartPtr->logPartState = LogPartRecord::IDLE;
  1485.     return;
  1486.   }//if
  1487.   if (regLogPartPtr->firstLogQueue != RNIL) {
  1488.     jam();
  1489.     if (regLogPartPtr->LogLqhKeyReqSent == ZFALSE) {
  1490.       jam();
  1491.       regLogPartPtr->LogLqhKeyReqSent = ZTRUE;
  1492.       signal->theData[0] = ZLOG_LQHKEYREQ;
  1493.       signal->theData[1] = logPartPtr.i;
  1494.       sendSignal(cownref, GSN_CONTINUEB, signal, 2, JBB);
  1495.     }//if
  1496.   } else {
  1497.     if (regLogPartPtr->logPartState == LogPartRecord::ACTIVE) {
  1498.       jam();
  1499.       regLogPartPtr->logPartState = LogPartRecord::IDLE;
  1500.     } else {
  1501.       jam();
  1502.     }//if
  1503.   }//if
  1504.   if (regLogPartPtr->waitWriteGciLog != LogPartRecord::WWGL_TRUE) {
  1505.     jam();
  1506.     return;
  1507.   } else {
  1508.     jam();
  1509. /* -------------------------------------------------------------------------- 
  1510.  *   A COMPLETE GCI LOG RECORD IS WAITING TO BE WRITTEN. WE GIVE THIS HIGHEST
  1511.  *   PRIORITY AND WRITE IT IMMEDIATELY. AFTER WRITING IT WE CHECK IF ANY MORE
  1512.  *   LOG PARTS ARE WAITING. IF NOT WE SEND A SIGNAL THAT INITIALISES THE GCP 
  1513.  *   RECORD TO WAIT UNTIL ALL COMPLETE GCI LOG RECORDS HAVE REACHED TO DISK.
  1514.  * -------------------------------------------------------------------------- */
  1515.     writeCompletedGciLog(signal);
  1516.     logPartPtr.p->waitWriteGciLog = LogPartRecord::WWGL_FALSE;
  1517.     tlnsStillWaiting = ZFALSE;
  1518.     for (lnsLogPartPtr.i = 0; lnsLogPartPtr.i < 4; lnsLogPartPtr.i++) {
  1519.       jam();
  1520.       ptrAss(lnsLogPartPtr, logPartRecord);
  1521.       if (lnsLogPartPtr.p->waitWriteGciLog == LogPartRecord::WWGL_TRUE) {
  1522.         jam();
  1523.         tlnsStillWaiting = ZTRUE;
  1524.       }//if
  1525.     }//for
  1526.     if (tlnsStillWaiting == ZFALSE) {
  1527.       jam();
  1528.       signal->theData[0] = ZINIT_GCP_REC;
  1529.       sendSignal(cownref, GSN_CONTINUEB, signal, 1, JBB);
  1530.     }//if
  1531.   }//if
  1532. }//Dblqh::logNextStart()
  1533. /* -------------------------------------------------------------------------- 
  1534.  * -------       MOVE PAGES FROM LFO RECORD TO PAGE REFERENCE RECORD  ------- 
  1535.  *               WILL ALWAYS MOVE 8 PAGES TO A PAGE REFERENCE RECORD.
  1536.  *
  1537.  *       SUBROUTINE SHORT NAME = MPR 
  1538.  * ------------------------------------------------------------------------- */
  1539. void Dblqh::moveToPageRef(Signal* signal) 
  1540. {
  1541.   LogPageRecordPtr mprLogPagePtr;
  1542.   PageRefRecordPtr mprPageRefPtr;
  1543.   UintR tmprIndex;
  1544. /* -------------------------------------------------------------------------- 
  1545.  * -------       INSERT PAGE REFERENCE RECORD                         ------- 
  1546.  *
  1547.  *       INPUT:  LFO_PTR         LOG FILE OPERATION RECORD
  1548.  *               LOG_PART_PTR    LOG PART RECORD
  1549.  *               PAGE_REF_PTR    THE PAGE REFERENCE RECORD TO BE INSERTED.
  1550.  * ------------------------------------------------------------------------- */
  1551.   PageRefRecordPtr iprPageRefPtr;
  1552.   if ((logPartPtr.p->mmBufferSize + 8) >= ZMAX_MM_BUFFER_SIZE) {
  1553.     jam();
  1554.     pageRefPtr.i = logPartPtr.p->firstPageRef;
  1555.     ptrCheckGuard(pageRefPtr, cpageRefFileSize, pageRefRecord);
  1556.     releasePrPages(signal);
  1557.     removePageRef(signal);
  1558.   } else {
  1559.     jam();
  1560.     logPartPtr.p->mmBufferSize = logPartPtr.p->mmBufferSize + 8;
  1561.   }//if
  1562.   seizePageRef(signal);
  1563.   if (logPartPtr.p->firstPageRef == RNIL) {
  1564.     jam();
  1565.     logPartPtr.p->firstPageRef = pageRefPtr.i;
  1566.   } else {
  1567.     jam();
  1568.     iprPageRefPtr.i = logPartPtr.p->lastPageRef;
  1569.     ptrCheckGuard(iprPageRefPtr, cpageRefFileSize, pageRefRecord);
  1570.     iprPageRefPtr.p->prNext = pageRefPtr.i;
  1571.   }//if
  1572.   pageRefPtr.p->prPrev = logPartPtr.p->lastPageRef;
  1573.   logPartPtr.p->lastPageRef = pageRefPtr.i;
  1574.   pageRefPtr.p->prFileNo = logFilePtr.p->fileNo;
  1575.   pageRefPtr.p->prPageNo = lfoPtr.p->lfoPageNo;
  1576.   tmprIndex = 0;
  1577.   mprLogPagePtr.i = lfoPtr.p->firstLfoPage;
  1578. MPR_LOOP:
  1579.   arrGuard(tmprIndex, 8);
  1580.   pageRefPtr.p->pageRef[tmprIndex] = mprLogPagePtr.i;
  1581.   tmprIndex = tmprIndex + 1;
  1582.   ptrCheckGuard(mprLogPagePtr, clogPageFileSize, logPageRecord);
  1583.   mprLogPagePtr.i = mprLogPagePtr.p->logPageWord[ZNEXT_PAGE];
  1584.   if (mprLogPagePtr.i != RNIL) {
  1585.     jam();
  1586.     goto MPR_LOOP;
  1587.   }//if
  1588.   mprPageRefPtr.i = pageRefPtr.p->prPrev;
  1589.   if (mprPageRefPtr.i != RNIL) {
  1590.     jam();
  1591.     ptrCheckGuard(mprPageRefPtr, cpageRefFileSize, pageRefRecord);
  1592.     mprLogPagePtr.i = mprPageRefPtr.p->pageRef[7];
  1593.     ptrCheckGuard(mprLogPagePtr, clogPageFileSize, logPageRecord);
  1594.     mprLogPagePtr.p->logPageWord[ZNEXT_PAGE] = pageRefPtr.p->pageRef[0];
  1595.   }//if
  1596. }//Dblqh::moveToPageRef()
  1597. /* ------------------------------------------------------------------------- */
  1598. /* -------               READ THE ATTRINFO FROM THE LOG              ------- */
  1599. /*                                                                           */
  1600. /*       SUBROUTINE SHORT NAME = RA                                          */
  1601. /* ------------------------------------------------------------------------- */
  1602. void Dblqh::readAttrinfo(Signal* signal) 
  1603. {
  1604.   Uint32 remainingLen = tcConnectptr.p->totSendlenAi;
  1605.   if (remainingLen == 0) {
  1606.     jam();
  1607.     tcConnectptr.p->reclenAiLqhkey = 0;
  1608.     return;
  1609.   }//if
  1610.   Uint32 dataLen = remainingLen;
  1611.   if (remainingLen > 5)
  1612.     dataLen = 5;
  1613.   readLogData(signal, dataLen, &tcConnectptr.p->firstAttrinfo[0]);
  1614.   tcConnectptr.p->reclenAiLqhkey = dataLen;
  1615.   remainingLen -= dataLen;
  1616.   while (remainingLen > 0) {
  1617.     jam();
  1618.     dataLen = remainingLen;
  1619.     if (remainingLen > 22)
  1620.       dataLen = 22;
  1621.     seizeAttrinbuf(signal);
  1622.     readLogData(signal, dataLen, &attrinbufptr.p->attrbuf[0]);
  1623.     attrinbufptr.p->attrbuf[ZINBUF_DATA_LEN] = dataLen;
  1624.     remainingLen -= dataLen;
  1625.   }//while
  1626. }//Dblqh::readAttrinfo()
  1627. /* ------------------------------------------------------------------------- */
  1628. /* -------               READ COMMIT LOG                             ------- */
  1629. /*                                                                           */
  1630. /*       SUBROUTINE SHORT NAME = RCL                                         */
  1631. /* ------------------------------------------------------------------------- */
  1632. void Dblqh::readCommitLog(Signal* signal, CommitLogRecord* commitLogRecord) 
  1633. {
  1634.   Uint32 trclPageIndex = logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX];
  1635.   if ((trclPageIndex + (ZCOMMIT_LOG_SIZE - 1)) < ZPAGE_SIZE) {
  1636.     jam();
  1637.     tcConnectptr.p->tableref = logPagePtr.p->logPageWord[trclPageIndex + 0];
  1638.     tcConnectptr.p->schemaVersion = logPagePtr.p->logPageWord[trclPageIndex + 1];
  1639.     tcConnectptr.p->fragmentid = logPagePtr.p->logPageWord[trclPageIndex + 2];
  1640.     commitLogRecord->fileNo = logPagePtr.p->logPageWord[trclPageIndex + 3];
  1641.     commitLogRecord->startPageNo = logPagePtr.p->logPageWord[trclPageIndex + 4];
  1642.     commitLogRecord->startPageIndex = logPagePtr.p->logPageWord[trclPageIndex + 5];
  1643.     commitLogRecord->stopPageNo = logPagePtr.p->logPageWord[trclPageIndex + 6];
  1644.     tcConnectptr.p->gci = logPagePtr.p->logPageWord[trclPageIndex + 7];
  1645.     logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = 
  1646.                             (trclPageIndex + ZCOMMIT_LOG_SIZE) - 1;
  1647.   } else {
  1648.     jam();
  1649.     tcConnectptr.p->tableref = readLogword(signal);
  1650.     tcConnectptr.p->schemaVersion = readLogword(signal);
  1651.     tcConnectptr.p->fragmentid = readLogword(signal);
  1652.     commitLogRecord->fileNo = readLogword(signal);
  1653.     commitLogRecord->startPageNo = readLogword(signal);
  1654.     commitLogRecord->startPageIndex = readLogword(signal);
  1655.     commitLogRecord->stopPageNo = readLogword(signal);
  1656.     tcConnectptr.p->gci = readLogword(signal);
  1657.   }//if
  1658.   tcConnectptr.p->transid[0] = logPartPtr.i + 65536;  
  1659.   tcConnectptr.p->transid[1] = (DBLQH << 20) + (cownNodeid << 8);  
  1660. }//Dblqh::readCommitLog()
  1661. /* ------------------------------------------------------------------------- */
  1662. /* -------        READ LOG PAGES FROM DISK IN ORDER TO EXECUTE A LOG ------- */
  1663. /*                RECORD WHICH WAS NOT FOUND IN MAIN MEMORY.                 */
  1664. /*                                                                           */
  1665. /*       SUBROUTINE SHORT NAME = REL                                         */
  1666. /* ------------------------------------------------------------------------- */
  1667. void Dblqh::readExecLog(Signal* signal) 
  1668. {
  1669.   UintR trelIndex;
  1670.   UintR trelI;
  1671.   seizeLfo(signal);
  1672.   initLfo(signal);
  1673.   trelI = logPartPtr.p->execSrStopPageNo - logPartPtr.p->execSrStartPageNo;
  1674.   arrGuard(trelI + 1, 16);
  1675.   lfoPtr.p->logPageArray[trelI + 1] = logPartPtr.p->execSrStartPageNo;
  1676.   for (trelIndex = logPartPtr.p->execSrStopPageNo; (trelIndex >= logPartPtr.p->execSrStartPageNo) && 
  1677.        (UintR)~trelIndex; trelIndex--) {
  1678.     jam();
  1679.     seizeLogpage(signal);
  1680.     arrGuard(trelI, 16);
  1681.     lfoPtr.p->logPageArray[trelI] = logPagePtr.i;
  1682.     trelI--;
  1683.   }//for
  1684.   lfoPtr.p->lfoPageNo = logPartPtr.p->execSrStartPageNo;
  1685.   lfoPtr.p->noPagesRw = (logPartPtr.p->execSrStopPageNo - 
  1686.  logPartPtr.p->execSrStartPageNo) + 1;
  1687.   lfoPtr.p->firstLfoPage = lfoPtr.p->logPageArray[0];
  1688.   signal->theData[0] = logFilePtr.p->fileRef;
  1689.   signal->theData[1] = cownref;
  1690.   signal->theData[2] = lfoPtr.i;
  1691.   signal->theData[3] = ZLIST_OF_MEM_PAGES; // edtjamo TR509 //ZLIST_OF_PAIRS;
  1692.   signal->theData[4] = ZVAR_NO_LOG_PAGE_WORD;
  1693.   signal->theData[5] = lfoPtr.p->noPagesRw;
  1694.   signal->theData[6] = lfoPtr.p->logPageArray[0];
  1695.   signal->theData[7] = lfoPtr.p->logPageArray[1];
  1696.   signal->theData[8] = lfoPtr.p->logPageArray[2];
  1697.   signal->theData[9] = lfoPtr.p->logPageArray[3];
  1698.   signal->theData[10] = lfoPtr.p->logPageArray[4];
  1699.   signal->theData[11] = lfoPtr.p->logPageArray[5];
  1700.   signal->theData[12] = lfoPtr.p->logPageArray[6];
  1701.   signal->theData[13] = lfoPtr.p->logPageArray[7];
  1702.   signal->theData[14] = lfoPtr.p->logPageArray[8];
  1703.   signal->theData[15] = lfoPtr.p->logPageArray[9];
  1704.   sendSignal(NDBFS_REF, GSN_FSREADREQ, signal, 16, JBA);
  1705. }//Dblqh::readExecLog()
  1706. /* ------------------------------------------------------------------------- */
  1707. /* -------        READ 64 KBYTES WHEN EXECUTING THE FRAGMENT LOG     ------- */
  1708. /*                                                                           */
  1709. /*       SUBROUTINE SHORT NAME = RES                                         */
  1710. /* ------------------------------------------------------------------------- */
  1711. void Dblqh::readExecSrNewMbyte(Signal* signal) 
  1712. {
  1713.   logFilePtr.p->currentFilepage = logFilePtr.p->currentMbyte * ZPAGES_IN_MBYTE;
  1714.   logFilePtr.p->filePosition = logFilePtr.p->currentMbyte * ZPAGES_IN_MBYTE;
  1715.   logPartPtr.p->execSrPagesRead = 0;
  1716.   logPartPtr.p->execSrPagesReading = 0;
  1717.   logPartPtr.p->execSrPagesExecuted = 0;
  1718.   readExecSr(signal);
  1719.   logPartPtr.p->logExecState = LogPartRecord::LES_WAIT_READ_EXEC_SR_NEW_MBYTE;
  1720. }//Dblqh::readExecSrNewMbyte()
  1721. /* ------------------------------------------------------------------------- */
  1722. /* -------        READ 64 KBYTES WHEN EXECUTING THE FRAGMENT LOG     ------- */
  1723. /*                                                                           */
  1724. /*       SUBROUTINE SHORT NAME = RES                                         */
  1725. /* ------------------------------------------------------------------------- */
  1726. void Dblqh::readExecSr(Signal* signal) 
  1727. {
  1728.   UintR tresPageid;
  1729.   UintR tresIndex;
  1730.   tresPageid = logFilePtr.p->filePosition;
  1731.   seizeLfo(signal);
  1732.   initLfo(signal);
  1733.   for (tresIndex = 7; (UintR)~tresIndex; tresIndex--) {
  1734.     jam();
  1735. /* ------------------------------------------------------------------------- */
  1736. /* GO BACKWARDS SINCE WE INSERT AT THE BEGINNING AND WE WANT THAT FIRST PAGE */
  1737. /* SHALL BE FIRST AND LAST PAGE LAST.                                        */
  1738. /* ------------------------------------------------------------------------- */
  1739.     seizeLogpage(signal);
  1740.     lfoPtr.p->logPageArray[tresIndex] = logPagePtr.i;
  1741.   }//for
  1742.   lfoPtr.p->lfoState = LogFileOperationRecord::READ_EXEC_SR;
  1743.   lfoPtr.p->lfoPageNo = tresPageid;
  1744.   logFilePtr.p->filePosition = logFilePtr.p->filePosition + 8;
  1745.   logPartPtr.p->execSrPagesReading = logPartPtr.p->execSrPagesReading + 8;
  1746.   lfoPtr.p->noPagesRw = 8;
  1747.   lfoPtr.p->firstLfoPage = lfoPtr.p->logPageArray[0];
  1748.   signal->theData[0] = logFilePtr.p->fileRef;
  1749.   signal->theData[1] = cownref;
  1750.   signal->theData[2] = lfoPtr.i;
  1751.   signal->theData[3] = ZLIST_OF_MEM_PAGES;
  1752.   signal->theData[4] = ZVAR_NO_LOG_PAGE_WORD;
  1753.   signal->theData[5] = 8;
  1754.   signal->theData[6] = lfoPtr.p->logPageArray[0];
  1755.   signal->theData[7] = lfoPtr.p->logPageArray[1];
  1756.   signal->theData[8] = lfoPtr.p->logPageArray[2];
  1757.   signal->theData[9] = lfoPtr.p->logPageArray[3];
  1758.   signal->theData[10] = lfoPtr.p->logPageArray[4];
  1759.   signal->theData[11] = lfoPtr.p->logPageArray[5];
  1760.   signal->theData[12] = lfoPtr.p->logPageArray[6];
  1761.   signal->theData[13] = lfoPtr.p->logPageArray[7];
  1762.   signal->theData[14] = tresPageid;
  1763.   sendSignal(NDBFS_REF, GSN_FSREADREQ, signal, 15, JBA);
  1764. }//Dblqh::readExecSr()
  1765. /* ------------------------------------------------------------------------- */
  1766. /* ------------ READ THE PRIMARY KEY FROM THE LOG           ---------------- */
  1767. /*                                                                           */
  1768. /*       SUBROUTINE SHORT NAME = RK                                          */
  1769. /* --------------------------------------------------------------------------*/
  1770. void Dblqh::readKey(Signal* signal) 
  1771. {
  1772.   Uint32 remainingLen = tcConnectptr.p->primKeyLen;
  1773.   ndbrequire(remainingLen != 0);
  1774.   Uint32 dataLen = remainingLen;
  1775.   if (remainingLen > 4)
  1776.     dataLen = 4;
  1777.   readLogData(signal, dataLen, &tcConnectptr.p->tupkeyData[0]);
  1778.   remainingLen -= dataLen;
  1779.   while (remainingLen > 0) {
  1780.     jam();
  1781.     seizeTupkeybuf(signal);
  1782.     dataLen = remainingLen;
  1783.     if (dataLen > 4)
  1784.       dataLen = 4;
  1785.     readLogData(signal, dataLen, &databufptr.p->data[0]);
  1786.     remainingLen -= dataLen;
  1787.   }//while
  1788. }//Dblqh::readKey()
  1789. /* ------------------------------------------------------------------------- */
  1790. /* ------------ READ A NUMBER OF WORDS FROM LOG INTO CDATA  ---------------- */
  1791. /*                                                                           */
  1792. /*       SUBROUTINE SHORT NAME = RLD                                         */
  1793. /* --------------------------------------------------------------------------*/
  1794. void Dblqh::readLogData(Signal* signal, Uint32 noOfWords, Uint32* dataPtr) 
  1795. {
  1796.   ndbrequire(noOfWords < 32);
  1797.   Uint32 logPos = logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX];
  1798.   if ((logPos + noOfWords) >= ZPAGE_SIZE) {
  1799.     for (Uint32 i = 0; i < noOfWords; i++)
  1800.       dataPtr[i] = readLogwordExec(signal);
  1801.   } else {
  1802.     MEMCOPY_NO_WORDS(dataPtr, &logPagePtr.p->logPageWord[logPos], noOfWords);
  1803.     logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = logPos + noOfWords;
  1804.   }//if
  1805. }//Dblqh::readLogData()
  1806. /* ------------------------------------------------------------------------- */
  1807. /* ------------ READ THE LOG HEADER OF A PREPARE LOG HEADER ---------------- */
  1808. /*                                                                           */
  1809. /*       SUBROUTINE SHORT NAME = RLH                                         */
  1810. /* --------------------------------------------------------------------------*/
  1811. void Dblqh::readLogHeader(Signal* signal) 
  1812. {
  1813.   Uint32 logPos = logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX];
  1814.   if ((logPos + ZLOG_HEAD_SIZE) < ZPAGE_SIZE) { 
  1815.     jam();
  1816.     tcConnectptr.p->hashValue = logPagePtr.p->logPageWord[logPos + 2];
  1817.     tcConnectptr.p->operation = logPagePtr.p->logPageWord[logPos + 3];
  1818.     tcConnectptr.p->totSendlenAi = logPagePtr.p->logPageWord[logPos + 4];
  1819.     tcConnectptr.p->primKeyLen = logPagePtr.p->logPageWord[logPos + 5];
  1820.     logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = logPos + ZLOG_HEAD_SIZE;
  1821.   } else {
  1822.     jam();
  1823.     readLogwordExec(signal); /* IGNORE PREPARE LOG RECORD TYPE */
  1824.     readLogwordExec(signal); /* IGNORE LOG RECORD SIZE         */
  1825.     tcConnectptr.p->hashValue = readLogwordExec(signal);
  1826.     tcConnectptr.p->operation = readLogwordExec(signal);
  1827.     tcConnectptr.p->totSendlenAi = readLogwordExec(signal);
  1828.     tcConnectptr.p->primKeyLen = readLogwordExec(signal);
  1829.   }//if
  1830. }//Dblqh::readLogHeader()
  1831. /* ------------------------------------------------------------------------- */
  1832. /* -------               READ A WORD FROM THE LOG                    ------- */
  1833. /*                                                                           */
  1834. /*       OUTPUT:         TLOG_WORD                                           */
  1835. /*       SUBROUTINE SHORT NAME = RLW                                         */
  1836. /* ------------------------------------------------------------------------- */
  1837. Uint32 Dblqh::readLogword(Signal* signal) 
  1838. {
  1839.   Uint32 logPos = logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX];
  1840.   ndbrequire(logPos < ZPAGE_SIZE);
  1841.   Uint32 logWord = logPagePtr.p->logPageWord[logPos];
  1842.   logPos++;
  1843.   logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = logPos;
  1844.   if (logPos >= ZPAGE_SIZE) {
  1845.     jam();
  1846.     logPagePtr.i = logPagePtr.p->logPageWord[ZNEXT_PAGE];
  1847.     ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord);
  1848.     logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = ZPAGE_HEADER_SIZE;
  1849.     logFilePtr.p->currentLogpage = logPagePtr.i;
  1850.     logFilePtr.p->currentFilepage++;
  1851.     logPartPtr.p->execSrPagesRead--;
  1852.     logPartPtr.p->execSrPagesExecuted++;
  1853.   }//if
  1854.   return logWord;
  1855. }//Dblqh::readLogword()
  1856. /* ------------------------------------------------------------------------- */
  1857. /* -------   READ A WORD FROM THE LOG WHEN EXECUTING A LOG RECORD    ------- */
  1858. /*                                                                           */
  1859. /*       OUTPUT:         TLOG_WORD                                           */
  1860. /*       SUBROUTINE SHORT NAME = RWE                                         */
  1861. /* ------------------------------------------------------------------------- */
  1862. Uint32 Dblqh::readLogwordExec(Signal* signal) 
  1863. {
  1864.   Uint32 logPos = logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX];
  1865.   ndbrequire(logPos < ZPAGE_SIZE);
  1866.   Uint32 logWord = logPagePtr.p->logPageWord[logPos];
  1867.   logPos++;
  1868.   logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = logPos;
  1869.   if (logPos >= ZPAGE_SIZE) {
  1870.     jam();
  1871.     logPagePtr.i = logPagePtr.p->logPageWord[ZNEXT_PAGE];
  1872.     if (logPagePtr.i != RNIL){
  1873.       ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord);
  1874.       logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = ZPAGE_HEADER_SIZE;
  1875.     } else {
  1876.       // Reading word at the last pos in the last page
  1877.       // Don't step forward to next page!
  1878.       jam();
  1879.       logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX]++;
  1880.     }
  1881.   }//if
  1882.   return logWord;
  1883. }//Dblqh::readLogwordExec()
  1884. /* ------------------------------------------------------------------------- */
  1885. /* -------               READ A SINGLE PAGE FROM THE LOG             ------- */
  1886. /*                                                                           */
  1887. /*       INPUT:          TRSP_PAGE_NO                                        */
  1888. /*       SUBROUTINE SHORT NAME = RSP                                         */
  1889. /* ------------------------------------------------------------------------- */
  1890. void Dblqh::readSinglePage(Signal* signal, Uint32 pageNo) 
  1891. {
  1892.   seizeLfo(signal);
  1893.   initLfo(signal);
  1894.   seizeLogpage(signal);
  1895.   lfoPtr.p->firstLfoPage = logPagePtr.i;
  1896.   lfoPtr.p->lfoPageNo = pageNo;
  1897.   lfoPtr.p->noPagesRw = 1;
  1898.   signal->theData[0] = logFilePtr.p->fileRef;
  1899.   signal->theData[1] = cownref;
  1900.   signal->theData[2] = lfoPtr.i;
  1901.   signal->theData[3] = ZLIST_OF_PAIRS;
  1902.   signal->theData[4] = ZVAR_NO_LOG_PAGE_WORD;
  1903.   signal->theData[5] = 1;
  1904.   signal->theData[6] = logPagePtr.i;
  1905.   signal->theData[7] = pageNo;
  1906.   sendSignal(NDBFS_REF, GSN_FSREADREQ, signal, 8, JBA);
  1907. }//Dblqh::readSinglePage()
  1908. /* --------------------------------------------------------------------------
  1909.  * -------         RELEASE OPERATION FROM ACTIVE LIST ON FRAGMENT     ------- 
  1910.  * 
  1911.  *       SUBROUTINE SHORT NAME = RAC
  1912.  * ------------------------------------------------------------------------- */
  1913. void Dblqh::releaseAccList(Signal* signal) 
  1914. {
  1915.   TcConnectionrecPtr racTcNextConnectptr;
  1916.   TcConnectionrecPtr racTcPrevConnectptr;
  1917.   fragptr.i = tcConnectptr.p->fragmentptr;
  1918.   ptrCheckGuard(fragptr, cfragrecFileSize, fragrecord);
  1919.   racTcPrevConnectptr.i = tcConnectptr.p->prevTc;
  1920.   racTcNextConnectptr.i = tcConnectptr.p->nextTc;
  1921.   if (tcConnectptr.p->listState != TcConnectionrec::ACC_BLOCK_LIST) {
  1922.     jam();
  1923.     systemError(signal);
  1924.   }//if
  1925.   tcConnectptr.p->listState = TcConnectionrec::NOT_IN_LIST;
  1926.   if (racTcNextConnectptr.i != RNIL) {
  1927.     jam();
  1928.     ptrCheckGuard(racTcNextConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  1929.     racTcNextConnectptr.p->prevTc = racTcPrevConnectptr.i;
  1930.   }//if
  1931.   if (racTcPrevConnectptr.i != RNIL) {
  1932.     jam();
  1933.     ptrCheckGuard(racTcPrevConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  1934.     racTcPrevConnectptr.p->nextTc = tcConnectptr.p->nextTc;
  1935.   } else {
  1936.     jam();
  1937.     /* ---------------------------------------------------------------------
  1938.      *    OPERATION RECORD IS FIRST IN ACTIVE LIST
  1939.      *    THIS MEANS THAT THERE EXISTS NO PREVIOUS TC THAT NEEDS TO BE UPDATED.
  1940.      * --------------------------------------------------------------------- */
  1941.     fragptr.p->accBlockedList = racTcNextConnectptr.i;
  1942.   }//if
  1943. }//Dblqh::releaseAccList()
  1944. /* -------------------------------------------------------------------------- 
  1945.  * -------       REMOVE COPY FRAGMENT FROM ACTIVE COPY LIST           ------- 
  1946.  *
  1947.  * ------------------------------------------------------------------------- */
  1948. void Dblqh::releaseActiveCopy(Signal* signal) 
  1949. {
  1950.                                                 /* MUST BE 8 BIT */
  1951.   UintR tracFlag;
  1952.   UintR tracIndex;
  1953.   tracFlag = ZFALSE;
  1954.   for (tracIndex = 0; tracIndex < 4; tracIndex++) {
  1955.     if (tracFlag == ZFALSE) {
  1956.       jam();
  1957.       if (cactiveCopy[tracIndex] == fragptr.i) {
  1958.         jam();
  1959.         tracFlag = ZTRUE;
  1960.       }//if
  1961.     } else {
  1962.       if (tracIndex < 3) {
  1963.         jam();
  1964.         cactiveCopy[tracIndex - 1] = cactiveCopy[tracIndex];
  1965.       } else {
  1966.         jam();
  1967.         cactiveCopy[3] = RNIL;
  1968.       }//if
  1969.     }//if
  1970.   }//for
  1971.   ndbrequire(tracFlag == ZTRUE);
  1972.   cnoActiveCopy--;
  1973. }//Dblqh::releaseActiveCopy()
  1974. /* --------------------------------------------------------------------------
  1975.  * -------        RELEASE OPERATION FROM ACTIVE LIST ON FRAGMENT      ------- 
  1976.  * 
  1977.  *       SUBROUTINE SHORT NAME = RAL
  1978.  * ------------------------------------------------------------------------- */
  1979. void Dblqh::releaseActiveList(Signal* signal) 
  1980. {
  1981.   TcConnectionrecPtr ralTcNextConnectptr;
  1982.   TcConnectionrecPtr ralTcPrevConnectptr;
  1983.   ralTcPrevConnectptr.i = tcConnectptr.p->prevTc;
  1984.   ralTcNextConnectptr.i = tcConnectptr.p->nextTc;
  1985.   ndbrequire(tcConnectptr.p->listState == TcConnectionrec::IN_ACTIVE_LIST);
  1986.   tcConnectptr.p->listState = TcConnectionrec::NOT_IN_LIST;
  1987.   if (ralTcNextConnectptr.i != RNIL) {
  1988.     jam();
  1989.     ptrCheckGuard(ralTcNextConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  1990.     ralTcNextConnectptr.p->prevTc = ralTcPrevConnectptr.i;
  1991.   }//if
  1992.   if (ralTcPrevConnectptr.i != RNIL) {
  1993.     jam();
  1994.     ptrCheckGuard(ralTcPrevConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  1995.     ralTcPrevConnectptr.p->nextTc = tcConnectptr.p->nextTc;
  1996.   } else {
  1997.     jam();
  1998.     /* ----------------------------------------------------------------------
  1999.      *   OPERATION RECORD IS FIRST IN ACTIVE LIST
  2000.      *   THIS MEANS THAT THERE EXISTS NO PREVIOUS TC THAT NEEDS TO BE UPDATED.
  2001.      * --------------------------------------------------------------------- */
  2002.     fragptr.p->activeList = ralTcNextConnectptr.i;
  2003.   }//if
  2004. }//Dblqh::releaseActiveList()
  2005. /* --------------------------------------------------------------------------
  2006.  * -------       RELEASE ADD FRAGMENT RECORD                          ------- 
  2007.  *
  2008.  * ------------------------------------------------------------------------- */
  2009. void Dblqh::releaseAddfragrec(Signal* signal) 
  2010. {
  2011.   addfragptr.p->addfragStatus = AddFragRecord::FREE;
  2012.   addfragptr.p->nextAddfragrec = cfirstfreeAddfragrec;
  2013.   cfirstfreeAddfragrec = addfragptr.i;
  2014. }//Dblqh::releaseAddfragrec()
  2015. /* --------------------------------------------------------------------------
  2016.  * -------       RELEASE FRAGMENT RECORD                              -------
  2017.  *
  2018.  * ------------------------------------------------------------------------- */
  2019. void Dblqh::releaseFragrec() 
  2020. {
  2021.   fragptr.p->fragStatus = Fragrecord::FREE;
  2022.   fragptr.p->nextFrag = cfirstfreeFragrec;
  2023.   cfirstfreeFragrec = fragptr.i;
  2024. }//Dblqh::releaseFragrec()
  2025. /* --------------------------------------------------------------------------
  2026.  * -------       RELEASE LCP LOCAL RECORD                             ------- 
  2027.  * 
  2028.  * ------------------------------------------------------------------------- */
  2029. void Dblqh::releaseLcpLoc(Signal* signal) 
  2030. {
  2031.   lcpLocptr.p->lcpLocstate = LcpLocRecord::IDLE;
  2032.   lcpLocptr.p->nextLcpLoc = cfirstfreeLcpLoc;
  2033.   cfirstfreeLcpLoc = lcpLocptr.i;
  2034. }//Dblqh::releaseLcpLoc()
  2035. /* --------------------------------------------------------------------------
  2036.  * -------     RELEASE A PAGE REFERENCE RECORD.                       ------- 
  2037.  *
  2038.  * ------------------------------------------------------------------------- */
  2039. void Dblqh::releasePageRef(Signal* signal) 
  2040. {
  2041.   pageRefPtr.p->prNext = cfirstfreePageRef;
  2042.   cfirstfreePageRef = pageRefPtr.i;
  2043. }//Dblqh::releasePageRef()
  2044. /* --------------------------------------------------------------------------
  2045.  * --- RELEASE ALL PAGES IN THE MM BUFFER AFTER EXECUTING THE LOG ON IT. ---- 
  2046.  * 
  2047.  * ------------------------------------------------------------------------- */
  2048. void Dblqh::releaseMmPages(Signal* signal) 
  2049. {
  2050. RMP_LOOP:
  2051.   jam();
  2052.   pageRefPtr.i = logPartPtr.p->firstPageRef;
  2053.   if (pageRefPtr.i != RNIL) {
  2054.     jam();
  2055.     ptrCheckGuard(pageRefPtr, cpageRefFileSize, pageRefRecord);
  2056.     releasePrPages(signal);
  2057.     removePageRef(signal);
  2058.     goto RMP_LOOP;
  2059.   }//if
  2060. }//Dblqh::releaseMmPages()
  2061. /* --------------------------------------------------------------------------
  2062.  * -------     RELEASE A SET OF PAGES AFTER EXECUTING THE LOG ON IT.  ------- 
  2063.  * 
  2064.  * ------------------------------------------------------------------------- */
  2065. void Dblqh::releasePrPages(Signal* signal) 
  2066. {
  2067.   UintR trppIndex;
  2068.   for (trppIndex = 0; trppIndex <= 7; trppIndex++) {
  2069.     jam();
  2070.     logPagePtr.i = pageRefPtr.p->pageRef[trppIndex];
  2071.     ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord);
  2072.     releaseLogpage(signal);
  2073.   }//for
  2074. }//Dblqh::releasePrPages()
  2075. /* --------------------------------------------------------------------------
  2076.  * -------  RELEASE OPERATION FROM WAIT QUEUE LIST ON FRAGMENT        ------- 
  2077.  *
  2078.  *       SUBROUTINE SHORT NAME : RWA
  2079.  * ------------------------------------------------------------------------- */
  2080. void Dblqh::releaseWaitQueue(Signal* signal) 
  2081. {
  2082.   TcConnectionrecPtr rwaTcNextConnectptr;
  2083.   TcConnectionrecPtr rwaTcPrevConnectptr;
  2084.   fragptr.i = tcConnectptr.p->fragmentptr;
  2085.   ptrCheckGuard(fragptr, cfragrecFileSize, fragrecord);
  2086.   rwaTcPrevConnectptr.i = tcConnectptr.p->prevTc;
  2087.   rwaTcNextConnectptr.i = tcConnectptr.p->nextTc;
  2088.   if (tcConnectptr.p->listState != TcConnectionrec::WAIT_QUEUE_LIST) {
  2089.     jam();
  2090.     systemError(signal);
  2091.   }//if
  2092.   tcConnectptr.p->listState = TcConnectionrec::NOT_IN_LIST;
  2093.   if (rwaTcNextConnectptr.i != RNIL) {
  2094.     jam();
  2095.     ptrCheckGuard(rwaTcNextConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  2096.     rwaTcNextConnectptr.p->prevTc = rwaTcPrevConnectptr.i;
  2097.   } else {
  2098.     jam();
  2099.     fragptr.p->lastWaitQueue = rwaTcPrevConnectptr.i;
  2100.   }//if
  2101.   if (rwaTcPrevConnectptr.i != RNIL) {
  2102.     jam();
  2103.     ptrCheckGuard(rwaTcPrevConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  2104.     rwaTcPrevConnectptr.p->nextTc = rwaTcNextConnectptr.i;
  2105.   } else {
  2106.     jam();
  2107.     fragptr.p->firstWaitQueue = rwaTcNextConnectptr.i;
  2108.   }//if
  2109. }//Dblqh::releaseWaitQueue()
  2110. /* -------------------------------------------------------------------------- 
  2111.  * -------  REMOVE OPERATION RECORD FROM LIST ON LOG PART OF NOT      ------- 
  2112.  *               COMPLETED OPERATIONS IN THE LOG.
  2113.  *
  2114.  *       SUBROUTINE SHORT NAME = RLO
  2115.  * ------------------------------------------------------------------------- */
  2116. void Dblqh::removeLogTcrec(Signal* signal) 
  2117. {
  2118.   TcConnectionrecPtr rloTcNextConnectptr;
  2119.   TcConnectionrecPtr rloTcPrevConnectptr;
  2120.   rloTcPrevConnectptr.i = tcConnectptr.p->prevLogTcrec;
  2121.   rloTcNextConnectptr.i = tcConnectptr.p->nextLogTcrec;
  2122.   if (rloTcNextConnectptr.i != RNIL) {
  2123.     jam();
  2124.     ptrCheckGuard(rloTcNextConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  2125.     rloTcNextConnectptr.p->prevLogTcrec = rloTcPrevConnectptr.i;
  2126.   } else {
  2127.     jam();
  2128.     logPartPtr.p->lastLogTcrec = rloTcPrevConnectptr.i;
  2129.   }//if
  2130.   if (rloTcPrevConnectptr.i != RNIL) {
  2131.     jam();
  2132.     ptrCheckGuard(rloTcPrevConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  2133.     rloTcPrevConnectptr.p->nextLogTcrec = rloTcNextConnectptr.i;
  2134.   } else {
  2135.     jam();
  2136.     logPartPtr.p->firstLogTcrec = rloTcNextConnectptr.i;
  2137.   }//if
  2138. }//Dblqh::removeLogTcrec()
  2139. /* --------------------------------------------------------------------------
  2140.  * -------  REMOVE PAGE REFERENCE RECORD FROM LIST IN THIS LOG PART   ------- 
  2141.  * 
  2142.  *       SUBROUTINE SHORT NAME = RPR
  2143.  * ------------------------------------------------------------------------- */
  2144. void Dblqh::removePageRef(Signal* signal) 
  2145. {
  2146.   PageRefRecordPtr rprPageRefPtr;
  2147.   pageRefPtr.i = logPartPtr.p->firstPageRef;
  2148.   if (pageRefPtr.i != RNIL) {
  2149.     jam();
  2150.     ptrCheckGuard(pageRefPtr, cpageRefFileSize, pageRefRecord);
  2151.     if (pageRefPtr.p->prNext == RNIL) {
  2152.       jam();
  2153.       logPartPtr.p->lastPageRef = RNIL;
  2154.       logPartPtr.p->firstPageRef = RNIL;
  2155.     } else {
  2156.       jam();
  2157.       logPartPtr.p->firstPageRef = pageRefPtr.p->prNext;
  2158.       rprPageRefPtr.i = pageRefPtr.p->prNext;
  2159.       ptrCheckGuard(rprPageRefPtr, cpageRefFileSize, pageRefRecord);
  2160.       rprPageRefPtr.p->prPrev = RNIL;
  2161.     }//if
  2162.     releasePageRef(signal);
  2163.   }//if
  2164. }//Dblqh::removePageRef()
  2165. /* ------------------------------------------------------------------------- */
  2166. /* -------       RETURN FROM EXECUTION OF LOG                        ------- */
  2167. /*                                                                           */
  2168. /* ------------------------------------------------------------------------- */
  2169. Uint32 Dblqh::returnExecLog(Signal* signal) 
  2170. {
  2171.   tcConnectptr.p->connectState = TcConnectionrec::CONNECTED;
  2172.   initLogPointers(signal);
  2173.   logPartPtr.p->execSrExecuteIndex++;
  2174.   Uint32 result = checkIfExecLog(signal);
  2175.   if (result == ZOK) {
  2176.     jam();
  2177. /* ------------------------------------------------------------------------- */
  2178. /* THIS LOG RECORD WILL BE EXECUTED AGAIN TOWARDS ANOTHER NODE.              */
  2179. /* ------------------------------------------------------------------------- */
  2180.     logPagePtr.i = logPartPtr.p->execSrLogPage;
  2181.     ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord);
  2182.     logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = 
  2183.                   logPartPtr.p->execSrLogPageIndex;
  2184.   } else {
  2185.     jam();
  2186. /* ------------------------------------------------------------------------- */
  2187. /*       NO MORE EXECUTION OF THIS LOG RECORD.                               */
  2188. /* ------------------------------------------------------------------------- */
  2189.     if (logPartPtr.p->logExecState == 
  2190. LogPartRecord::LES_EXEC_LOGREC_FROM_FILE) {
  2191.       jam();
  2192. /* ------------------------------------------------------------------------- */
  2193. /* THE LOG RECORD WAS READ FROM DISK. RELEASE ITS PAGES IMMEDIATELY.         */
  2194. /* ------------------------------------------------------------------------- */
  2195.       lfoPtr.i = logPartPtr.p->execSrLfoRec;
  2196.       ptrCheckGuard(lfoPtr, clfoFileSize, logFileOperationRecord);
  2197.       releaseLfoPages(signal);
  2198.       releaseLfo(signal);
  2199.       logPartPtr.p->logExecState = LogPartRecord::LES_EXEC_LOG;
  2200.       if (logPartPtr.p->execSrExecLogFile != logPartPtr.p->currentLogfile) {
  2201.         jam();
  2202.         LogFileRecordPtr clfLogFilePtr;
  2203.         clfLogFilePtr.i = logPartPtr.p->execSrExecLogFile;
  2204.         ptrCheckGuard(clfLogFilePtr, clogFileFileSize, logFileRecord);
  2205.         clfLogFilePtr.p->logFileStatus = LogFileRecord::CLOSING_EXEC_LOG;
  2206.         closeFile(signal, clfLogFilePtr);
  2207.         result = ZCLOSE_FILE;
  2208.       }//if
  2209.     }//if
  2210.     logPartPtr.p->execSrExecuteIndex = 0;
  2211.     logPartPtr.p->execSrLogPage = RNIL;
  2212.     logPartPtr.p->execSrLogPageIndex = ZNIL;
  2213.     logPagePtr.i = logFilePtr.p->currentLogpage;
  2214.     ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord);
  2215.     logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = logPartPtr.p->savePageIndex;
  2216.   }//if
  2217.   return result;
  2218. }//Dblqh::returnExecLog()
  2219. /* --------------------------------------------------------------------------
  2220.  * -------       SEIZE ADD FRAGMENT RECORD                             ------
  2221.  * 
  2222.  * ------------------------------------------------------------------------- */
  2223. void Dblqh::seizeAddfragrec(Signal* signal) 
  2224. {
  2225.   addfragptr.i = cfirstfreeAddfragrec;
  2226.   ptrCheckGuard(addfragptr, caddfragrecFileSize, addFragRecord);
  2227.   cfirstfreeAddfragrec = addfragptr.p->nextAddfragrec;
  2228. }//Dblqh::seizeAddfragrec()
  2229. /* --------------------------------------------------------------------------
  2230.  * -------       SEIZE FRAGMENT RECORD                                ------- 
  2231.  *
  2232.  * ------------------------------------------------------------------------- */
  2233. void Dblqh::seizeFragmentrec(Signal* signal) 
  2234. {
  2235.   fragptr.i = cfirstfreeFragrec;
  2236.   ptrCheckGuard(fragptr, cfragrecFileSize, fragrecord);
  2237.   cfirstfreeFragrec = fragptr.p->nextFrag;
  2238.   fragptr.p->nextFrag = RNIL;
  2239. }//Dblqh::seizeFragmentrec()
  2240. /* ------------------------------------------------------------------------- */
  2241. /* -------     SEIZE A PAGE REFERENCE RECORD.                        ------- */
  2242. /*                                                                           */
  2243. /* ------------------------------------------------------------------------- */
  2244. void Dblqh::seizePageRef(Signal* signal) 
  2245. {
  2246.   pageRefPtr.i = cfirstfreePageRef;
  2247.   ptrCheckGuard(pageRefPtr, cpageRefFileSize, pageRefRecord);
  2248.   cfirstfreePageRef = pageRefPtr.p->prNext;
  2249.   pageRefPtr.p->prNext = RNIL;
  2250. }//Dblqh::seizePageRef()
  2251. /* --------------------------------------------------------------------------
  2252.  * -------               SEND ABORTED                                 ------- 
  2253.  *
  2254.  * ------------------------------------------------------------------------- */
  2255. void Dblqh::sendAborted(Signal* signal) 
  2256. {
  2257.   UintR TlastInd;
  2258.   if (tcConnectptr.p->nextReplica == ZNIL) {
  2259.     TlastInd = ZTRUE;
  2260.   } else {
  2261.     TlastInd = ZFALSE;
  2262.   }//if
  2263.   signal->theData[0] = tcConnectptr.p->tcOprec;
  2264.   signal->theData[1] = tcConnectptr.p->transid[0];
  2265.   signal->theData[2] = tcConnectptr.p->transid[1];
  2266.   signal->theData[3] = cownNodeid;
  2267.   signal->theData[4] = TlastInd;
  2268.   sendSignal(tcConnectptr.p->tcBlockref, GSN_ABORTED, signal, 5, JBB);
  2269.   return;
  2270. }//Dblqh::sendAborted()
  2271. /* --------------------------------------------------------------------------
  2272.  * -------               SEND LQH_TRANSCONF                           ------- 
  2273.  *
  2274.  * ------------------------------------------------------------------------- */
  2275. void Dblqh::sendLqhTransconf(Signal* signal, LqhTransConf::OperationStatus stat)
  2276. {
  2277.   tcNodeFailptr.i = tcConnectptr.p->tcNodeFailrec;
  2278.   ptrCheckGuard(tcNodeFailptr, ctcNodeFailrecFileSize, tcNodeFailRecord);
  2279.   Uint32 reqInfo = 0;
  2280.   LqhTransConf::setReplicaType(reqInfo, tcConnectptr.p->replicaType);
  2281.   LqhTransConf::setReplicaNo(reqInfo, tcConnectptr.p->seqNoReplica);
  2282.   LqhTransConf::setLastReplicaNo(reqInfo, tcConnectptr.p->lastReplicaNo);
  2283.   LqhTransConf::setSimpleFlag(reqInfo, tcConnectptr.p->opSimple);
  2284.   LqhTransConf::setDirtyFlag(reqInfo, tcConnectptr.p->dirtyOp);
  2285.   LqhTransConf::setOperation(reqInfo, tcConnectptr.p->operation);
  2286.   
  2287.   LqhTransConf * const lqhTransConf = (LqhTransConf *)&signal->theData[0];
  2288.   lqhTransConf->tcRef           = tcNodeFailptr.p->newTcRef;
  2289.   lqhTransConf->lqhNodeId       = cownNodeid;
  2290.   lqhTransConf->operationStatus = stat;
  2291.   lqhTransConf->lqhConnectPtr   = tcConnectptr.i;
  2292.   lqhTransConf->transId1        = tcConnectptr.p->transid[0];
  2293.   lqhTransConf->transId2        = tcConnectptr.p->transid[1];
  2294.   lqhTransConf->oldTcOpRec      = tcConnectptr.p->tcOprec;
  2295.   lqhTransConf->requestInfo     = reqInfo;
  2296.   lqhTransConf->gci             = tcConnectptr.p->gci;
  2297.   lqhTransConf->nextNodeId1     = tcConnectptr.p->nextReplica;
  2298.   lqhTransConf->nextNodeId2     = tcConnectptr.p->nodeAfterNext[0];
  2299.   lqhTransConf->nextNodeId3     = tcConnectptr.p->nodeAfterNext[1];
  2300.   lqhTransConf->apiRef          = tcConnectptr.p->applRef;
  2301.   lqhTransConf->apiOpRec        = tcConnectptr.p->applOprec;
  2302.   lqhTransConf->tableId         = tcConnectptr.p->tableref;
  2303.   sendSignal(tcNodeFailptr.p->newTcBlockref, GSN_LQH_TRANSCONF, 
  2304.      signal, LqhTransConf::SignalLength, JBB);
  2305.   tcNodeFailptr.p->tcRecNow = tcConnectptr.i + 1;
  2306.   signal->theData[0] = ZLQH_TRANS_NEXT;
  2307.   signal->theData[1] = tcNodeFailptr.i;
  2308.   sendSignal(cownref, GSN_CONTINUEB, signal, 2, JBB);
  2309. }//Dblqh::sendLqhTransconf()
  2310. /* --------------------------------------------------------------------------
  2311.  * -------               START ANOTHER PHASE OF LOG EXECUTION         -------
  2312.  *       RESET THE VARIABLES NEEDED BY THIS PROCESS AND SEND THE START SIGNAL
  2313.  *
  2314.  * ------------------------------------------------------------------------- */
  2315. void Dblqh::startExecSr(Signal* signal) 
  2316. {
  2317.   cnoFragmentsExecSr = 0;
  2318.   signal->theData[0] = cfirstCompletedFragSr;
  2319.   signal->theData[1] = RNIL;
  2320.   sendSignal(cownref, GSN_START_EXEC_SR, signal, 2, JBB);
  2321. }//Dblqh::startExecSr()
  2322. /* ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ 
  2323.  * ¤¤¤¤¤¤¤                            LOG MODULE                      ¤¤¤¤¤¤¤ 
  2324.  * ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ */
  2325. /* -------------------------------------------------------------------------- 
  2326.  * -------       STEP FORWARD IN FRAGMENT LOG DURING LOG EXECUTION    ------- 
  2327.  * 
  2328.  * ------------------------------------------------------------------------- */
  2329. void Dblqh::stepAhead(Signal* signal, Uint32 stepAheadWords) 
  2330. {
  2331.   UintR tsaPos;
  2332.   tsaPos = logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX];
  2333.   while ((stepAheadWords + tsaPos) >= ZPAGE_SIZE) {
  2334.     jam();
  2335.     logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = ZPAGE_SIZE;
  2336.     stepAheadWords = stepAheadWords - (ZPAGE_SIZE - tsaPos);
  2337.     logFilePtr.p->currentLogpage = logPagePtr.p->logPageWord[ZNEXT_PAGE];
  2338.     logPagePtr.i = logPagePtr.p->logPageWord[ZNEXT_PAGE];
  2339.     logFilePtr.p->currentFilepage++;
  2340.     ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord);
  2341.     logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = ZPAGE_HEADER_SIZE;
  2342.     logPartPtr.p->execSrPagesRead--;
  2343.     logPartPtr.p->execSrPagesExecuted++;
  2344.     tsaPos = ZPAGE_HEADER_SIZE;
  2345.   }//while
  2346.   logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = stepAheadWords + tsaPos;
  2347. }//Dblqh::stepAhead()
  2348. /* --------------------------------------------------------------------------
  2349.  * -------               WRITE A ABORT LOG RECORD                     -------
  2350.  *
  2351.  *       SUBROUTINE SHORT NAME: WAL
  2352.  * ------------------------------------------------------------------------- */
  2353. void Dblqh::writeAbortLog(Signal* signal) 
  2354. {
  2355.   if ((ZABORT_LOG_SIZE + ZNEXT_LOG_SIZE) > 
  2356.       logFilePtr.p->remainingWordsInMbyte) {
  2357.     jam();
  2358.     changeMbyte(signal);
  2359.   }//if
  2360.   logFilePtr.p->remainingWordsInMbyte = 
  2361.     logFilePtr.p->remainingWordsInMbyte - ZABORT_LOG_SIZE;
  2362.   writeLogWord(signal, ZABORT_TYPE);
  2363.   writeLogWord(signal, tcConnectptr.p->transid[0]);
  2364.   writeLogWord(signal, tcConnectptr.p->transid[1]);
  2365. }//Dblqh::writeAbortLog()
  2366. /* --------------------------------------------------------------------------
  2367.  * -------               WRITE A COMMIT LOG RECORD                    ------- 
  2368.  *
  2369.  *       SUBROUTINE SHORT NAME: WCL
  2370.  * ------------------------------------------------------------------------- */
  2371. void Dblqh::writeCommitLog(Signal* signal, LogPartRecordPtr regLogPartPtr) 
  2372. {
  2373.   LogFileRecordPtr regLogFilePtr;
  2374.   LogPageRecordPtr regLogPagePtr;
  2375.   TcConnectionrec * const regTcPtr = tcConnectptr.p;
  2376.   regLogFilePtr.i = regLogPartPtr.p->currentLogfile;
  2377.   ptrCheckGuard(regLogFilePtr, clogFileFileSize, logFileRecord);
  2378.   regLogPagePtr.i = regLogFilePtr.p->currentLogpage;
  2379.   Uint32 twclTmp = regLogFilePtr.p->remainingWordsInMbyte;
  2380.   ptrCheckGuard(regLogPagePtr, clogPageFileSize, logPageRecord);
  2381.   logPartPtr = regLogPartPtr;
  2382.   logFilePtr = regLogFilePtr;
  2383.   logPagePtr = regLogPagePtr;
  2384.   if ((ZCOMMIT_LOG_SIZE + ZNEXT_LOG_SIZE) > twclTmp) {
  2385.     jam();
  2386.     changeMbyte(signal);
  2387.     twclTmp = logFilePtr.p->remainingWordsInMbyte;
  2388.   }//if
  2389.   Uint32 twclLogPos = logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX];
  2390.   Uint32 tableId = regTcPtr->tableref;
  2391.   Uint32 schemaVersion = regTcPtr->schemaVersion;
  2392.   Uint32 fragId = regTcPtr->fragmentid;
  2393.   Uint32 fileNo = regTcPtr->logStartFileNo;
  2394.   Uint32 startPageNo = regTcPtr->logStartPageNo;
  2395.   Uint32 pageIndex = regTcPtr->logStartPageIndex;
  2396.   Uint32 stopPageNo = regTcPtr->logStopPageNo;
  2397.   Uint32 gci = regTcPtr->gci;
  2398.   logFilePtr.p->remainingWordsInMbyte = twclTmp - ZCOMMIT_LOG_SIZE;
  2399.   if ((twclLogPos + ZCOMMIT_LOG_SIZE) >= ZPAGE_SIZE) {
  2400.     writeLogWord(signal, ZCOMMIT_TYPE);
  2401.     writeLogWord(signal, tableId);
  2402.     writeLogWord(signal, schemaVersion);
  2403.     writeLogWord(signal, fragId);
  2404.     writeLogWord(signal, fileNo);
  2405.     writeLogWord(signal, startPageNo);
  2406.     writeLogWord(signal, pageIndex);
  2407.     writeLogWord(signal, stopPageNo);
  2408.     writeLogWord(signal, gci);
  2409.   } else {
  2410.     Uint32* dataPtr = &logPagePtr.p->logPageWord[twclLogPos];
  2411.     logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = twclLogPos + ZCOMMIT_LOG_SIZE;
  2412.     dataPtr[0] = ZCOMMIT_TYPE;
  2413.     dataPtr[1] = tableId;
  2414.     dataPtr[2] = schemaVersion;
  2415.     dataPtr[3] = fragId;
  2416.     dataPtr[4] = fileNo;
  2417.     dataPtr[5] = startPageNo;
  2418.     dataPtr[6] = pageIndex;
  2419.     dataPtr[7] = stopPageNo;
  2420.     dataPtr[8] = gci;
  2421.   }//if
  2422.   TcConnectionrecPtr rloTcNextConnectptr;
  2423.   TcConnectionrecPtr rloTcPrevConnectptr;
  2424.   rloTcPrevConnectptr.i = regTcPtr->prevLogTcrec;
  2425.   rloTcNextConnectptr.i = regTcPtr->nextLogTcrec;
  2426.   if (rloTcNextConnectptr.i != RNIL) {
  2427.     jam();
  2428.     ptrCheckGuard(rloTcNextConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  2429.     rloTcNextConnectptr.p->prevLogTcrec = rloTcPrevConnectptr.i;
  2430.   } else {
  2431.     regLogPartPtr.p->lastLogTcrec = rloTcPrevConnectptr.i;
  2432.   }//if
  2433.   if (rloTcPrevConnectptr.i != RNIL) {
  2434.     jam();
  2435.     ptrCheckGuard(rloTcPrevConnectptr, ctcConnectrecFileSize, tcConnectionrec);
  2436.     rloTcPrevConnectptr.p->nextLogTcrec = rloTcNextConnectptr.i;
  2437.   } else {
  2438.     regLogPartPtr.p->firstLogTcrec = rloTcNextConnectptr.i;
  2439.   }//if
  2440. }//Dblqh::writeCommitLog()
  2441. /* -------------------------------------------------------------------------- 
  2442.  * -------               WRITE A COMPLETED GCI LOG RECORD             ------- 
  2443.  *
  2444.  *       SUBROUTINE SHORT NAME: WCG
  2445. // Input Pointers:
  2446. // logFilePtr
  2447. // logPartPtr
  2448.  * ------------------------------------------------------------------------- */
  2449. void Dblqh::writeCompletedGciLog(Signal* signal) 
  2450. {
  2451.   if ((ZCOMPLETED_GCI_LOG_SIZE + ZNEXT_LOG_SIZE) > 
  2452.       logFilePtr.p->remainingWordsInMbyte) {
  2453.     jam();
  2454.     changeMbyte(signal);
  2455.   }//if
  2456.   logFilePtr.p->remainingWordsInMbyte = 
  2457.     logFilePtr.p->remainingWordsInMbyte - ZCOMPLETED_GCI_LOG_SIZE;
  2458.   writeLogWord(signal, ZCOMPLETED_GCI_TYPE);
  2459.   writeLogWord(signal, cnewestCompletedGci);
  2460.   logPartPtr.p->logPartNewestCompletedGCI = cnewestCompletedGci;
  2461. }//Dblqh::writeCompletedGciLog()
  2462. /* --------------------------------------------------------------------------
  2463.  * -------         WRITE A DIRTY PAGE DURING LOG EXECUTION            ------- 
  2464.  * 
  2465.  *     SUBROUTINE SHORT NAME: WD
  2466.  * ------------------------------------------------------------------------- */
  2467. void Dblqh::writeDirty(Signal* signal, Uint32 place) 
  2468. {
  2469.   logPagePtr.p->logPageWord[ZPOS_DIRTY] = ZNOT_DIRTY;
  2470.   ndbassert(logPartPtr.p->prevFilepage ==
  2471.             logPagePtr.p->logPageWord[ZPOS_PAGE_NO]);
  2472.   writeDbgInfoPageHeader(logPagePtr, place, logPartPtr.p->prevFilepage,
  2473.                          ZPAGE_SIZE);
  2474.   // Calculate checksum for page
  2475.   logPagePtr.p->logPageWord[ZPOS_CHECKSUM] = calcPageCheckSum(logPagePtr);
  2476.   seizeLfo(signal);
  2477.   initLfo(signal);
  2478.   lfoPtr.p->lfoPageNo = logPartPtr.p->prevFilepage;
  2479.   lfoPtr.p->noPagesRw = 1;
  2480.   lfoPtr.p->lfoState = LogFileOperationRecord::WRITE_DIRTY;
  2481.   lfoPtr.p->firstLfoPage = logPagePtr.i;
  2482.   signal->theData[0] = logFilePtr.p->fileRef;
  2483.   signal->theData[1] = cownref;
  2484.   signal->theData[2] = lfoPtr.i;
  2485.   signal->theData[3] = ZLIST_OF_PAIRS_SYNCH;
  2486.   signal->theData[4] = ZVAR_NO_LOG_PAGE_WORD;
  2487.   signal->theData[5] = 1;
  2488.   signal->theData[6] = logPagePtr.i;
  2489.   signal->theData[7] = logPartPtr.p->prevFilepage;
  2490.   sendSignal(NDBFS_REF, GSN_FSWRITEREQ, signal, 8, JBA);
  2491. }//Dblqh::writeDirty()
  2492. /* --------------------------------------------------------------------------
  2493.  * -------          WRITE A WORD INTO THE LOG, CHECK FOR NEW PAGE     ------- 
  2494.  * 
  2495.  *       SUBROUTINE SHORT NAME:  WLW
  2496.  * ------------------------------------------------------------------------- */
  2497. void Dblqh::writeLogWord(Signal* signal, Uint32 data) 
  2498. {
  2499.   Uint32 logPos = logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX];
  2500.   ndbrequire(logPos < ZPAGE_SIZE);
  2501.   logPagePtr.p->logPageWord[logPos] = data;
  2502.   logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] = logPos + 1;
  2503.   if ((logPos + 1) == ZPAGE_SIZE) {
  2504.     jam();
  2505.     completedLogPage(signal, ZNORMAL, __LINE__);
  2506.     seizeLogpage(signal);
  2507.     initLogpage(signal);
  2508.     logFilePtr.p->currentLogpage = logPagePtr.i;
  2509.     logFilePtr.p->currentFilepage++;
  2510.   }//if
  2511. }//Dblqh::writeLogWord()
  2512. /* --------------------------------------------------------------------------
  2513.  * -------         WRITE A NEXT LOG RECORD AND CHANGE TO NEXT MBYTE   ------- 
  2514.  *
  2515.  *       SUBROUTINE SHORT NAME:  WNL
  2516. // Input Pointers:
  2517. // logFilePtr(Redefines)
  2518. // logPagePtr (Redefines)
  2519. // logPartPtr
  2520.  * ------------------------------------------------------------------------- */
  2521. void Dblqh::writeNextLog(Signal* signal) 
  2522. {
  2523.   LogFileRecordPtr wnlNextLogFilePtr;
  2524.   UintR twnlNextFileNo;
  2525.   UintR twnlNewMbyte;
  2526.   UintR twnlRemWords;
  2527.   UintR twnlNextMbyte;
  2528. /* -------------------------------------------------- */
  2529. /*       CALCULATE THE NEW NUMBER OF REMAINING WORDS  */
  2530. /*       AS 128*2036 WHERE 128 * 8 KBYTE = 1 MBYTE    */
  2531. /*       AND 2036 IS THE NUMBER OF WORDS IN A PAGE    */
  2532. /*       THAT IS USED FOR LOG INFORMATION.            */
  2533. /* -------------------------------------------------- */
  2534.   twnlRemWords = ZPAGE_SIZE - ZPAGE_HEADER_SIZE;
  2535.   twnlRemWords = twnlRemWords * ZPAGES_IN_MBYTE;
  2536.   wnlNextLogFilePtr.i = logFilePtr.p->nextLogFile;
  2537.   ptrCheckGuard(wnlNextLogFilePtr, clogFileFileSize, logFileRecord);
  2538. /* -------------------------------------------------- */
  2539. /*       WRITE THE NEXT LOG RECORD.                   */
  2540. /* -------------------------------------------------- */
  2541.   ndbrequire(logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX] < ZPAGE_SIZE);
  2542.   logPagePtr.p->logPageWord[logPagePtr.p->logPageWord[ZCURR_PAGE_INDEX]] = 
  2543.     ZNEXT_MBYTE_TYPE;
  2544.   if (logFilePtr.p->currentMbyte == (ZNO_MBYTES_IN_FILE - 1)) {
  2545.     jam();
  2546. /* -------------------------------------------------- */
  2547. /*       CALCULATE THE NEW REMAINING WORDS WHEN       */
  2548. /*       CHANGING LOG FILE IS PERFORMED               */
  2549. /* -------------------------------------------------- */
  2550.     twnlRemWords = twnlRemWords - (ZPAGE_SIZE - ZPAGE_HEADER_SIZE);
  2551. /* -------------------------------------------------- */
  2552. /*       ENSURE THAT THE LOG PAGES ARE WRITTEN AFTER  */
  2553. /*       WE HAVE CHANGED MBYTE.                       */
  2554. /* -------------------------------------------------- */
  2555. /*       ENSURE LAST PAGE IN PREVIOUS MBYTE IS        */
  2556. /*       WRITTEN AND THAT THE STATE OF THE WRITE IS   */
  2557. /*       PROPERLY SET.                                */
  2558. /* -------------------------------------------------- */
  2559. /*       WE HAVE TO CHANGE LOG FILE                   */
  2560. /* -------------------------------------------------- */
  2561.     completedLogPage(signal, ZLAST_WRITE_IN_FILE, __LINE__);
  2562.     if (wnlNextLogFilePtr.p->fileNo == 0) {
  2563.       jam();
  2564. /* -------------------------------------------------- */
  2565. /*       WE HAVE FINALISED A LOG LAP, START FROM LOG  */
  2566. /*       FILE 0 AGAIN                                 */
  2567. /* -------------------------------------------------- */
  2568.       logPartPtr.p->logLap++;
  2569.     }//if
  2570.     logPartPtr.p->currentLogfile = wnlNextLogFilePtr.i;
  2571.     logFilePtr.i = wnlNextLogFilePtr.i;
  2572.     logFilePtr.p = wnlNextLogFilePtr.p;
  2573.     twnlNewMbyte = 0;
  2574.   } else {
  2575.     jam();
  2576. /* -------------------------------------------------- */
  2577. /*       INCREMENT THE CURRENT MBYTE                  */
  2578. /*       SET PAGE INDEX TO PAGE HEADER SIZE           */
  2579. /* -------------------------------------------------- */
  2580.     completedLogPage(signal, ZENFORCE_WRITE, __LINE__);
  2581.     twnlNewMbyte = logFilePtr.p->currentMbyte + 1;
  2582.   }//if
  2583. /* -------------------------------------------------- */
  2584. /*       CHANGE TO NEW LOG FILE IF NECESSARY          */
  2585. /*       UPDATE THE FILE POSITION TO THE NEW MBYTE    */
  2586. /*       FOUND IN PAGE PART OF TNEXT_LOG_PTR          */
  2587. /*       ALLOCATE AND INITIATE A NEW PAGE SINCE WE    */
  2588. /*       HAVE SENT THE PREVIOUS PAGE TO DISK.         */
  2589. /*       SET THE NEW NUMBER OF REMAINING WORDS IN THE */
  2590. /*       NEW MBYTE ALLOCATED.                         */
  2591. /* -------------------------------------------------- */
  2592.   logFilePtr.p->currentMbyte = twnlNewMbyte;
  2593.   logFilePtr.p->filePosition = twnlNewMbyte * ZPAGES_IN_MBYTE;
  2594.   logFilePtr.p->currentFilepage = twnlNewMbyte * ZPAGES_IN_MBYTE;
  2595.   logFilePtr.p->remainingWordsInMbyte = twnlRemWords;
  2596.   seizeLogpage(signal);
  2597.   if (logFilePtr.p->currentMbyte == 0) {
  2598.     jam();
  2599.     logFilePtr.p->lastPageWritten = 0;
  2600.     if (logFilePtr.p->fileNo == 0) {
  2601.       jam();
  2602.       releaseLogpage(signal);
  2603.       logPagePtr.i = logFilePtr.p->logPageZero;
  2604.       ptrCheckGuard(logPagePtr, clogPageFileSize, logPageRecord);
  2605.     }//if
  2606.   }//if
  2607.   initLogpage(signal);
  2608.   logFilePtr.p->currentLogpage = logPagePtr.i;
  2609.   if (logFilePtr.p->currentMbyte == 0) {
  2610.     jam();
  2611. /* -------------------------------------------------- */
  2612. /*       THIS IS A NEW FILE, WRITE THE FILE DESCRIPTOR*/
  2613. /*       ALSO OPEN THE NEXT LOG FILE TO ENSURE THAT   */
  2614. /*       THIS FILE IS OPEN WHEN ITS TURN COMES.       */
  2615. /* -------------------------------------------------- */
  2616.     writeFileHeaderOpen(signal, ZNORMAL);
  2617.     openNextLogfile(signal);
  2618.     logFilePtr.p->fileChangeState = LogFileRecord::BOTH_WRITES_ONGOING;
  2619.   }//if
  2620.   if (logFilePtr.p->fileNo == logPartPtr.p->logTailFileNo) {
  2621.     if (logFilePtr.p->currentMbyte == logPartPtr.p->logTailMbyte) {
  2622.       jam();
  2623. /* -------------------------------------------------- */
  2624. /*       THE HEAD AND TAIL HAS MET. THIS SHOULD NEVER */
  2625. /*       OCCUR. CAN HAPPEN IF THE LOCAL CHECKPOINTS   */
  2626. /*       TAKE FAR TOO LONG TIME. SO TIMING PROBLEMS   */
  2627. /*       CAN INVOKE THIS SYSTEM CRASH. HOWEVER ONLY   */
  2628. /*       VERY SERIOUS TIMING PROBLEMS.                */
  2629. /* -------------------------------------------------- */
  2630.       systemError(signal);
  2631.     }//if
  2632.   }//if
  2633.   if (logFilePtr.p->currentMbyte == (ZNO_MBYTES_IN_FILE - 1)) {
  2634.     jam();
  2635.     twnlNextMbyte = 0;
  2636.     if (logFilePtr.p->fileChangeState != LogFileRecord::NOT_ONGOING) {
  2637.       jam();
  2638.       logPartPtr.p->logPartState = LogPartRecord::FILE_CHANGE_PROBLEM;
  2639.     }//if
  2640.     twnlNextFileNo = wnlNextLogFilePtr.p->fileNo;
  2641.   } else {
  2642.     jam();
  2643.     twnlNextMbyte = logFilePtr.p->currentMbyte + 1;
  2644.     twnlNextFileNo = logFilePtr.p->fileNo;
  2645.   }//if
  2646.   if (twnlNextFileNo == logPartPtr.p->logTailFileNo) {
  2647.     if (logPartPtr.p->logTailMbyte == twnlNextMbyte) {
  2648.       jam();
  2649. /* -------------------------------------------------- */
  2650. /*       THE NEXT MBYTE WILL BE THE TAIL. WE MUST     */
  2651. /*       STOP LOGGING NEW OPERATIONS. THIS OPERATION  */
  2652. /*       ALLOWED TO PASS. ALSO COMMIT, NEXT, COMPLETED*/
  2653. /*       GCI, ABORT AND FRAGMENT SPLIT IS ALLOWED.    */
  2654. /*       OPERATIONS ARE ALLOWED AGAIN WHEN THE TAIL   */
  2655. /*       IS MOVED FORWARD AS A RESULT OF A START_LCP  */
  2656. /*       _ROUND SIGNAL ARRIVING FROM DBDIH.           */
  2657. /* -------------------------------------------------- */
  2658.       logPartPtr.p->logPartState = LogPartRecord::TAIL_PROBLEM;
  2659.     }//if
  2660.   }//if
  2661. }//Dblqh::writeNextLog()
  2662. void
  2663. Dblqh::execDUMP_STATE_ORD(Signal* signal)
  2664. {
  2665.   DumpStateOrd * const dumpState = (DumpStateOrd *)&signal->theData[0];
  2666.   if(dumpState->args[0] == DumpStateOrd::CommitAckMarkersSize){
  2667.     infoEvent("LQH: m_commitAckMarkerPool: %d free size: %d",
  2668.       m_commitAckMarkerPool.getNoOfFree(),
  2669.       m_commitAckMarkerPool.getSize());
  2670.   }
  2671.   if(dumpState->args[0] == DumpStateOrd::CommitAckMarkersDump){
  2672.     infoEvent("LQH: m_commitAckMarkerPool: %d free size: %d",
  2673.       m_commitAckMarkerPool.getNoOfFree(),
  2674.       m_commitAckMarkerPool.getSize());
  2675.     
  2676.     CommitAckMarkerIterator iter;
  2677.     for(m_commitAckMarkerHash.first(iter); iter.curr.i != RNIL;
  2678. m_commitAckMarkerHash.next(iter)){
  2679.       infoEvent("CommitAckMarker: i = %d (0x%x, 0x%x)"
  2680. " ApiRef: 0x%x apiOprec: 0x%x TcNodeId: %d",
  2681. iter.curr.i,
  2682. iter.curr.p->transid1,
  2683. iter.curr.p->transid2,
  2684. iter.curr.p->apiRef,
  2685. iter.curr.p->apiOprec,
  2686. iter.curr.p->tcNodeId);
  2687.     }
  2688.   }
  2689.   // Dump info about number of log pages
  2690.   if(dumpState->args[0] == DumpStateOrd::LqhDumpNoLogPages){
  2691.     infoEvent("LQH: Log pages : %d Free: %d",
  2692.       clogPageFileSize,
  2693.       cnoOfLogPages);
  2694.   }
  2695.   // Dump all defined tables that LQH knowns about
  2696.   if(dumpState->args[0] == DumpStateOrd::LqhDumpAllDefinedTabs){
  2697.     for(Uint32 i = 0; i<ctabrecFileSize; i++){
  2698.       TablerecPtr tabPtr;
  2699.       tabPtr.i = i;
  2700.       ptrAss(tabPtr, tablerec);
  2701.       if(tabPtr.p->tableStatus != Tablerec::NOT_DEFINED){
  2702. infoEvent("Table %d Status: %d Usage: %d",
  2703.   i, tabPtr.p->tableStatus, tabPtr.p->usageCount);
  2704.       }
  2705.     }
  2706.     return;
  2707.   }
  2708.   // Dump all ScanRecords
  2709.   if (dumpState->args[0] == DumpStateOrd::LqhDumpAllScanRec){
  2710.     Uint32 recordNo = 0;
  2711.     if (signal->length() == 1)
  2712.       infoEvent("LQH: Dump all ScanRecords - size: %d",
  2713. cscanrecFileSize);
  2714.     else if (signal->length() == 2)
  2715.       recordNo = dumpState->args[1];
  2716.     else
  2717.       return;
  2718.     
  2719.     dumpState->args[0] = DumpStateOrd::LqhDumpOneScanRec;
  2720.     dumpState->args[1] = recordNo;
  2721.     execDUMP_STATE_ORD(signal);
  2722.     
  2723.     if (recordNo < cscanrecFileSize-1){
  2724.       dumpState->args[0] = DumpStateOrd::LqhDumpAllScanRec;
  2725.       dumpState->args[1] = recordNo+1;
  2726.       sendSignal(reference(), GSN_DUMP_STATE_ORD, signal, 2, JBB);
  2727.     }
  2728.     return;
  2729.   }
  2730.   
  2731.   // Dump all active ScanRecords
  2732.   if (dumpState->args[0] == DumpStateOrd::LqhDumpAllActiveScanRec){
  2733.     Uint32 recordNo = 0;
  2734.     if (signal->length() == 1)
  2735.       infoEvent("LQH: Dump active ScanRecord - size: %d",
  2736. cscanrecFileSize);
  2737.     else if (signal->length() == 2)
  2738.       recordNo = dumpState->args[1];
  2739.     else
  2740.       return;
  2741.     ScanRecordPtr sp;
  2742.     sp.i = recordNo;
  2743.     c_scanRecordPool.getPtr(scanptr);
  2744.     if (sp.p->scanState != ScanRecord::SCAN_FREE){
  2745.       dumpState->args[0] = DumpStateOrd::LqhDumpOneScanRec;
  2746.       dumpState->args[1] = recordNo;
  2747.       execDUMP_STATE_ORD(signal);
  2748.     }
  2749.     
  2750.     if (recordNo < cscanrecFileSize-1){
  2751.       dumpState->args[0] = DumpStateOrd::LqhDumpAllActiveScanRec;
  2752.       dumpState->args[1] = recordNo+1;
  2753.       sendSignal(reference(), GSN_DUMP_STATE_ORD, signal, 2, JBB);
  2754.     }
  2755.     return;
  2756.   }
  2757.   if(dumpState->args[0] == DumpStateOrd::LqhDumpOneScanRec){
  2758.     Uint32 recordNo = RNIL;
  2759.     if (signal->length() == 2)
  2760.       recordNo = dumpState->args[1];
  2761.     else
  2762.       return;
  2763.     if (recordNo >= cscanrecFileSize)
  2764.       return;
  2765.     ScanRecordPtr sp;
  2766.     sp.i = recordNo;
  2767.     c_scanRecordPool.getPtr(sp);
  2768.     infoEvent("Dblqh::ScanRecord[%d]: state=%d, type=%d, "
  2769.       "complStatus=%d, scanNodeId=%d",
  2770.       sp.i,
  2771.       sp.p->scanState,
  2772.       sp.p->scanType,
  2773.       sp.p->scanCompletedStatus,
  2774.       sp.p->scanNodeId);
  2775.     infoEvent(" apiBref=0x%x, scanAccPtr=%d",
  2776.       sp.p->scanApiBlockref,
  2777.       sp.p->scanAccPtr);
  2778.     infoEvent(" copyptr=%d, ailen=%d, complOps=%d, concurrOps=%d",
  2779.       sp.p->copyPtr,
  2780.       sp.p->scanAiLength,
  2781.       sp.p->m_curr_batch_size_rows,
  2782.       sp.p->m_max_batch_size_rows);
  2783.     infoEvent(" errCnt=%d, localFid=%d, schV=%d",
  2784.       sp.p->scanErrorCounter,
  2785.       sp.p->scanLocalFragid,
  2786.       sp.p->scanSchemaVersion);
  2787.     infoEvent(" stpid=%d, flag=%d, lhold=%d, lmode=%d, num=%d",
  2788.       sp.p->scanStoredProcId,
  2789.       sp.p->scanFlag,
  2790.       sp.p->scanLockHold,
  2791.       sp.p->scanLockMode,
  2792.       sp.p->scanNumber);
  2793.     infoEvent(" relCount=%d, TCwait=%d, TCRec=%d, KIflag=%d",
  2794.       sp.p->scanReleaseCounter,
  2795.       sp.p->scanTcWaiting,
  2796.       sp.p->scanTcrec,
  2797.       sp.p->scanKeyinfoFlag);
  2798.     return;
  2799.   }
  2800.   if(dumpState->args[0] == DumpStateOrd::LqhDumpLcpState){
  2801.     infoEvent("== LQH LCP STATE ==");
  2802.     infoEvent(" clcpCompletedState=%d, c_lcpId=%d, cnoOfFragsCheckpointed=%d",
  2803.       clcpCompletedState,
  2804.       c_lcpId,
  2805.       cnoOfFragsCheckpointed);
  2806.     LcpRecordPtr TlcpPtr;
  2807.     // Print information about the current local checkpoint
  2808.     TlcpPtr.i = 0;
  2809.     ptrAss(TlcpPtr, lcpRecord);
  2810.     infoEvent(" lcpState=%d firstLcpLocTup=%d firstLcpLocAcc=%d",
  2811.       TlcpPtr.p->lcpState,
  2812.       TlcpPtr.p->firstLcpLocTup,
  2813.       TlcpPtr.p->firstLcpLocAcc);
  2814.     infoEvent(" lcpAccptr=%d lastFragmentFlag=%d",
  2815.       TlcpPtr.p->lcpAccptr,
  2816.       TlcpPtr.p->lastFragmentFlag);
  2817.     infoEvent("currentFragment.fragPtrI=%d",
  2818.         TlcpPtr.p->currentFragment.fragPtrI);
  2819.     infoEvent("currentFragment.lcpFragOrd.tableId=%d",
  2820.       TlcpPtr.p->currentFragment.lcpFragOrd.tableId);
  2821.     infoEvent(" lcpQueued=%d reportEmpty=%d",
  2822.       TlcpPtr.p->lcpQueued,
  2823.       TlcpPtr.p->reportEmpty);
  2824.     char buf[8*_NDB_NODE_BITMASK_SIZE+1];
  2825.     infoEvent(" m_EMPTY_LCP_REQ=%d", 
  2826.       TlcpPtr.p->m_EMPTY_LCP_REQ.getText(buf));
  2827.     
  2828.     return;
  2829.   }
  2830. }//Dblqh::execDUMP_STATE_ORD()
  2831. void Dblqh::execSET_VAR_REQ(Signal* signal) 
  2832. {
  2833. #if 0
  2834.   SetVarReq* const setVarReq = (SetVarReq*)&signal->theData[0];
  2835.   ConfigParamId var = setVarReq->variable();
  2836.   switch (var) {
  2837.   case NoOfConcurrentCheckpointsAfterRestart:
  2838.     sendSignal(CMVMI_REF, GSN_SET_VAR_CONF, signal, 1, JBB);
  2839.     break;
  2840.   case NoOfConcurrentCheckpointsDuringRestart:
  2841.     // Valid only during start so value not set.
  2842.     sendSignal(CMVMI_REF, GSN_SET_VAR_CONF, signal, 1, JBB);
  2843.     break;
  2844.   default:
  2845.     sendSignal(CMVMI_REF, GSN_SET_VAR_REF, signal, 1, JBB);
  2846.   } // switch
  2847. #endif
  2848. }//execSET_VAR_REQ()
  2849. /* **************************************************************** */
  2850. /* ---------------------------------------------------------------- */
  2851. /* ---------------------- TRIGGER HANDLING ------------------------ */
  2852. /* ---------------------------------------------------------------- */
  2853. /*                                                                  */
  2854. /*      All trigger signals from TRIX are forwarded top TUP         */
  2855. /* ---------------------------------------------------------------- */
  2856. /* **************************************************************** */
  2857. // Trigger signals
  2858. void
  2859. Dblqh::execCREATE_TRIG_REQ(Signal* signal)
  2860. {
  2861.   jamEntry();
  2862.   NodeId myNodeId = getOwnNodeId();
  2863.   BlockReference tupref = calcTupBlockRef(myNodeId);
  2864.   sendSignal(tupref, GSN_CREATE_TRIG_REQ, signal, CreateTrigReq::SignalLength, JBB);
  2865. }
  2866. void
  2867. Dblqh::execCREATE_TRIG_CONF(Signal* signal)
  2868. {
  2869.   jamEntry();
  2870.   NodeId myNodeId = getOwnNodeId();
  2871.   BlockReference dictref = calcDictBlockRef(myNodeId);
  2872.   sendSignal(dictref, GSN_CREATE_TRIG_CONF, signal, CreateTrigConf::SignalLength, JBB);
  2873. }
  2874. void
  2875. Dblqh::execCREATE_TRIG_REF(Signal* signal)
  2876. {
  2877.   jamEntry();
  2878.   NodeId myNodeId = getOwnNodeId();
  2879.   BlockReference dictref = calcDictBlockRef(myNodeId);
  2880.   sendSignal(dictref, GSN_CREATE_TRIG_REF, signal, CreateTrigRef::SignalLength, JBB);
  2881. }
  2882. void
  2883. Dblqh::execDROP_TRIG_REQ(Signal* signal)
  2884. {
  2885.   jamEntry();
  2886.   NodeId myNodeId = getOwnNodeId();
  2887.   BlockReference tupref = calcTupBlockRef(myNodeId);
  2888.   sendSignal(tupref, GSN_DROP_TRIG_REQ, signal, DropTrigReq::SignalLength, JBB);
  2889. }
  2890. void
  2891. Dblqh::execDROP_TRIG_CONF(Signal* signal)
  2892. {
  2893.   jamEntry();
  2894.   NodeId myNodeId = getOwnNodeId();
  2895.   BlockReference dictref = calcDictBlockRef(myNodeId);
  2896.   sendSignal(dictref, GSN_DROP_TRIG_CONF, signal, DropTrigConf::SignalLength, JBB);
  2897. }
  2898. void
  2899. Dblqh::execDROP_TRIG_REF(Signal* signal)
  2900. {
  2901.   jamEntry();
  2902.   NodeId myNodeId = getOwnNodeId();
  2903.   BlockReference dictref = calcDictBlockRef(myNodeId);
  2904.   sendSignal(dictref, GSN_DROP_TRIG_REF, signal, DropTrigRef::SignalLength, JBB);
  2905. }
  2906. Uint32 Dblqh::calcPageCheckSum(LogPageRecordPtr logP){
  2907.     Uint32 checkSum = 37;
  2908. #ifdef VM_TRACE
  2909.     for (Uint32 i = (ZPOS_CHECKSUM+1); i<ZPAGE_SIZE; i++)
  2910.       checkSum = logP.p->logPageWord[i] ^ checkSum;
  2911. #endif
  2912.     return checkSum;  
  2913.   }
  2914. void Dblqh::writeDbgInfoPageHeader(LogPageRecordPtr logP, Uint32 place,
  2915.                                    Uint32 pageNo, Uint32 wordWritten)
  2916. {
  2917.   logP.p->logPageWord[ZPOS_LOG_TIMER]= logPartPtr.p->logTimer;
  2918.   logP.p->logPageWord[ZPOS_PREV_PAGE_NO]= logP.p->logPageWord[ZPOS_PAGE_NO];
  2919.   logP.p->logPageWord[ZPOS_PAGE_I]= logP.i;
  2920.   logP.p->logPageWord[ZPOS_PLACE_WRITTEN_FROM]= place;
  2921.   logP.p->logPageWord[ZPOS_PAGE_NO]= pageNo;
  2922.   logP.p->logPageWord[ZPOS_PAGE_FILE_NO]= logFilePtr.p->fileNo;
  2923.   logP.p->logPageWord[ZPOS_WORD_WRITTEN]= wordWritten;
  2924.   logP.p->logPageWord[ZPOS_IN_WRITING]= 1;
  2925. }