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

📄 dbtcmain.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
📖 第 1 页 / 共 5 页
字号:
  case 57:{    jam();    /**     * Initialize object before starting error handling     */    initApiConnectRec(signal, apiConnectptr.p, true);    switch(getNodeState().startLevel){    case NodeState::SL_STOPPING_2:    case NodeState::SL_STOPPING_3:    case NodeState::SL_STOPPING_4:      if(getNodeState().stopping.systemShutdown)	terrorCode  = ZCLUSTER_SHUTDOWN_IN_PROGRESS;      else	terrorCode = ZNODE_SHUTDOWN_IN_PROGRESS;      break;    case NodeState::SL_SINGLEUSER:      terrorCode  = ZCLUSTER_IN_SINGLEUSER_MODE;      break;    default:      terrorCode = ZWRONG_STATE;      break;    }    abortErrorLab(signal);    return;  }  case 58:{    jam();    releaseAtErrorLab(signal);    return;  }  case 59:{    jam();    terrorCode = ZABORTINPROGRESS;    abortErrorLab(signal);    return;  }      default:    jam();    systemErrorLab(signal, __LINE__);    return;  }//switch}void Dbtc::execKEYINFO(Signal* signal) {  UintR compare_transid1, compare_transid2;  jamEntry();  apiConnectptr.i = signal->theData[0];  tmaxData = 20;  if (apiConnectptr.i >= capiConnectFilesize) {    jam();    warningHandlerLab(signal, __LINE__);    return;  }//if  ptrAss(apiConnectptr, apiConnectRecord);  ttransid_ptr = 1;  compare_transid1 = apiConnectptr.p->transid[0] ^ signal->theData[1];  compare_transid2 = apiConnectptr.p->transid[1] ^ signal->theData[2];  compare_transid1 = compare_transid1 | compare_transid2;  if (compare_transid1 != 0) {    jam();    printState(signal, 10);    sendSignalErrorRefuseLab(signal);    return;  }//if  switch (apiConnectptr.p->apiConnectstate) {  case CS_RECEIVING:  case CS_REC_COMMITTING:  case CS_START_SCAN:    jam();    /*empty*/;    break;                /* OK */  case CS_ABORTING:    jam();    return;     /* IGNORE */  case CS_CONNECTED:    jam();    /****************************************************************>*/    /*       MOST LIKELY CAUSED BY A MISSED SIGNAL. SEND REFUSE AND   */    /*       SET STATE TO ABORTING.                                   */    /****************************************************************>*/    printState(signal, 11);    signalErrorRefuseLab(signal);    return;  case CS_STARTED:    jam();    /****************************************************************>*/    /*       MOST LIKELY CAUSED BY A MISSED SIGNAL. SEND REFUSE AND   */    /*       SET STATE TO ABORTING. SINCE A TRANSACTION WAS STARTED   */    /*       WE ALSO NEED TO ABORT THIS TRANSACTION.                  */    /****************************************************************>*/    terrorCode = ZSIGNAL_ERROR;    printState(signal, 2);    abortErrorLab(signal);    return;  default:    jam();    warningHandlerLab(signal, __LINE__);    return;  }//switch  CacheRecord *localCacheRecord = cacheRecord;  UintR TcacheFilesize = ccacheFilesize;  UintR TcachePtr = apiConnectptr.p->cachePtr;  UintR TtcTimer = ctcTimer;  CacheRecord * const regCachePtr = &localCacheRecord[TcachePtr];  if (TcachePtr >= TcacheFilesize) {    TCKEY_abort(signal, 42);    return;  }//if  setApiConTimer(apiConnectptr.i, TtcTimer, __LINE__);  cachePtr.i = TcachePtr;  cachePtr.p = regCachePtr;  tcConnectptr.i = apiConnectptr.p->lastTcConnect;  ptrCheckGuard(tcConnectptr, ctcConnectFilesize, tcConnectRecord);  switch (tcConnectptr.p->tcConnectstate) {  case OS_WAIT_KEYINFO:    jam();    tckeyreq020Lab(signal);    return;  case OS_WAIT_SCAN:    break;  default:    jam();    terrorCode = ZSTATE_ERROR;    abortErrorLab(signal);    return;  }//switch  UintR TdataPos = 0;  UintR TkeyLen = regCachePtr->keylen;  UintR Tlen = regCachePtr->save1;  do {    if (cfirstfreeDatabuf == RNIL) {      jam();      seizeDatabuferrorLab(signal);      return;    }//if    linkKeybuf(signal);    arrGuard(TdataPos, 19);    databufptr.p->data[0] = signal->theData[TdataPos + 3];    databufptr.p->data[1] = signal->theData[TdataPos + 4];    databufptr.p->data[2] = signal->theData[TdataPos + 5];    databufptr.p->data[3] = signal->theData[TdataPos + 6];    Tlen = Tlen + 4;    TdataPos = TdataPos + 4;    if (Tlen < TkeyLen) {      jam();      if (TdataPos >= tmaxData) {        jam();	/*----------------------------------------------------*/	/** EXIT AND WAIT FOR SIGNAL KEYINFO OR KEYINFO9     **/	/** WHEN EITHER OF THE SIGNALS IS RECEIVED A JUMP    **/	/** TO LABEL "KEYINFO_LABEL" IS DONE. THEN THE       **/	/** PROGRAM RETURNS TO LABEL TCKEYREQ020             **/	/*----------------------------------------------------*/        setApiConTimer(apiConnectptr.i, ctcTimer, __LINE__);        regCachePtr->save1 = Tlen;        return;      }//if    } else {      jam();      return;    }//if  } while (1);  return;}//Dbtc::execKEYINFO()/*---------------------------------------------------------------------------*//*                                                                           *//* MORE THAN FOUR WORDS OF KEY DATA. WE NEED TO PACK THIS IN KEYINFO SIGNALS.*//* WE WILL ALWAYS PACK 4 WORDS AT A TIME.                                    *//*---------------------------------------------------------------------------*/void Dbtc::packKeyData000Lab(Signal* signal,                             BlockReference TBRef,			     Uint32 totalLen) {  CacheRecord * const regCachePtr = cachePtr.p;  jam();  Uint32 len = 0;  databufptr.i = regCachePtr->firstKeybuf;  signal->theData[0] = tcConnectptr.i;  signal->theData[1] = apiConnectptr.p->transid[0];  signal->theData[2] = apiConnectptr.p->transid[1];  Uint32 * dst = signal->theData+3;  ptrCheckGuard(databufptr, cdatabufFilesize, databufRecord);    do {    jam();    databufptr.i = databufptr.p->nextDatabuf;    dst[len + 0] = databufptr.p->data[0];    dst[len + 1] = databufptr.p->data[1];    dst[len + 2] = databufptr.p->data[2];    dst[len + 3] = databufptr.p->data[3];    len += 4;    if (totalLen <= 4) {      jam();      /*---------------------------------------------------------------------*/      /*       LAST PACK OF KEY DATA HAVE BEEN SENT                          */      /*---------------------------------------------------------------------*/      /*       THERE WERE UNSENT INFORMATION, SEND IT.                       */      /*---------------------------------------------------------------------*/      sendSignal(TBRef, GSN_KEYINFO, signal, 3 + len, JBB);      return;    } else if(len == KeyInfo::DataLength){      jam();      len = 0;      sendSignal(TBRef, GSN_KEYINFO, signal, 3 + KeyInfo::DataLength, JBB);    }    totalLen -= 4;    ptrCheckGuard(databufptr, cdatabufFilesize, databufRecord);  } while (1);}//Dbtc::packKeyData000Lab()void Dbtc::tckeyreq020Lab(Signal* signal) {  CacheRecord * const regCachePtr = cachePtr.p;  UintR TdataPos = 0;  UintR TkeyLen = regCachePtr->keylen;  UintR Tlen = regCachePtr->save1;  do {    if (cfirstfreeDatabuf == RNIL) {      jam();      seizeDatabuferrorLab(signal);      return;    }//if    linkKeybuf(signal);    arrGuard(TdataPos, 19);    databufptr.p->data[0] = signal->theData[TdataPos + 3];    databufptr.p->data[1] = signal->theData[TdataPos + 4];    databufptr.p->data[2] = signal->theData[TdataPos + 5];    databufptr.p->data[3] = signal->theData[TdataPos + 6];    Tlen = Tlen + 4;    TdataPos = TdataPos + 4;    if (Tlen < TkeyLen) {      jam();      if (TdataPos >= tmaxData) {        jam();	/*----------------------------------------------------*/	/** EXIT AND WAIT FOR SIGNAL KEYINFO OR KEYINFO9     **/	/** WHEN EITHER OF THE SIGNALS IS RECEIVED A JUMP    **/	/** TO LABEL "KEYINFO_LABEL" IS DONE. THEN THE       **/	/** PROGRAM RETURNS TO LABEL TCKEYREQ020             **/	/*----------------------------------------------------*/        setApiConTimer(apiConnectptr.i, ctcTimer, __LINE__);        regCachePtr->save1 = Tlen;        tcConnectptr.p->tcConnectstate = OS_WAIT_KEYINFO;        return;      }//if    } else {      jam();      tckeyreq050Lab(signal);      return;    }//if  } while (1);  return;}//Dbtc::tckeyreq020Lab()/* ------------------------------------------------------------------------- *//* -------        SAVE ATTRIBUTE INFORMATION IN OPERATION RECORD     ------- *//* ------------------------------------------------------------------------- */void Dbtc::saveAttrbuf(Signal* signal) {  CacheRecord * const regCachePtr = cachePtr.p;  UintR TfirstfreeAttrbuf = cfirstfreeAttrbuf;  UintR TattrbufFilesize = cattrbufFilesize;  UintR TTcfirstAttrbuf = regCachePtr->firstAttrbuf;  UintR Tlen = signal->length() - 3;  AttrbufRecord *localAttrbufRecord = attrbufRecord;  AttrbufRecord * const regAttrPtr = &localAttrbufRecord[TfirstfreeAttrbuf];  if (TfirstfreeAttrbuf >= TattrbufFilesize) {    TCKEY_abort(signal, 21);    return;  }//if  UintR Tnext = regAttrPtr->attrbuf[ZINBUF_NEXT];  if (TTcfirstAttrbuf == RNIL) {    jam();    regCachePtr->firstAttrbuf = TfirstfreeAttrbuf;  } else {    AttrbufRecordPtr saAttrbufptr;    saAttrbufptr.i = regCachePtr->lastAttrbuf;    jam();    if (saAttrbufptr.i >= TattrbufFilesize) {      TCKEY_abort(signal, 22);      return;    }//if    saAttrbufptr.p = &localAttrbufRecord[saAttrbufptr.i];    saAttrbufptr.p->attrbuf[ZINBUF_NEXT] = TfirstfreeAttrbuf;  }//if  cfirstfreeAttrbuf = Tnext;  regAttrPtr->attrbuf[ZINBUF_NEXT] = RNIL;  regCachePtr->lastAttrbuf = TfirstfreeAttrbuf;  regAttrPtr->attrbuf[ZINBUF_DATA_LEN] = Tlen;  UintR Tdata1 = signal->theData[3];  UintR Tdata2 = signal->theData[4];  UintR Tdata3 = signal->theData[5];  UintR Tdata4 = signal->theData[6];  UintR Tdata5 = signal->theData[7];  UintR Tdata6 = signal->theData[8];  UintR Tdata7 = signal->theData[9];  UintR Tdata8 = signal->theData[10];  regAttrPtr->attrbuf[0] = Tdata1;  regAttrPtr->attrbuf[1] = Tdata2;  regAttrPtr->attrbuf[2] = Tdata3;  regAttrPtr->attrbuf[3] = Tdata4;  regAttrPtr->attrbuf[4] = Tdata5;  regAttrPtr->attrbuf[5] = Tdata6;  regAttrPtr->attrbuf[6] = Tdata7;  regAttrPtr->attrbuf[7] = Tdata8;  if (Tlen > 8) {    Tdata1 = signal->theData[11];    Tdata2 = signal->theData[12];    Tdata3 = signal->theData[13];    Tdata4 = signal->theData[14];    Tdata5 = signal->theData[15];    Tdata6 = signal->theData[16];    Tdata7 = signal->theData[17];    regAttrPtr->attrbuf[8] = Tdata1;    regAttrPtr->attrbuf[9] = Tdata2;    regAttrPtr->attrbuf[10] = Tdata3;    regAttrPtr->attrbuf[11] = Tdata4;    regAttrPtr->attrbuf[12] = Tdata5;    regAttrPtr->attrbuf[13] = Tdata6;    regAttrPtr->attrbuf[14] = Tdata7;    jam();    if (Tlen > 15) {      Tdata1 = signal->theData[18];      Tdata2 = signal->theData[19];      Tdata3 = signal->theData[20];      Tdata4 = signal->theData[21];      Tdata5 = signal->theData[22];      Tdata6 = signal->theData[23];      Tdata7 = signal->theData[24];      jam();      regAttrPtr->attrbuf[15] = Tdata1;      regAttrPtr->attrbuf[16] = Tdata2;      regAttrPtr->attrbuf[17] = Tdata3;      regAttrPtr->attrbuf[18] = Tdata4;      regAttrPtr->attrbuf[19] = Tdata5;      regAttrPtr->attrbuf[20] = Tdata6;      regAttrPtr->attrbuf[21] = Tdata7;    }//if  }//if}//Dbtc::saveAttrbuf()void Dbtc::execATTRINFO(Signal* signal) {  UintR compare_transid1, compare_transid2;  UintR Tdata1 = signal->theData[0];  UintR Tlength = signal->length();  UintR TapiConnectFilesize = capiConnectFilesize;  ApiConnectRecord *localApiConnectRecord = apiConnectRecord;  jamEntry();  apiConnectptr.i = Tdata1;  ttransid_ptr = 1;  if (Tdata1 >= TapiConnectFilesize) {    DEBUG("Drop ATTRINFO, wrong apiConnectptr");    TCKEY_abort(signal, 18);    return;  }//if  UintR Tdata2 = signal->theData[1];  UintR Tdata3 = signal->theData[2];  ApiConnectRecord * const regApiPtr = &localApiConnectRecord[Tdata1];  compare_transid1 = regApiPtr->transid[0] ^ Tdata2;  compare_transid2 = regApiPtr->transid[1] ^ Tdata3;  apiConnectptr.p = regApiPtr;  compare_transid1 = compare_transid1 | compare_transid2;  if (compare_transid1 != 0) {    DEBUG("Drop ATTRINFO, wrong transid, lenght="<<Tlength	  << " transid("<<hex<<Tdata2<<", "<<Tdata3);    TCKEY_abort(signal, 19);    return;  }//if  if (Tlength < 4) {    DEBUG("Drop ATTRINFO, wrong length = " << Tlength);    TCKEY_abort(signal, 20);    return;  }  Tlength -= 3;  UintR TcompREC_COMMIT = (regApiPtr->apiConnectstate == CS_REC_COMMITTING);  UintR TcompRECEIVING = (regApiPtr->apiConnectstate == CS_RECEIVING);  UintR TcompBOTH = TcompREC_COMMIT | TcompRECEIVING;  if (TcompBOTH) {    jam();    if (ERROR_INSERTED(8015)) {      CLEAR_ERROR_INSERT_VALUE;      return;    }//if    if (ERROR_INSERTED(8016)) {      CLEAR_ERROR_INSERT_VALUE;      return;    }//if    CacheRecord *localCacheRecord = cacheRecord;    UintR TcacheFilesize = ccacheFilesize;    UintR TcachePtr = regApiPtr->cachePtr;    UintR TtcTimer = ctcTimer;    CacheRecord * const regCachePtr = &localCacheRecord[TcachePtr];    if (TcachePtr >= TcacheFilesize) {      TCKEY_abort(signal, 43);      return;    }//if    UintR TfirstfreeAttrbuf = cfirstfreeAttrbuf;    UintR TcurrReclenAi = regCachePtr->currReclenAi;    UintR TattrLen = regCachePtr->attrlength;    setApiConTimer(apiConnectptr.i, TtcTimer, __LINE__);    cachePtr.i = TcacheP

⌨️ 快捷键说明

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