INT32 rtnCoordTransRollback::execute( MsgHeader *pMsg, pmdEDUCB *cb, INT64 &contextID, rtnContextBuf *buf ) { INT32 rc = SDB_OK; pmdKRCB *pKrcb = pmdGetKRCB(); CoordCB *pCoordcb = pKrcb->getCoordCB(); netMultiRouteAgent *pRouteAgent = pCoordcb->getRouteAgent(); contextID = -1 ; if ( !cb->isTransaction() ) { rc = SDB_DPS_TRANS_NO_TRANS ; goto error; } // add last op info MON_SAVE_OP_DETAIL( cb->getMonAppCB(), MSG_BS_TRANS_ROLLBACK_REQ, "TransactionID: 0x%016x(%llu)", cb->getTransID(), cb->getTransID() ) ; rc = rtnCoordTransOperator::rollBack( cb, pRouteAgent ) ; PD_RC_CHECK( rc, PDERROR, "Rollback transaction failed, rc: %d", rc ) ; done: return rc ; error: goto done; }
INT32 rtnCoord2PhaseCommit::doPhase2( CHAR * pReceiveBuffer, SINT32 packSize, CHAR * * ppResultBuffer, pmdEDUCB * cb, MsgOpReply & replyHeader ) { INT32 rc = SDB_OK; pmdKRCB *pKrcb = pmdGetKRCB(); CoordCB *pCoordcb = pKrcb->getCoordCB(); netMultiRouteAgent *pRouteAgent = pCoordcb->getRouteAgent(); CHAR *pMsgReq = NULL; MsgHeader *pMsgHead = NULL; CoordGroupList groupLst; CoordGroupList sendGroupLst; rc = buildPhase2Msg( pReceiveBuffer, &pMsgReq ); PD_RC_CHECK( rc, PDERROR, "failed to build the message on phase1(rc=%d)", rc ); pMsgHead = (MsgHeader *)pMsgReq; pMsgHead->TID = cb->getTID(); rc = executeOnDataGroup( pMsgReq, pRouteAgent, cb ); PD_RC_CHECK( rc, PDERROR, "failed to execute on data-group on phase1(rc=%d)", rc ); done: if ( pMsgReq ) { SDB_OSS_FREE( pMsgReq ); pMsgReq = NULL; } return rc; error: goto done; }
INT32 rtnCoordTransRollback::execute( CHAR * pReceiveBuffer, SINT32 packSize, CHAR * * ppResultBuffer, pmdEDUCB * cb, MsgOpReply & replyHeader, BSONObj **ppErrorObj ) { INT32 rc = SDB_OK; CHAR *pMsgReq = NULL; MsgHeader *pMsgHead = NULL; INT32 bufferSize = 0; pmdKRCB *pKrcb = pmdGetKRCB(); CoordCB *pCoordcb = pKrcb->getCoordCB(); netMultiRouteAgent *pRouteAgent = pCoordcb->getRouteAgent(); MsgHeader *pHeader = (MsgHeader *)pReceiveBuffer; replyHeader.header.messageLength = sizeof( MsgOpReply ); replyHeader.header.opCode = MSG_BS_TRANS_ROLLBACK_RSP; replyHeader.header.routeID.value = 0; replyHeader.contextID = -1; replyHeader.flags = SDB_OK; replyHeader.numReturned = 0; replyHeader.startFrom = 0; if ( pHeader ) { replyHeader.header.requestID = pHeader->requestID; replyHeader.header.TID = pHeader->TID; } if ( !cb->isTransaction() ) { rc = SDB_DPS_TRANS_NO_TRANS; goto error; } cb->startRollback(); rc = msgBuildTransRollbackMsg( &pMsgReq, &bufferSize ); PD_RC_CHECK( rc, PDERROR, "failed to build the message(rc=%d)", rc ); pMsgHead = (MsgHeader *)pMsgReq; pMsgHead->TID = cb->getTID(); rc = executeOnDataGroup( pMsgReq, pRouteAgent, cb ); cb->delTransaction(); PD_RC_CHECK( rc, PDERROR, "failed to rollback(rc=%d)", rc ); done: if ( pMsgReq ) { SDB_OSS_FREE( pMsgReq ); } cb->stopRollback(); return rc; error: replyHeader.flags = rc; goto done; }
/* _coordOmStrategyAccessor implement */ _coordOmStrategyAccessor::_coordOmStrategyAccessor( INT64 timeout ) { pmdKRCB *krcb = pmdGetKRCB() ; CoordCB *pCoord = krcb->getCoordCB() ; pmdOptionsCB *optionsCB = krcb->getOptionCB() ; _pOmProxy = pCoord->getResource()->getOmProxy() ; _oprTimeout = timeout ; optionsCB->getFieldStr( PMD_OPTION_CLUSTER_NAME, _clsName, "" ) ; optionsCB->getFieldStr( PMD_OPTION_BUSINESS_NAME, _bizName, "" ) ; }
// PD_TRACE_DECLARE_FUNCTION( SDB__QGMPLDELETE__EXEC, "_qgmPlDelete::_execute" ) INT32 _qgmPlDelete::_execute( _pmdEDUCB *eduCB ) { PD_TRACE_ENTRY( SDB__QGMPLDELETE__EXEC ) ; INT32 rc = SDB_OK ; _SDB_KRCB *krcb = pmdGetKRCB() ; SDB_ROLE role = krcb->getDBRole() ; CHAR *msg = NULL ; INT32 bufSize = 0 ; if ( SDB_ROLE_COORD == role ) { CoordCB *pCoord = krcb->getCoordCB() ; INT64 contextID = -1 ; rtnContextBuf buff ; coordDeleteOperator opr ; rc = msgBuildDeleteMsg( &msg, &bufSize, _collection.toString().c_str(), 0, 0, _condition.isEmpty() ? NULL : &_condition, NULL, eduCB ) ; if ( rc ) { PD_LOG( PDERROR, "Build delete message failed, rc: %d", rc ) ; goto error ; } rc = opr.init( pCoord->getResource(), eduCB ) ; if ( rc ) { PD_LOG( PDERROR, "Init operator[%s] failed, rc: %d", opr.getName(), rc ) ; goto error ; } rc = opr.execute( (MsgHeader*)msg, eduCB, contextID, &buff ) ; } else { SDB_DPSCB *dpsCB = krcb->getDPSCB() ; if ( dpsCB && eduCB->isFromLocal() && !dpsCB->isLogLocal() ) { dpsCB = NULL ; } SDB_DMSCB *dmsCB = krcb->getDMSCB() ; BSONObj empty ; rc = rtnDelete( _collection.toString().c_str(), _condition, empty, 0, eduCB, dmsCB, dpsCB ) ; } if ( rc ) { goto error ; } done: if ( NULL != msg ) { msgReleaseBuffer( msg, eduCB ) ; } PD_TRACE_EXITRC( SDB__QGMPLDELETE__EXEC, rc ) ; return rc ; error: goto done ; }
//PD_TRACE_DECLARE_FUNCTION ( SDB_RTNCODEL_EXECUTE, "rtnCoordDelete::execute" ) INT32 rtnCoordDelete::execute( CHAR *pReceiveBuffer, SINT32 packSize, pmdEDUCB *cb, MsgOpReply &replyHeader, rtnContextBuf *buf ) { INT32 rc = SDB_OK; pmdKRCB *pKrcb = pmdGetKRCB(); CoordCB *pCoordcb = pKrcb->getCoordCB(); netMultiRouteAgent *pRouteAgent = pCoordcb->getRouteAgent(); rtnCoordOperator *pRollbackOperator = NULL; BOOLEAN isNeedRefresh = FALSE; BOOLEAN hasRefresh = FALSE; CoordGroupList sendGroupLst; BSONObj boDeletor; MsgHeader *pHeader = (MsgHeader *)pReceiveBuffer; replyHeader.header.messageLength = sizeof( MsgOpReply ); replyHeader.header.opCode = MSG_BS_DELETE_RES; replyHeader.header.requestID = pHeader->requestID; replyHeader.header.routeID.value = 0; replyHeader.header.TID = pHeader->TID; replyHeader.contextID = -1; replyHeader.flags = SDB_OK; replyHeader.numReturned = 0; replyHeader.startFrom = 0; INT32 flag = 0; CHAR *pCollectionName = NULL; CHAR *pDeletor = NULL; CHAR *pHint = NULL; rc = msgExtractDelete( pReceiveBuffer, &flag, &pCollectionName, &pDeletor, &pHint ); PD_RC_CHECK( rc, PDERROR, "failed to parse delete request(rc=%d)", rc ); try { boDeletor = BSONObj( pDeletor ); } catch ( std::exception &e ) { PD_RC_CHECK( SDB_INVALIDARG, PDERROR, "delete failed, received unexpected error:%s", e.what() ); } do { hasRefresh = isNeedRefresh; CoordCataInfoPtr cataInfo; rc = rtnCoordGetCataInfo(cb, pCollectionName, isNeedRefresh, cataInfo ); PD_RC_CHECK( rc, PDERROR, "delete failed, " "failed to get the catalogue info(collection name:%s)", pCollectionName ); if ( cataInfo->isMainCL() ) { std::set< INT32 > emptyRCList; CoordSubCLlist subCLList; rc = cataInfo->getMatchSubCLs( boDeletor, subCLList ); PD_RC_CHECK( rc, PDERROR, "failed to get match sub-collection(rc=%d)", rc ); rc = modifyOpOnMainCL( cataInfo, subCLList, (MsgHeader *)pReceiveBuffer, pRouteAgent, cb, isNeedRefresh, emptyRCList, sendGroupLst ); } else { rc = deleteNormalCL( cataInfo, boDeletor, (MsgOpDelete *)pReceiveBuffer, pRouteAgent, cb, sendGroupLst ); } if ( !hasRefresh && ( (!cb->isTransaction() && rtnCoordWriteRetryRC( rc )) || SDB_CLS_COORD_NODE_CAT_VER_OLD == rc || SDB_CLS_NO_CATALOG_INFO == rc || SDB_CAT_NO_MATCH_CATALOG == rc )) { isNeedRefresh = TRUE; } else { isNeedRefresh = FALSE; } }while( isNeedRefresh ); if ( cb->isTransaction() ) { rc = rc ? rc : cb->getTransRC(); } PD_RC_CHECK( rc, PDERROR, "delete failed(rc=%d)", rc ) ; done: return rc; error: if ( cb->isTransaction() ) { pRollbackOperator = pCoordcb->getProcesserFactory()->getOperator( MSG_BS_TRANS_ROLLBACK_REQ ); if ( pRollbackOperator ) { pRollbackOperator->execute( pReceiveBuffer, packSize, cb, replyHeader, NULL ); } } replyHeader.flags = rc; goto done; }
INT32 _pmdCoordProcessor::_processCoordMsg( MsgHeader *msg, MsgOpReply &replyHeader, rtnContextBuf &contextBuff ) { INT32 rc = SDB_OK ; if ( NULL != _pErrorObj ) { SDB_OSS_DEL _pErrorObj ; _pErrorObj = NULL ; } if ( NULL != _pResultBuff ) { _pResultBuff = NULL ; } CoordCB *pCoordcb = _pKrcb->getCoordCB(); rtnCoordProcesserFactory *pProcesserFactory = pCoordcb->getProcesserFactory(); if ( MSG_AUTH_VERIFY_REQ == msg->opCode ) { rc = SDB_COORD_UNKNOWN_OP_REQ ; goto done ; } else if ( MSG_BS_INTERRUPTE == msg->opCode || MSG_BS_INTERRUPTE_SELF == msg->opCode || MSG_BS_DISCONNECT == msg->opCode ) { } else if ( !getClient()->isAuthed() ) { rc = getClient()->authenticate( "", "" ) ; if ( rc ) { goto done ; } } switch ( msg->opCode ) { case MSG_BS_GETMORE_REQ : rc = SDB_COORD_UNKNOWN_OP_REQ ; break ; case MSG_BS_QUERY_REQ: { MsgOpQuery *pQueryMsg = ( MsgOpQuery * )msg ; CHAR *pQueryName = pQueryMsg->name ; SINT32 queryNameLen = pQueryMsg->nameLength ; if ( queryNameLen > 0 && '$' == pQueryName[0] ) { rtnCoordCommand *pCmdProcesser = pProcesserFactory->getCommandProcesser( pQueryMsg ) ; if ( NULL != pCmdProcesser ) { rc = pCmdProcesser->execute( ( CHAR *)msg, msg->messageLength, eduCB(), replyHeader, &contextBuff ) ; break ; } } } default: { rtnContextBase *pContext = NULL ; rtnCoordOperator *pOperator = pProcesserFactory->getOperator( msg->opCode ) ; rc = pOperator->execute( ( CHAR* )msg, msg->messageLength, eduCB(), replyHeader, &contextBuff ) ; if ( MSG_BS_QUERY_REQ == msg->opCode && ( ((MsgOpQuery*)msg)->flags & FLG_QUERY_WITH_RETURNDATA ) && -1 != replyHeader.contextID && NULL != ( pContext = _pRTNCB->contextFind( replyHeader.contextID ) ) ) { rc = pContext->getMore( -1, contextBuff, eduCB() ) ; if ( rc || pContext->eof() ) { _pRTNCB->contextDelete( replyHeader.contextID, eduCB() ) ; replyHeader.contextID = -1 ; } if ( SDB_DMS_EOC == rc ) { rc = SDB_OK ; } else if ( rc ) { PD_LOG( PDERROR, "Failed to query with return data, " "rc: %d", rc ) ; } } } break; } if ( rc && contextBuff.size() == 0 ) { if ( NULL != _pErrorObj ) { contextBuff = rtnContextBuf( *_pErrorObj ) ; } else { BSONObj obj = utilGetErrorBson( rc, eduCB()->getInfo( EDU_INFO_ERROR ) ) ; contextBuff = rtnContextBuf( obj ) ; } } done: return rc ; }
//PD_TRACE_DECLARE_FUNCTION ( SDB_RTNCODEL_EXECUTE, "rtnCoordDelete::execute" ) INT32 rtnCoordDelete::execute( MsgHeader *pMsg, pmdEDUCB *cb, INT64 &contextID, rtnContextBuf *buf ) { INT32 rc = SDB_OK ; INT32 rcTmp = SDB_OK ; PD_TRACE_ENTRY ( SDB_RTNCODEL_EXECUTE ) ; pmdKRCB *pKrcb = pmdGetKRCB() ; CoordCB *pCoordcb = pKrcb->getCoordCB() ; netMultiRouteAgent *pRouteAgent = pCoordcb->getRouteAgent() ; // process define rtnSendOptions sendOpt( TRUE ) ; rtnSendMsgIn inMsg( pMsg ) ; rtnProcessResult result ; ROUTE_RC_MAP nokRC ; result._pNokRC = &nokRC ; CoordCataInfoPtr cataInfo ; MsgRouteID errNodeID ; UINT64 deleteNum = 0 ; inMsg._pvtData = ( CHAR* )&deleteNum ; inMsg._pvtType = PRIVATE_DATA_NUMBERLONG ; BSONObj boDeletor ; // fill default-reply(delete success) MsgOpDelete *pDelMsg = (MsgOpDelete *)pMsg ; INT32 oldFlag = pDelMsg->flags ; pDelMsg->flags |= FLG_DELETE_RETURNNUM ; contextID = -1 ; INT32 flag = 0; CHAR *pCollectionName = NULL ; CHAR *pDeletor = NULL ; CHAR *pHint = NULL ; rc = msgExtractDelete( (CHAR*)pMsg, &flag, &pCollectionName, &pDeletor, &pHint ) ; if( rc ) { PD_LOG( PDERROR,"Failed to parse delete request, rc: %d", rc ) ; pCollectionName = NULL ; goto error ; } try { boDeletor = BSONObj( pDeletor ) ; } catch ( std::exception &e ) { PD_RC_CHECK( SDB_INVALIDARG, PDERROR, "Delete failed, received unexpected error:%s", e.what() ) ; } // add last op info MON_SAVE_OP_DETAIL( cb->getMonAppCB(), pMsg->opCode, "Collection:%s, Deletor:%s, Hint:%s, " "Flag:0x%08x(%u)", pCollectionName, boDeletor.toString().c_str(), BSONObj(pHint).toString().c_str(), oldFlag, oldFlag ) ; rc = rtnCoordGetCataInfo( cb, pCollectionName, FALSE, cataInfo ) ; PD_RC_CHECK( rc, PDERROR, "Delete failed, failed to get the " "catalogue info(collection name: %s), rc: %d", pCollectionName, rc ) ; retry: do { pDelMsg->version = cataInfo->getVersion() ; pDelMsg->w = 0 ; if ( cataInfo->isMainCL() ) { rcTmp = doOpOnMainCL( cataInfo, boDeletor, inMsg, sendOpt, pRouteAgent, cb, result ) ; } else { rcTmp = doOpOnCL( cataInfo, boDeletor, inMsg, sendOpt, pRouteAgent, cb, result ) ; } }while( FALSE ) ; if ( SDB_OK == rcTmp && nokRC.empty() ) { goto done ; } else if ( checkRetryForCLOpr( rcTmp, &nokRC, inMsg.msg(), sendOpt._retryTimes, cataInfo, cb, rc, &errNodeID, TRUE ) ) { nokRC.clear() ; ++sendOpt._retryTimes ; goto retry ; } else { PD_LOG( PDERROR, "Delete failed on node[%s], rc: %d", routeID2String( errNodeID ).c_str(), rc ) ; goto error ; } done: if ( oldFlag & FLG_DELETE_RETURNNUM ) { contextID = deleteNum ; } if ( pCollectionName ) { /// AUDIT PD_AUDIT_OP( AUDIT_DML, MSG_BS_DELETE_REQ, AUDIT_OBJ_CL, pCollectionName, rc, "DeletedNum:%u, Deletor:%s, Hint:%s, Flag:0x%08x(%u)", deleteNum, boDeletor.toString().c_str(), BSONObj(pHint).toString().c_str(), oldFlag, oldFlag ) ; } PD_TRACE_EXITRC ( SDB_RTNCODEL_EXECUTE, rc ) ; return rc ; error: goto done ; }
INT32 _pmdExternClient::authenticate( MsgHeader *pMsg ) { #if defined ( SDB_ENGINE ) INT32 rc = SDB_OK ; BSONObj authObj ; BSONElement user, pass ; rc = extractAuthMsg( pMsg, authObj ) ; if ( rc ) { PD_LOG( PDERROR, "Client[%s] extract auth msg failed, rc: %d", clientName(), rc ) ; goto error ; } user = authObj.getField( SDB_AUTH_USER ) ; pass = authObj.getField( SDB_AUTH_PASSWD ) ; _isAuthed = FALSE ; if ( SDB_ROLE_STANDALONE == pmdGetDBRole() ) // not auth { _isAuthed = TRUE ; goto done ; } else if ( SDB_ROLE_OM == pmdGetDBRole() ) { rc = sdbGetOMManager()->authenticate( authObj, _pEDUCB ) ; if ( rc ) { PD_LOG( PDERROR, "Client[%s] authenticate failed[user: %s, " "passwd: %s], rc: %d", clientName(), user.valuestrsafe(), pass.valuestrsafe(), rc ) ; goto error ; } _isAuthed = TRUE ; } else if ( SDB_ROLE_COORD == pmdGetDBRole() ) { INT64 contextID = -1 ; rtnContextBuf buf ; CoordCB *pCoordcb = pmdGetKRCB()->getCoordCB(); rtnCoordProcesserFactory *pProcesserFactory = pCoordcb->getProcesserFactory(); rtnCoordOperator *pOperator = NULL ; pOperator = pProcesserFactory->getOperator( pMsg->opCode ); rc = pOperator->execute( pMsg, _pEDUCB, contextID, &buf ) ; // special handling for password verification when there is no // addrlist specified. Usually this happen when there is only // one coord node before creating the first catalog if ( MSG_AUTH_VERIFY_REQ == pMsg->opCode && SDB_CAT_NO_ADDR_LIST == rc ) { rc = SDB_OK ; _isAuthed = TRUE ; } else if ( rc ) { PD_LOG( PDERROR, "Client[%s] authenticate failed[user: %s, " "passwd: %s], rc: %d", clientName(), user.valuestrsafe(), pass.valuestrsafe(), rc ) ; goto error ; } else { _isAuthed = TRUE ; } } else { MsgHeader *pAuthRes = NULL ; shardCB *pShard = sdbGetShardCB() ; UINT32 retryTimes = 0 ; MsgOpReply replyHeader ; replyHeader.contextID = -1 ; replyHeader.numReturned = 0 ; while ( TRUE ) { ++retryTimes ; rc = pShard->syncSend( pMsg, CATALOG_GROUPID, TRUE, &pAuthRes ) ; if ( SDB_OK != rc ) { rc = pShard->syncSend( pMsg, CATALOG_GROUPID, FALSE, &pAuthRes ) ; PD_RC_CHECK( rc, PDERROR, "Client[%s] failed to send auth " "req to catalog, rc: %d", clientName(), rc ) ; } if ( NULL == pAuthRes ) { rc = SDB_SYS ; PD_LOG( PDERROR, "syncsend return ok but res is NULL" ) ; goto error ; } rc = MSG_GET_INNER_REPLY_RC(pAuthRes) ; replyHeader.flags = rc ; replyHeader.startFrom = MSG_GET_INNER_REPLY_STARTFROM(pAuthRes) ; ossMemcpy( &(replyHeader.header), pAuthRes, sizeof( MsgHeader ) ) ; /// release recv msg SDB_OSS_FREE( (BYTE*)pAuthRes ) ; pAuthRes = NULL ; if ( SDB_CLS_NOT_PRIMARY == rc && retryTimes < PMD_AUTH_RETRY_TIMES ) { INT32 rcTmp = SDB_OK ; rcTmp = pShard->updatePrimaryByReply( &(replyHeader.header) ) ; if ( SDB_NET_CANNOT_CONNECT == rcTmp ) { /// the node is crashed, sleep some seconds PD_LOG( PDWARNING, "Catalog group primary node is crashed " "but other nodes not aware, sleep %d seconds", NET_NODE_FAULTUP_MIN_TIME ) ; ossSleep( NET_NODE_FAULTUP_MIN_TIME * OSS_ONE_SEC ) ; } if ( rcTmp ) { pShard->updateCatGroup( CLS_SHARD_TIMEOUT ) ; } continue ; } else if ( rc ) { PD_LOG( PDERROR, "Client[%s] authenticate failed[user: %s, " "passwd: %s], rc: %d", clientName(), user.valuestrsafe(), pass.valuestrsafe(), rc ) ; goto error ; } else { _isAuthed = TRUE ; } break ; } } done: if ( SDB_OK == rc && _isAuthed ) { _username = user.valuestrsafe() ; if ( !_username.empty() ) { _password = pass.valuestrsafe() ; } _pEDUCB->setUserInfo( _username, _password ) ; _makeName() ; CHAR szTmp[ 16 ] = { 0 } ; ossSnprintf( szTmp, sizeof(szTmp)-1, "%llu", _pEDUCB->getID() ) ; PD_AUDIT_OP( AUDIT_ACCESS, MSG_AUTH_VERIFY_REQ, AUDIT_OBJ_SESSION, szTmp, SDB_OK, "User[UserName:%s, RemoteIP:%s, RemotePort:%u, " "LocalIP:%s, LocalPort:%u] login succeed", getUsername(), getPeerIPAddr(), getPeerPort(), getLocalIPAddr(), getLocalPort() ) ; } return rc ; error: if ( SDB_AUTH_AUTHORITY_FORBIDDEN == rc ) { _pEDUCB->printInfo( EDU_INFO_ERROR, "username or passwd is wrong" ) ; } goto done ; #else _isAuthed = TRUE ; return SDB_OK ; #endif // SDB_ENGINE }
// PD_TRACE_DECLARE_FUNCTION ( SDB_RTNCOINS_EXECUTE, "rtnCoordInsert::execute" ) INT32 rtnCoordInsert::execute( CHAR *pReceiveBuffer, SINT32 packSize, pmdEDUCB *cb, MsgOpReply &replyHeader, rtnContextBuf *buf ) { INT32 rc = SDB_OK; PD_TRACE_ENTRY ( SDB_RTNCOINS_EXECUTE ) ; pmdKRCB *pKrcb = pmdGetKRCB(); CoordCB *pCoordcb = pKrcb->getCoordCB(); netMultiRouteAgent *pRouteAgent = pCoordcb->getRouteAgent(); rtnCoordOperator *pRollbackOperator = NULL; MsgHeader *pHeader = (MsgHeader *)pReceiveBuffer; replyHeader.header.messageLength = sizeof( MsgOpReply ); replyHeader.header.opCode = MSG_BS_INSERT_RES; replyHeader.header.requestID = pHeader->requestID; replyHeader.header.routeID.value = 0; replyHeader.header.TID = pHeader->TID; replyHeader.contextID = -1; replyHeader.flags = SDB_OK; replyHeader.numReturned = 0; replyHeader.startFrom = 0; MsgOpInsert *pSrcMsg = (MsgOpInsert *)pReceiveBuffer; BOOLEAN isNeedRefreshCata = FALSE; GroupObjsMap groupObjsMap; BOOLEAN hasSendSomeData = FALSE; GroupSubCLMap groupSubCLMap; INT32 flag = 0; CHAR *pCollectionName = NULL; CHAR *pInsertor = NULL; INT32 count = 0; rc = msgExtractInsert( pReceiveBuffer, &flag, &pCollectionName, &pInsertor, count ) ; PD_RC_CHECK( rc, PDERROR, "Failed to parse insert request" ); pSrcMsg->header.TID = cb->getTID(); if ( cb->isTransaction() ) { pSrcMsg->header.opCode = MSG_BS_TRANS_INSERT_REQ; } else { pSrcMsg->header.opCode = MSG_BS_INSERT_REQ; } while ( TRUE ) { CoordCataInfoPtr cataInfo; rc = rtnCoordGetCataInfo( cb, pCollectionName, isNeedRefreshCata, cataInfo ); PD_RC_CHECK( rc, PDERROR, "Failed to get the catalog info(collection name:%s)", pCollectionName ); pSrcMsg->header.routeID.value = 0; pSrcMsg->version = cataInfo->getVersion(); if ( !cataInfo->isSharded() ) { CoordGroupList groupLst; cataInfo->getGroupLst( groupLst ); PD_CHECK( groupLst.size() > 0, SDB_SYS, error, PDERROR, "invalid catalog-info, no group-info" ); rc = buildTransSession( groupLst, pRouteAgent, cb ); PD_RC_CHECK( rc, PDERROR, "Failed to build transaction session(rc=%d)", rc ); CoordGroupList::iterator iterLst = groupLst.begin(); rc = insertToAGroup( pReceiveBuffer, iterLst->first, pRouteAgent, cb ); }//end of if ( !cataInfo->isSharded() ) else if( !cataInfo->isMainCL() ) { rc = insertToNormalCL( cataInfo, pReceiveBuffer, pInsertor, count, pRouteAgent, cb, groupObjsMap, hasSendSomeData ) ; }//end of else if( !cataInfo->isMainCL() ) else { rc = insertToMainCL( cataInfo, pReceiveBuffer, pInsertor, count, pRouteAgent, cb, groupSubCLMap ) ; } if ( SDB_OK != rc ) { if ( !isNeedRefreshCata && ( (!cb->isTransaction() && rtnCoordWriteRetryRC( rc )) || SDB_CLS_COORD_NODE_CAT_VER_OLD == rc || SDB_CLS_NO_CATALOG_INFO == rc || SDB_CAT_NO_MATCH_CATALOG == rc )) { isNeedRefreshCata = TRUE; continue; } if ( SDB_CLS_COORD_NODE_CAT_VER_OLD == rc ) { rc = SDB_CAT_NO_MATCH_CATALOG; } PD_RC_CHECK ( rc, PDERROR, "Failed to insert the record to " "data-node, rc = %d", rc ) ; } break; } if ( cb->isTransaction() ) { rc = rc ? rc : cb->getTransRC(); } if ( rc ) { goto error; } done: PD_TRACE_EXITRC ( SDB_RTNCOINS_EXECUTE, rc ) ; return rc; error: if ( cb->isTransaction() ) { pRollbackOperator = pCoordcb->getProcesserFactory()->getOperator( MSG_BS_TRANS_ROLLBACK_REQ ); if ( pRollbackOperator ) { pRollbackOperator->execute( pReceiveBuffer, packSize, cb, replyHeader, NULL ); } } replyHeader.flags = rc; goto done; }
INT32 rtnCoordQuery::execute( CHAR *pReceiveBuffer, SINT32 packSize, CHAR **ppResultBuffer, pmdEDUCB *cb, MsgOpReply &replyHeader, BSONObj **ppErrorObj ) { INT32 rc = SDB_OK ; pmdKRCB *pKrcb = pmdGetKRCB(); CoordCB *pCoordcb = pKrcb->getCoordCB(); netMultiRouteAgent *pRouteAgent = pCoordcb->getRouteAgent(); rtnContextCoord *pContext = NULL ; BSONObj boQuery; BSONObj boOrderBy; CoordGroupList sendGroupList ; MsgHeader*pHeader = (MsgHeader *)pReceiveBuffer; replyHeader.header.messageLength = sizeof( MsgOpReply ); replyHeader.header.opCode = MSG_BS_QUERY_RES; replyHeader.header.requestID = pHeader->requestID; replyHeader.header.routeID.value = 0; replyHeader.header.TID = pHeader->TID; replyHeader.contextID = -1; replyHeader.flags = SDB_OK; replyHeader.numReturned = 0; replyHeader.startFrom = 0; INT32 flag = 0; CHAR *pCollectionName = NULL; SINT64 numToSkip = 0; SINT64 numToReturn = 0; CHAR *pQuery = NULL; CHAR *pFieldSelector = NULL; CHAR *pOrderBy = NULL; CHAR *pHint = NULL; BSONObj *err = NULL ; MsgOpQuery *pSrc = (MsgOpQuery *)pReceiveBuffer; rc = msgExtractQuery( pReceiveBuffer, &flag, &pCollectionName, &numToSkip, &numToReturn, &pQuery, &pFieldSelector, &pOrderBy, &pHint ); PD_RC_CHECK( rc, PDERROR, "failed to parse query request(rc=%d)", rc ); if ( pCollectionName != NULL && '$' == pCollectionName[0] ) { rtnCoordCommand *pCmdProcesser = NULL; rtnCoordProcesserFactory *pProcesserFactory = pCoordcb->getProcesserFactory(); pCmdProcesser = pProcesserFactory->getCommandProcesser( pCollectionName ); PD_CHECK( pCmdProcesser != NULL, SDB_INVALIDARG, error, PDERROR, "unknown command:%s", pCollectionName ); rc = pCmdProcesser->execute( pReceiveBuffer, packSize, ppResultBuffer, cb, replyHeader, &err ); SDB_ASSERT( NULL == err, "impossible" ); PD_RC_CHECK( rc, PDERROR, "failed to execute the command(command:%s, " "rc=%d)", pCollectionName, rc ); goto done; } try { boQuery = BSONObj( pQuery ); boOrderBy = BSONObj( pOrderBy ); } catch ( std::exception &e ) { PD_RC_CHECK( SDB_INVALIDARG, PDERROR, "occur unexpected error:%s", e.what() ); } rc = executeQuery( (CHAR *)pSrc, boQuery, boOrderBy, pCollectionName, pRouteAgent, cb, pContext ) ; PD_RC_CHECK( rc, PDERROR, "query failed(rc=%d)", rc ); replyHeader.contextID = pContext->contextID() ; pContext->addSubDone( cb ); done: return rc; error: replyHeader.flags = rc; goto done; }
// PD_TRACE_DECLARE_FUNCTION( SDB__QGMPLCOMMAND_EXECONCOORD, "_qgmPlCommand::_executeOnCoord" ) INT32 _qgmPlCommand::_executeOnCoord( _pmdEDUCB *eduCB ) { PD_TRACE_ENTRY( SDB__QGMPLCOMMAND_EXECONCOORD ) ; INT32 rc = SDB_OK ; CoordCB *pCoord = pmdGetKRCB()->getCoordCB() ; coordCommandFactory *pFactory = coordGetFactory() ; coordOperator *pOpr = NULL ; CHAR *msg = NULL ; INT32 bufSize = 0 ; const CHAR *pCommand = NULL ; rtnContextBuf buff ; if ( SQL_GRAMMAR::CRTCS == _commandType ) { pCommand = CMD_NAME_CREATE_COLLECTIONSPACE ; BSONObj obj = BSON( FIELD_NAME_NAME << _fullName.toString() ) ; rc = msgBuildQueryMsg( &msg, &bufSize, CMD_ADMIN_PREFIX CMD_NAME_CREATE_COLLECTIONSPACE, 0, 0, 0, -1, &obj, NULL, NULL, NULL, eduCB ) ; } else if ( SQL_GRAMMAR::DROPCS == _commandType ) { pCommand = CMD_NAME_DROP_COLLECTIONSPACE ; BSONObj obj = BSON( FIELD_NAME_NAME << _fullName.toString() ) ; rc = msgBuildQueryMsg( &msg, &bufSize, CMD_ADMIN_PREFIX CMD_NAME_DROP_COLLECTIONSPACE, 0, 0, 0, -1, &obj, NULL, NULL, NULL, eduCB ) ; } else if ( SQL_GRAMMAR::CRTCL == _commandType ) { pCommand = CMD_NAME_CREATE_COLLECTION ; BSONObj obj ; if ( _partition.isEmpty() ) { obj = BSON( FIELD_NAME_NAME << _fullName.toString() ) ; } else { obj = BSON( FIELD_NAME_NAME << _fullName.toString() << FIELD_NAME_SHARDINGKEY << _partition ) ; } rc = msgBuildQueryMsg( &msg, &bufSize, CMD_ADMIN_PREFIX CMD_NAME_CREATE_COLLECTION, 0, 0, 0, -1, &obj, NULL, NULL, NULL, eduCB ) ; } else if ( SQL_GRAMMAR::DROPCL == _commandType ) { pCommand = CMD_NAME_DROP_COLLECTION ; BSONObj obj = BSON( FIELD_NAME_NAME << _fullName.toString() ) ; rc = msgBuildQueryMsg( &msg, &bufSize, CMD_ADMIN_PREFIX CMD_NAME_DROP_COLLECTION, 0, 0, 0, -1, &obj, NULL, NULL, NULL, eduCB ) ; } else if ( SQL_GRAMMAR::CRTINDEX == _commandType ) { pCommand = CMD_NAME_CREATE_INDEX ; BSONObjBuilder builder ; qgmOPFieldVec::const_iterator itr = _indexColumns.begin() ; for ( ; itr != _indexColumns.end(); itr++ ) { builder.append( itr->value.attr().toString(), SQL_GRAMMAR::ASC == itr->type? 1 : -1 ) ; } BSONObj index ; if ( !_uniqIndex ) { index = BSON( IXM_FIELD_NAME_KEY << builder.obj() << IXM_FIELD_NAME_NAME << _indexName.toString() ) ; } else { BSONObjBuilder indexBuilder ; indexBuilder.append( IXM_FIELD_NAME_KEY, builder.obj()) ; indexBuilder.append( IXM_FIELD_NAME_NAME, _indexName.toString()) ; indexBuilder.appendBool( IXM_FIELD_NAME_UNIQUE, TRUE ) ; index = indexBuilder.obj() ; } BSONObj obj = BSON( FIELD_NAME_COLLECTION << _fullName.toString() << FIELD_NAME_INDEX << index ) ; rc = msgBuildQueryMsg( &msg, &bufSize, CMD_ADMIN_PREFIX CMD_NAME_CREATE_INDEX, 0, 0, 0, -1, &obj, NULL, NULL, NULL, eduCB ) ; } else if ( SQL_GRAMMAR::DROPINDEX == _commandType ) { pCommand = CMD_NAME_DROP_INDEX ; BSONObj obj = BSON( FIELD_NAME_COLLECTION << _fullName.toString() << FIELD_NAME_INDEX << BSON( IXM_FIELD_NAME_NAME << _indexName.toString() << IXM_FIELD_NAME_KEY << "" ) ) ; rc = msgBuildQueryMsg( &msg, &bufSize, CMD_ADMIN_PREFIX CMD_NAME_DROP_INDEX, 0, 0, 0, -1, &obj, NULL, NULL, NULL, eduCB ) ; } else if ( SQL_GRAMMAR::LISTCS == _commandType ) { pCommand = CMD_NAME_LIST_COLLECTIONSPACES ; BSONObj obj ; rc = msgBuildQueryMsg( &msg, &bufSize, CMD_ADMIN_PREFIX CMD_NAME_LIST_COLLECTIONSPACES, 0, 0, 0, -1, &obj, NULL, NULL, NULL, eduCB ) ; } else if ( SQL_GRAMMAR::LISTCL == _commandType ) { pCommand = CMD_NAME_LIST_COLLECTIONS ; BSONObj obj ; rc = msgBuildQueryMsg( &msg, &bufSize, CMD_ADMIN_PREFIX CMD_NAME_LIST_COLLECTIONS, 0, 0, 0, -1, &obj, NULL, NULL, NULL, eduCB ) ; } else if ( SQL_GRAMMAR::BEGINTRAN == _commandType ) { coordTransBegin opr ; MsgOpTransBegin transMsg ; transMsg.header.messageLength = sizeof( MsgOpTransBegin ) ; transMsg.header.opCode = MSG_BS_TRANS_BEGIN_REQ ; transMsg.header.TID = 0 ; transMsg.header.routeID.value = 0 ; rc = opr.init( pCoord->getResource(), eduCB ) ; if ( rc ) { PD_LOG( PDERROR, "Init operator[%s] failed, rc: %d", opr.getName(), rc ) ; goto error ; } rc = opr.execute( ( MsgHeader *)&transMsg, eduCB, _contextID, &buff ) ; if ( rc ) { PD_LOG( PDERROR, "Execute operator[%s] failed, rc: %d", opr.getName(), rc ) ; goto error ; } } else if ( SQL_GRAMMAR::ROLLBACK == _commandType ) { coordTransRollback opr ; MsgOpTransRollback transMsg ; transMsg.header.messageLength = sizeof( MsgOpTransRollback ) ; transMsg.header.opCode = MSG_BS_TRANS_ROLLBACK_REQ ; transMsg.header.TID = 0 ; transMsg.header.routeID.value = 0 ; rc = opr.init( pCoord->getResource(), eduCB ) ; if ( rc ) { PD_LOG( PDERROR, "Init operator[%s] failed, rc: %d", opr.getName(), rc ) ; goto error ; } rc = opr.execute( ( MsgHeader *)&transMsg, eduCB, _contextID, &buff ) ; if ( rc ) { PD_LOG( PDERROR, "Execute operator[%s] failed, rc: %d", opr.getName(), rc ) ; goto error ; } } else if ( SQL_GRAMMAR::COMMIT == _commandType ) { coordTransCommit opr ; MsgOpTransCommit transMsg ; transMsg.header.messageLength = sizeof( MsgOpTransCommit ) ; transMsg.header.opCode = MSG_BS_TRANS_COMMIT_REQ ; transMsg.header.TID = 0 ; transMsg.header.routeID.value = 0 ; rc = opr.init( pCoord->getResource(), eduCB ) ; if ( rc ) { PD_LOG( PDERROR, "Init operator[%s] failed, rc: %d", opr.getName(), rc ) ; goto error ; } rc = opr.execute( ( MsgHeader *)&transMsg, eduCB, _contextID, &buff ) ; if ( rc ) { PD_LOG( PDERROR, "Execute operator[%s] failed, rc: %d", opr.getName(), rc ) ; goto error ; } } else { PD_LOG( PDERROR, "Invalid command type:%d", _commandType ) ; rc = SDB_SYS ; goto error ; } if ( rc ) { PD_LOG( PDERROR, "Build message failed, rc: %d", rc ) ; goto error ; } if ( pCommand ) { rc = pFactory->create( pCommand, pOpr ) ; if ( rc ) { PD_LOG( PDERROR, "Create operator by name[%s] failed, rc: %d", pCommand, rc ) ; goto error ; } rc = pOpr->init( pCoord->getResource(), eduCB ) ; if ( rc ) { PD_LOG( PDERROR, "Init operator[%s] failed, rc: %d", pOpr->getName(), rc ) ; goto error ; } SDB_ASSERT( msg, "Msg cant' be NULL" ) ; if ( !msg ) { rc = SDB_SYS ; goto error ; } rc = pOpr->execute( (MsgHeader*)msg, eduCB, _contextID, &buff ) ; if ( rc ) { PD_LOG( PDERROR, "Execute operator[%s] failed, rc: %d", pOpr->getName(), rc ) ; goto error ; } } done: if ( NULL != msg ) { msgReleaseBuffer( msg, eduCB ) ; } if ( pOpr ) { pFactory->release( pOpr ) ; } PD_TRACE_EXITRC( SDB__QGMPLCOMMAND_EXECONCOORD, rc ) ; return rc ; error: goto done ; }