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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #define DBTUP_C
  14. #include "Dbtup.hpp"
  15. #include <RefConvert.hpp>
  16. #include <ndb_limits.h>
  17. #include <pc.hpp>
  18. #define ljam() { jamLine(9000 + __LINE__); }
  19. #define ljamEntry() { jamEntryLine(9000 + __LINE__); }
  20. void Dbtup::freeAllAttrBuffers(Operationrec*  const regOperPtr)
  21. {
  22.   if (regOperPtr->storedProcedureId == ZNIL) {
  23.     ljam();
  24.     freeAttrinbufrec(regOperPtr->firstAttrinbufrec);
  25.   } else {
  26.     StoredProcPtr storedPtr;
  27.     c_storedProcPool.getPtr(storedPtr, (Uint32)regOperPtr->storedProcedureId);
  28.     ndbrequire(storedPtr.p->storedCode == ZSCAN_PROCEDURE);
  29.     ljam();
  30.     storedPtr.p->storedCounter--;
  31.     regOperPtr->storedProcedureId = ZNIL;
  32.   }//if
  33.   regOperPtr->firstAttrinbufrec = RNIL;
  34.   regOperPtr->lastAttrinbufrec = RNIL;
  35. }//Dbtup::freeAllAttrBuffers()
  36. void Dbtup::freeAttrinbufrec(Uint32 anAttrBuf) 
  37. {
  38.   Uint32 Ttemp;
  39.   AttrbufrecPtr localAttrBufPtr;
  40.   Uint32 RnoFree = cnoFreeAttrbufrec;
  41.   localAttrBufPtr.i = anAttrBuf;
  42.   while (localAttrBufPtr.i != RNIL) {
  43.     ljam();
  44.     ptrCheckGuard(localAttrBufPtr, cnoOfAttrbufrec, attrbufrec);
  45.     Ttemp = localAttrBufPtr.p->attrbuf[ZBUF_NEXT];
  46.     localAttrBufPtr.p->attrbuf[ZBUF_NEXT] = cfirstfreeAttrbufrec;
  47.     cfirstfreeAttrbufrec = localAttrBufPtr.i;
  48.     localAttrBufPtr.i = Ttemp;
  49.     RnoFree++;
  50.   }//if
  51.   cnoFreeAttrbufrec = RnoFree;
  52. }//Dbtup::freeAttrinbufrec()
  53. /* ----------------------------------------------------------------- */
  54. /* ----------- ABORT THIS PART OF THE TRANSACTION ------------------ */
  55. /* ----------------------------------------------------------------- */
  56. void Dbtup::execTUP_ABORTREQ(Signal* signal) 
  57. {
  58.   OperationrecPtr regOperPtr;
  59.   FragrecordPtr regFragPtr;
  60.   TablerecPtr regTabPtr;
  61.   ljamEntry();
  62.   regOperPtr.i = signal->theData[0];
  63.   ptrCheckGuard(regOperPtr, cnoOfOprec, operationrec);
  64.   ndbrequire((regOperPtr.p->transstate == STARTED) ||
  65.              (regOperPtr.p->transstate == TOO_MUCH_AI) ||
  66.              (regOperPtr.p->transstate == ERROR_WAIT_TUPKEYREQ) ||
  67.              (regOperPtr.p->transstate == IDLE));
  68.   if (regOperPtr.p->optype == ZREAD) {
  69.     ljam();
  70.     freeAllAttrBuffers(regOperPtr.p);
  71.     initOpConnection(regOperPtr.p, 0);
  72.     return;
  73.   }//if
  74.   regTabPtr.i = regOperPtr.p->tableRef;
  75.   ptrCheckGuard(regTabPtr, cnoOfTablerec, tablerec);
  76.   regFragPtr.i = regOperPtr.p->fragmentPtr;
  77.   ptrCheckGuard(regFragPtr, cnoOfFragrec, fragrecord);
  78.   // XXX should be integrated into the code that comes after
  79.   if (!regTabPtr.p->tuxCustomTriggers.isEmpty() &&
  80.       regOperPtr.p->tupleState == NO_OTHER_OP) {
  81.     ljam();
  82.     executeTuxAbortTriggers(signal,
  83.                             regOperPtr.p,
  84.                             regTabPtr.p);
  85.     OperationrecPtr loopOpPtr;
  86.     loopOpPtr.i = regOperPtr.p->prevActiveOp;
  87.     while (loopOpPtr.i != RNIL) {
  88.       ljam();
  89.       ptrCheckGuard(loopOpPtr, cnoOfOprec, operationrec);
  90.       if (loopOpPtr.p->tupleState != ALREADY_ABORTED) {
  91.         ljam();
  92.         executeTuxAbortTriggers(signal,
  93.                                 loopOpPtr.p,
  94.                                 regTabPtr.p);
  95.       }
  96.       loopOpPtr.i = loopOpPtr.p->prevActiveOp;
  97.     }
  98.   }
  99.   Uint32 prevActiveOp = regOperPtr.p->prevActiveOp;
  100.   removeActiveOpList(regOperPtr.p);
  101.   if (regOperPtr.p->tupleState == NO_OTHER_OP) {
  102.     if (prevActiveOp == RNIL) {
  103.       ljam();
  104.       abortUpdate(signal, regOperPtr.p, regFragPtr.p, regTabPtr.p);
  105.     } else { //prevActiveOp != RNIL
  106.       setTupleStateOnPreviousOps(prevActiveOp);
  107.       if (regOperPtr.p->optype == ZDELETE) {
  108.         ljam();
  109.         OperationrecPtr prevOpPtr;
  110.         prevOpPtr.i = prevActiveOp;
  111.         ptrCheckGuard(prevOpPtr, cnoOfOprec, operationrec);
  112.         ndbrequire(prevOpPtr.p->realPageIdC != RNIL);
  113.         ndbrequire(prevOpPtr.p->optype == ZINSERT);
  114.         abortUpdate(signal, prevOpPtr.p, regFragPtr.p, regTabPtr.p);
  115.       } else {
  116.         jam();
  117.         abortUpdate(signal, regOperPtr.p, regFragPtr.p, regTabPtr.p);
  118.       }//if
  119.     }//if
  120.   } else {
  121.     ndbrequire(regOperPtr.p->tupleState == ALREADY_ABORTED);
  122.     commitUpdate(signal, regOperPtr.p, regFragPtr.p, regTabPtr.p);
  123.   }//if
  124.   initOpConnection(regOperPtr.p, regFragPtr.p);
  125. }//execTUP_ABORTREQ()
  126. void Dbtup::setTupleStateOnPreviousOps(Uint32 prevOpIndex)
  127. {
  128.   OperationrecPtr loopOpPtr;
  129.   loopOpPtr.i = prevOpIndex;
  130.   do {
  131.     ljam();
  132.     ptrCheckGuard(loopOpPtr, cnoOfOprec, operationrec);
  133.     loopOpPtr.p->tupleState = ALREADY_ABORTED;
  134.     loopOpPtr.i = loopOpPtr.p->prevActiveOp;
  135.   } while (loopOpPtr.i != RNIL);
  136. }//Dbtup::setTupleStateOnPreviousOps()
  137. /* ---------------------------------------------------------------- */
  138. /* ------------ PERFORM AN ABORT OF AN UPDATE OPERATION ----------- */
  139. /* ---------------------------------------------------------------- */
  140. void Dbtup::abortUpdate(Signal* signal,
  141.                         Operationrec*  const regOperPtr,
  142.                         Fragrecord* const regFragPtr,
  143.                         Tablerec* const regTabPtr)
  144. {
  145.    /* RESTORE THE ORIGINAL DATA */
  146.    /* THE OPER_PTR ALREADY CONTAINS BOTH THE PAGE AND THE COPY PAGE */
  147.   if (regOperPtr->realPageIdC != RNIL) {
  148.     ljam();
  149.          /***********************/
  150.          /* CHECKPOINT SPECIFIC */
  151.          /***********************/
  152.     if (isUndoLoggingNeeded(regFragPtr, regOperPtr->fragPageIdC)) {
  153.       if (regOperPtr->undoLogged) {
  154.         ljam();
  155. /* ---------------------------------------------------------------- */
  156. /*       THE UPDATE WAS MADE AFTER THE LOCAL CHECKPOINT STARTED.    */
  157. /*       THUS THE ORIGINAL TUPLE WILL BE RESTORED BY A LOG RECORD   */
  158. /*       CREATED WHEN UPDATING. THUS IT IS ENOUGH TO LOG THE UNDO   */
  159. /*       OF THE COPY RELEASE == INSERT THE COPY TUPLE HEADER WITH   */
  160. /*       NO DATA.                                                   */
  161. /* ---------------------------------------------------------------- */
  162.         cprAddUndoLogRecord(signal,
  163.                             ZLCPR_TYPE_INSERT_TH_NO_DATA,
  164.                             regOperPtr->fragPageIdC,
  165.                             regOperPtr->pageIndexC,
  166.                             regOperPtr->tableRef,
  167.                             regOperPtr->fragId,
  168.                             regFragPtr->checkpointVersion);
  169.       } else {
  170.         ljam();
  171. /* ---------------------------------------------------------------- */
  172. /*       THE UPDATE WAS MADE BEFORE THE LOCAL CHECKPOINT STARTED.   */
  173. /*       THE TUPLE WILL THUS BE RESTORED BY COPYING FROM THE COPY.  */
  174. /*       THUS WE DO NOT NEED TO RESTORE THE DATA IN THE ORIGINAL.   */
  175. /*       WE DO HOWEVER NEED TO ENSURE THAT THE COPY CONTAINS THE    */
  176. /*       CORRECT DATA.                                              */
  177. /* ---------------------------------------------------------------- */
  178.         cprAddUndoLogRecord(signal,
  179.                             ZLCPR_TYPE_INSERT_TH,
  180.                             regOperPtr->fragPageIdC,
  181.                             regOperPtr->pageIndexC,
  182.                             regOperPtr->tableRef,
  183.                             regOperPtr->fragId,
  184.                             regFragPtr->checkpointVersion);
  185.         cprAddData(signal,
  186.                    regFragPtr,
  187.                    regOperPtr->realPageIdC,
  188.                    regTabPtr->tupheadsize,
  189.                    regOperPtr->pageOffsetC);
  190.       }//if
  191.     }//if
  192.     Uint32 rpid = regOperPtr->realPageId;
  193.     Uint32 rpid_copy = regOperPtr->realPageIdC;
  194.     Uint32 offset = regOperPtr->pageOffset;
  195.     Uint32 offset_copy = regOperPtr->pageOffsetC;
  196.     Uint32 tuple_size = regTabPtr->tupheadsize;
  197.     Uint32 end = offset + tuple_size;
  198.     Uint32 end_copy = offset_copy + tuple_size;
  199.     ndbrequire(rpid < cnoOfPage &&
  200.                rpid_copy < cnoOfPage &&
  201.                end <= ZWORDS_ON_PAGE &&
  202.                end_copy <= ZWORDS_ON_PAGE);
  203.     void* Tdestination = (void*)&page[rpid].pageWord[offset + 1];
  204.     const void* Tsource = (void*)&page[rpid_copy].pageWord[offset_copy + 1];
  205.     MEMCOPY_NO_WORDS(Tdestination, Tsource, (tuple_size - 1));
  206.     {
  207.       PagePtr pagePtr;
  208.       pagePtr.i = rpid_copy;
  209.       ptrAss(pagePtr, page);
  210.       freeTh(regFragPtr,
  211.              regTabPtr,
  212.              signal,
  213.              pagePtr.p,
  214.              offset_copy);
  215.     }
  216.     regOperPtr->realPageIdC = RNIL;
  217.     regOperPtr->fragPageIdC = RNIL;
  218.     regOperPtr->pageOffsetC = ZNIL;
  219.     regOperPtr->pageIndexC = ZNIL;
  220.   }//if
  221. }//Dbtup::abortUpdate()
  222. /* **************************************************************** */
  223. /* ********************** TRANSACTION ERROR MODULE **************** */
  224. /* **************************************************************** */
  225. int Dbtup::TUPKEY_abort(Signal* signal, int error_type)
  226. {
  227.   switch(error_type) {
  228.   case 0:
  229.     ndbrequire(false);
  230.     break;
  231. // Not used currently
  232.   case 1:
  233. //tmupdate_alloc_error:
  234.     ljam();
  235.     break;
  236.   case 2:
  237.     ndbrequire(false);
  238.     break;
  239. // Not used currently
  240.     break;
  241.   case 3:
  242. //tmupdate_alloc_error:
  243.     ljam();
  244.     break;
  245.   case 4:
  246. //Trying to read non-existing attribute identity
  247.     ljam();
  248.     terrorCode = ZATTRIBUTE_ID_ERROR;
  249.     break;
  250.   case 6:
  251.     ljam();
  252.     terrorCode = ZTRY_TO_READ_TOO_MUCH_ERROR;
  253.     break;
  254.   case 7:
  255.     ljam();
  256.     terrorCode = ZAI_INCONSISTENCY_ERROR;
  257.     break;
  258.   case 8:
  259.     ljam();
  260.     terrorCode = ZATTR_INTERPRETER_ERROR;
  261.     break;
  262.   case 9:
  263.     ljam();
  264. //Trying to read non-existing attribute identity
  265.     ljam();
  266.     terrorCode = ZATTRIBUTE_ID_ERROR;
  267.     break;
  268.   case 11:
  269.     ljam();
  270.     terrorCode = ZATTR_INTERPRETER_ERROR;
  271.     break;
  272.   case 12:
  273.     ljam();
  274.     ndbrequire(false);
  275.     break;
  276.   case 13:
  277.     ljam();
  278.     ndbrequire(false);
  279.     break;
  280.   case 14:
  281.     ljam();
  282.     terrorCode = ZREGISTER_INIT_ERROR;
  283.     break;
  284.   case 15:
  285.     ljam();
  286.     terrorCode = ZREGISTER_INIT_ERROR;
  287.     break;
  288.   case 16:
  289.     ljam();
  290.     terrorCode = ZTRY_TO_UPDATE_ERROR;
  291.     break;
  292.   case 17:
  293.     ljam();
  294.     terrorCode = ZNO_ILLEGAL_NULL_ATTR;
  295.     break;
  296.   case 18:
  297.     ljam();
  298.     terrorCode = ZNOT_NULL_ATTR;
  299.     break;
  300.   case 19:
  301.     ljam();
  302.     terrorCode = ZTRY_TO_UPDATE_ERROR;
  303.     break;
  304.   case 20:
  305.     ljam();
  306.     terrorCode = ZREGISTER_INIT_ERROR;
  307.     break;
  308.   case 21:
  309.     ljam();
  310.     terrorCode = ZREGISTER_INIT_ERROR;
  311.     break;
  312.   case 22:
  313.     ljam();
  314.     terrorCode = ZTOTAL_LEN_ERROR;
  315.     break;
  316.   case 23:
  317.     ljam();
  318.     terrorCode = ZREGISTER_INIT_ERROR;
  319.     break;
  320.   case 24:
  321.     ljam();
  322.     terrorCode = ZREGISTER_INIT_ERROR;
  323.     break;
  324.   case 25:
  325.     ljam();
  326.     terrorCode = ZREGISTER_INIT_ERROR;
  327.     break;
  328.   case 26:
  329.     ljam();
  330.     terrorCode = ZREGISTER_INIT_ERROR;
  331.     break;
  332.   case 27:
  333.     ljam();
  334.     terrorCode = ZREGISTER_INIT_ERROR;
  335.     break;
  336.   case 28:
  337.     ljam();
  338.     terrorCode = ZREGISTER_INIT_ERROR;
  339.     break;
  340.   case 29:
  341.     ljam();
  342.     break;
  343.   case 30:
  344.     ljam();
  345.     terrorCode = ZCALL_ERROR;
  346.     break;
  347.   case 31:
  348.     ljam();
  349.     terrorCode = ZSTACK_OVERFLOW_ERROR;
  350.     break;
  351.   case 32:
  352.     ljam();
  353.     terrorCode = ZSTACK_UNDERFLOW_ERROR;
  354.     break;
  355.   case 33:
  356.     ljam();
  357.     terrorCode = ZNO_INSTRUCTION_ERROR;
  358.     break;
  359.   case 34:
  360.     ljam();
  361.     terrorCode = ZOUTSIDE_OF_PROGRAM_ERROR;
  362.     break;
  363.   case 35:
  364.     ljam();
  365.     terrorCode = ZTOO_MANY_INSTRUCTIONS_ERROR;
  366.     break;
  367.   case 36:
  368.     ljam();
  369.     terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  370.     break;
  371.   case 37:
  372.     ljam();
  373.     terrorCode = ZTEMPORARY_RESOURCE_FAILURE;
  374.     break;
  375.   case 38:
  376.     ljam();
  377.     terrorCode = ZTEMPORARY_RESOURCE_FAILURE;
  378.     break;
  379.   case 39:
  380.     ljam();
  381.     if (operPtr.p->transstate == TOO_MUCH_AI) {
  382.       ljam();
  383.       terrorCode = ZTOO_MUCH_ATTRINFO_ERROR;
  384.     } else if (operPtr.p->transstate == ERROR_WAIT_TUPKEYREQ) {
  385.       ljam();
  386.       terrorCode = ZSEIZE_ATTRINBUFREC_ERROR;
  387.     } else {
  388.       ndbrequire(false);
  389.     }//if
  390.     break;
  391.   default:
  392.     ndbrequire(false);
  393.     break;
  394.   }//switch
  395.   tupkeyErrorLab(signal);
  396.   return -1;
  397. }//Dbtup::TUPKEY_abort()
  398. void Dbtup::tupkeyErrorLab(Signal* signal) 
  399. {
  400.   Operationrec * const regOperPtr = operPtr.p;
  401.   freeAllAttrBuffers(regOperPtr);
  402.   abortUpdate(signal, regOperPtr, fragptr.p, tabptr.p);
  403.   removeActiveOpList(regOperPtr);
  404.   initOpConnection(regOperPtr, fragptr.p);
  405.   regOperPtr->transstate = IDLE;
  406.   regOperPtr->tupleState = NO_OTHER_OP;
  407.   TupKeyRef * const tupKeyRef = (TupKeyRef *)signal->getDataPtrSend();  
  408.   tupKeyRef->userRef = regOperPtr->userpointer;
  409.   tupKeyRef->errorCode = terrorCode;
  410.   sendSignal(regOperPtr->userblockref, GSN_TUPKEYREF, signal, 
  411.              TupKeyRef::SignalLength, JBB);
  412.   return;
  413. }//Dbtup::tupkeyErrorLab()