📄 ndbif.cpp
字号:
}//if }//if }//if }//if }#ifdef VM_TRACE ndbout_c("Recevied TCKEY_FAILREF wo/ operation");#endif return; break; } case GSN_TCKEYREF: { tFirstDataPtr = int2void(tFirstData); if (tFirstDataPtr == 0) goto InvalidSignal; tOp = void2rec_op(tFirstDataPtr); if (tOp->checkMagicNumber() == 0) { tCon = tOp->theNdbCon; if (tCon != NULL) { if (tCon->theSendStatus == NdbTransaction::sendTC_OP) { tReturnCode = tOp->receiveTCKEYREF(aSignal); if (tReturnCode != -1) { completedTransaction(tCon); return; }//if break; }//if }//if } //if goto InvalidSignal; return; } case GSN_TC_COMMITCONF: { tFirstDataPtr = int2void(tFirstData); if (tFirstDataPtr == 0) goto InvalidSignal; const TcCommitConf * const commitConf = (TcCommitConf *)tDataPtr; const BlockReference aTCRef = aSignal->theSendersBlockRef; tCon = void2con(tFirstDataPtr); if ((tCon->checkMagicNumber() == 0) && (tCon->theSendStatus == NdbTransaction::sendTC_COMMIT)) { tReturnCode = tCon->receiveTC_COMMITCONF(commitConf); if (tReturnCode != -1) { completedTransaction(tCon); }//if if(tFirstData & 1){ NdbTransaction::sendTC_COMMIT_ACK(theCommitAckSignal, commitConf->transId1, commitConf->transId2, aTCRef); } return; } goto InvalidSignal; return; } case GSN_TC_COMMITREF: { tFirstDataPtr = int2void(tFirstData); if (tFirstDataPtr == 0) goto InvalidSignal; tCon = void2con(tFirstDataPtr); if ((tCon->checkMagicNumber() == 0) && (tCon->theSendStatus == NdbTransaction::sendTC_COMMIT)) { tReturnCode = tCon->receiveTC_COMMITREF(aSignal); if (tReturnCode != -1) { completedTransaction(tCon); }//if }//if return; } case GSN_TCROLLBACKCONF: { tFirstDataPtr = int2void(tFirstData); if (tFirstDataPtr == 0) goto InvalidSignal; tCon = void2con(tFirstDataPtr); if ((tCon->checkMagicNumber() == 0) && (tCon->theSendStatus == NdbTransaction::sendTC_ROLLBACK)) { tReturnCode = tCon->receiveTCROLLBACKCONF(aSignal); if (tReturnCode != -1) { completedTransaction(tCon); }//if }//if return; } case GSN_TCROLLBACKREF: { tFirstDataPtr = int2void(tFirstData); if (tFirstDataPtr == 0) goto InvalidSignal; tCon = void2con(tFirstDataPtr); if ((tCon->checkMagicNumber() == 0) && (tCon->theSendStatus == NdbTransaction::sendTC_ROLLBACK)) { tReturnCode = tCon->receiveTCROLLBACKREF(aSignal); if (tReturnCode != -1) { completedTransaction(tCon); }//if }//if return; } case GSN_TCROLLBACKREP: { tFirstDataPtr = int2void(tFirstData); if (tFirstDataPtr == 0) goto InvalidSignal; tCon = void2con(tFirstDataPtr); if (tCon->checkMagicNumber() == 0) { tReturnCode = tCon->receiveTCROLLBACKREP(aSignal); if (tReturnCode != -1) { completedTransaction(tCon); }//if }//if return; } case GSN_TCSEIZECONF: { tFirstDataPtr = int2void(tFirstData); if (tFirstDataPtr == 0) goto InvalidSignal; if (tWaitState != WAIT_TC_SEIZE) { goto InvalidSignal; }//if tCon = void2con(tFirstDataPtr); if (tCon->checkMagicNumber() != 0) { goto InvalidSignal; }//if tReturnCode = tCon->receiveTCSEIZECONF(aSignal); if (tReturnCode != -1) { theImpl->theWaiter.m_state = NO_WAIT; } else { goto InvalidSignal; }//if break; } case GSN_TCSEIZEREF: { tFirstDataPtr = int2void(tFirstData); if (tFirstDataPtr == 0) goto InvalidSignal; if (tWaitState != WAIT_TC_SEIZE) { return; }//if tCon = void2con(tFirstDataPtr); if (tCon->checkMagicNumber() != 0) { return; }//if tReturnCode = tCon->receiveTCSEIZEREF(aSignal); if (tReturnCode != -1) { theImpl->theWaiter.m_state = NO_WAIT; } else { return; }//if break; } case GSN_TCRELEASECONF: { tFirstDataPtr = int2void(tFirstData); if (tFirstDataPtr == 0) goto InvalidSignal; if (tWaitState != WAIT_TC_RELEASE) { goto InvalidSignal; }//if tCon = void2con(tFirstDataPtr); if (tCon->checkMagicNumber() != 0) { goto InvalidSignal; }//if tReturnCode = tCon->receiveTCRELEASECONF(aSignal); if (tReturnCode != -1) { theImpl->theWaiter.m_state = NO_WAIT; }//if break; } case GSN_TCRELEASEREF: { tFirstDataPtr = int2void(tFirstData); if (tFirstDataPtr == 0) goto InvalidSignal; if (tWaitState != WAIT_TC_RELEASE) { goto InvalidSignal; }//if tCon = void2con(tFirstDataPtr); if (tCon->checkMagicNumber() != 0) { goto InvalidSignal; }//if tReturnCode = tCon->receiveTCRELEASEREF(aSignal); if (tReturnCode != -1) { theImpl->theWaiter.m_state = NO_WAIT; }//if break; } case GSN_GET_TABINFOREF: case GSN_GET_TABINFO_CONF: case GSN_CREATE_TABLE_REF: case GSN_CREATE_TABLE_CONF: case GSN_DROP_TABLE_CONF: case GSN_DROP_TABLE_REF: case GSN_ALTER_TABLE_CONF: case GSN_ALTER_TABLE_REF: case GSN_CREATE_INDX_CONF: case GSN_CREATE_INDX_REF: case GSN_DROP_INDX_CONF: case GSN_DROP_INDX_REF: case GSN_CREATE_EVNT_CONF: case GSN_CREATE_EVNT_REF: case GSN_DROP_EVNT_CONF: case GSN_DROP_EVNT_REF: case GSN_LIST_TABLES_CONF: NdbDictInterface::execSignal(&theDictionary->m_receiver, aSignal, ptr); break; case GSN_SUB_META_DATA: case GSN_SUB_REMOVE_CONF: case GSN_SUB_REMOVE_REF: break; // ignore these signals case GSN_SUB_GCP_COMPLETE_REP: case GSN_SUB_START_CONF: case GSN_SUB_START_REF: case GSN_SUB_TABLE_DATA: case GSN_SUB_STOP_CONF: case GSN_SUB_STOP_REF: NdbDictInterface::execSignal(&theDictionary->m_receiver, aSignal, ptr); break; case GSN_DIHNDBTAMPER: { tFirstDataPtr = int2void(tFirstData); if (tFirstDataPtr == 0) goto InvalidSignal; if (tWaitState != WAIT_NDB_TAMPER) return; tCon = void2con(tFirstDataPtr); if (tCon->checkMagicNumber() != 0) return; tReturnCode = tCon->receiveDIHNDBTAMPER(aSignal); if (tReturnCode != -1) theImpl->theWaiter.m_state = NO_WAIT; break; } case GSN_SCAN_TABCONF: { tFirstDataPtr = int2void(tFirstData); assert(tFirstDataPtr); assert(void2con(tFirstDataPtr)); assert(void2con(tFirstDataPtr)->checkMagicNumber() == 0); if(tFirstDataPtr && (tCon = void2con(tFirstDataPtr)) && (tCon->checkMagicNumber() == 0)){ if(aSignal->m_noOfSections > 0){ tReturnCode = tCon->receiveSCAN_TABCONF(aSignal, ptr[0].p, ptr[0].sz); } else { tReturnCode = tCon->receiveSCAN_TABCONF(aSignal, tDataPtr + ScanTabConf::SignalLength, tLen - ScanTabConf::SignalLength); } if (tReturnCode != -1 && tWaitState == WAIT_SCAN) theImpl->theWaiter.m_state = NO_WAIT; break; } else { goto InvalidSignal; } } case GSN_SCAN_TABREF: { tFirstDataPtr = int2void(tFirstData); if (tFirstDataPtr == 0) goto InvalidSignal; tCon = void2con(tFirstDataPtr); assert(tFirstDataPtr != 0 && void2con(tFirstDataPtr)->checkMagicNumber() == 0); if (tCon->checkMagicNumber() == 0){ tReturnCode = tCon->receiveSCAN_TABREF(aSignal); if (tReturnCode != -1 && tWaitState == WAIT_SCAN){ theImpl->theWaiter.m_state = NO_WAIT; } break; } goto InvalidSignal; } case GSN_KEYINFO20: { tFirstDataPtr = int2void(tFirstData); NdbReceiver* tRec; if (tFirstDataPtr && (tRec = void2rec(tFirstDataPtr)) && tRec->checkMagicNumber() && (tCon = tRec->getTransaction()) && tCon->checkState_TransId(&((const KeyInfo20*)tDataPtr)->transId1)){ Uint32 len = ((const KeyInfo20*)tDataPtr)->keyLen; Uint32 info = ((const KeyInfo20*)tDataPtr)->scanInfo_Node; int com = -1; if(aSignal->m_noOfSections > 0 && len == ptr[0].sz){ com = tRec->execKEYINFO20(info, ptr[0].p, len); } else if(len == tLen - KeyInfo20::HeaderLength){ com = tRec->execKEYINFO20(info, tDataPtr+KeyInfo20::HeaderLength, len); } switch(com){ case 1: tCon->theScanningOp->receiver_delivered(tRec); theImpl->theWaiter.m_state = (((WaitSignalType) tWaitState) == WAIT_SCAN ? (Uint32) NO_WAIT : tWaitState); break; case 0: break; case -1: goto InvalidSignal; } break; } else { /** * This is ok as transaction can have been aborted before KEYINFO20 * arrives (if TUP on other node than TC) */ return; } } case GSN_TCINDXCONF:{ tFirstDataPtr = int2void(tFirstData); if (tFirstDataPtr == 0) goto InvalidSignal; const TcIndxConf * const indxConf = (TcIndxConf *)tDataPtr; const BlockReference aTCRef = aSignal->theSendersBlockRef; tCon = void2con(tFirstDataPtr); if ((tCon->checkMagicNumber() == 0) && (tCon->theSendStatus == NdbTransaction::sendTC_OP)) { tReturnCode = tCon->receiveTCINDXCONF(indxConf, tLen); if (tReturnCode != -1) { completedTransaction(tCon); }//if }//if if(TcIndxConf::getMarkerFlag(indxConf->confInfo)){ NdbTransaction::sendTC_COMMIT_ACK(theCommitAckSignal, indxConf->transId1, indxConf->transId2, aTCRef); } return; } case GSN_TCINDXREF:{ tFirstDataPtr = int2void(tFirstData); if (tFirstDataPtr == 0) goto InvalidSignal; tIndexOp = void2rec_iop(tFirstDataPtr); if (tIndexOp->checkMagicNumber() == 0) { tCon = tIndexOp->theNdbCon; if (tCon != NULL) { if (tCon->theSendStatus == NdbTransaction::sendTC_OP) { tReturnCode = tIndexOp->receiveTCINDXREF(aSignal); if (tReturnCode != -1) { completedTransaction(tCon); }//if return; }//if }//if }//if goto InvalidSignal; return; } default: goto InvalidSignal; }//switch if (theImpl->theWaiter.m_state == NO_WAIT) { // Wake up the thread waiting for response NdbCondition_Signal(theImpl->theWaiter.m_condition); }//if return; InvalidSignal:#ifdef VM_TRACE ndbout_c("Ndbif: Error Ndb::handleReceivedSignal " "(GSN=%d, theImpl->theWaiter.m_state=%d)" " sender = (Block: %d Node: %d)", tSignalNumber, tWaitState, refToBlock(aSignal->theSendersBlockRef), refToNode(aSignal->theSendersBlockRef));#endif#ifdef NDB_NO_DROPPED_SIGNAL abort();#endif return;}//Ndb::handleReceivedSignal()/*****************************************************************************void completedTransaction(NdbTransaction* aCon);Remark: One transaction has been completed. Remove it from send array and put it into the completed transaction array. Finally check if it is time to wake up a poller.******************************************************************************/void Ndb::completedTransaction(NdbTransaction* aCon){ Uint32 tTransArrayIndex = aCon->theTransArrayIndex; Uint32 tNoSentTransactions = theNoOfSentTransactions; Uint32 tNoCompletedTransactions = theNoOfCompletedTransactions; if ((tNoSentTransactions > 0) && (aCon->theListState == NdbTransaction::InSendList) && (tTransArrayIndex < tNoSentTransactions)) { NdbTransaction* tMoveCon = theSentTransactionsArray[tNoSentTransactions - 1]; theCompletedTransactionsArray[tNoCompletedTransactions] = aCon; aCon->theTransArrayIndex = tNoCompletedTransactions; if (tMoveCon != aCon) { tMoveCon->theTransArrayIndex = tTransArrayIndex; theSentTransactionsArray[tTransArrayIndex] = tMoveCon; }//if theSentTransactionsArray[tNoSentTransactions - 1] = NULL; theNoOfCompletedTransactions = tNoCompletedTransactions + 1; theNoOfSentTransactions = tNoSentTransactions - 1; aCon->theListState = NdbTransaction::InCompletedList; aCon->handleExecuteCompletion(); if ((theMinNoOfEventsToWakeUp != 0) && (theNoOfCompletedTransactions >= theMinNoOfEventsToWakeUp)) { theMinNoOfEventsToWakeUp = 0; NdbCondition_Signal(theImpl->theWaiter.m_condition); return; }//if } else { ndbout << "theNoOfSentTransactions = " << (int) theNoOfSentTransactions; ndbout << " theListState = " << (int) aCon->theListState; ndbout << " theTransArrayIndex = " << aCon->theTransArrayIndex; ndbout << endl << flush;#ifdef VM_TRACE printState("completedTransaction abort"); abort();#endif }//if}//Ndb::completedTransaction()/*****************************************************************************void reportCallback(NdbTransaction** aCopyArray, Uint32 aNoOfCompletedTrans);Remark: Call the callback methods of the completed transactions.******************************************************************************/void Ndb::reportCallback(NdbTransaction** aCopyArray, Uint32 aNoOfCompletedTrans){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -