📄 dbtcmain.cpp
字号:
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 + -