//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_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 _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 }
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; }