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

📄 ndbif.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	      }//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 + -