INT32 rtnCoordTransCommit::executeOnDataGroup( CHAR * pMsg, netMultiRouteAgent * pRouteAgent, pmdEDUCB * cb ) { INT32 rc = SDB_OK; REQUESTID_MAP requestIdMap; REPLY_QUE replyQue; MsgHeader *pMsgHead = (MsgHeader *)pMsg; DpsTransNodeMap *pNodeMap = cb->getTransNodeLst(); DpsTransNodeMap::iterator iterMap = pNodeMap->begin(); while( iterMap != pNodeMap->end() ) { rc = rtnCoordSendRequestToNode( (void *)pMsg, iterMap->second, pRouteAgent, cb, requestIdMap ); if ( rc ) { rtnCoordClearRequest( cb, requestIdMap ); } PD_RC_CHECK( rc, PDERROR, "failed to send the request to the node" "(groupID=%u, nodeID=%u, rc=%d). ", iterMap->second.columns.groupID, iterMap->second.columns.nodeID, rc ); ++iterMap; } rc = rtnCoordGetReply( cb, requestIdMap, replyQue, MAKE_REPLY_TYPE( pMsgHead->opCode ) ) ; PD_RC_CHECK( rc, PDERROR, "failed to get the reply(rc=%d)", rc ); while ( !replyQue.empty() ) { MsgOpReply *pReply = NULL; pReply = (MsgOpReply *)(replyQue.front()); replyQue.pop(); INT32 rcTmp = pReply->flags; if ( rcTmp != SDB_OK ) { rc = rc ? rc : rcTmp; PD_LOG( PDERROR, "failed to execute on data node(rc=%d, groupID=%u, nodeID=%u)", rcTmp, pReply->header.routeID.columns.groupID, pReply->header.routeID.columns.nodeID ); } SDB_OSS_FREE( pReply ); } if ( rc ) { goto error; } done: return rc; error: goto done; }
// PD_TRACE_DECLARE_FUNCTION ( SDB_RTNCOINS_INSTOGROUP, "rtnCoordInsert::insertToAGroup" ) INT32 rtnCoordInsert::insertToAGroup( CHAR *pBuffer, UINT32 grpID, netMultiRouteAgent *pRouteAgent, pmdEDUCB *cb ) { INT32 rc = SDB_OK; PD_TRACE_ENTRY ( SDB_RTNCOINS_INSTOGROUP ) ; BOOLEAN isNeedRetry = FALSE; BOOLEAN hasRetry = FALSE; CoordGroupList groupLst; CoordGroupList successGroupLst; groupLst[grpID] = grpID; MsgHeader *pHead = (MsgHeader *)pBuffer ; if ( cb->isTransaction() ) { pHead->opCode = MSG_BS_TRANS_INSERT_REQ; } do { hasRetry = isNeedRetry; isNeedRetry = FALSE; REQUESTID_MAP sendNodes; rc = rtnCoordSendRequestToNodeGroups( pBuffer, groupLst, TRUE, pRouteAgent, cb, sendNodes ); if ( rc ) { rtnCoordClearRequest( cb, sendNodes ); } PD_RC_CHECK( rc, PDERROR, "Failed to insert on data-node, " "send request failed(rc=%d)", rc ) ; REPLY_QUE replyQue; rc = rtnCoordGetReply( cb, sendNodes, replyQue, MAKE_REPLY_TYPE( pHead->opCode ) ); PD_RC_CHECK( rc, PDWARNING, "Failed to insert on data-node, " "get reply failed(rc=%d)", rc ); rc = processReply( replyQue, successGroupLst, cb ); if ( SDB_CLS_NOT_PRIMARY == rc && !hasRetry ) { isNeedRetry = TRUE; rc = SDB_OK; } PD_RC_CHECK( rc, PDWARNING, "Failed to process the reply(rc=%d)", rc ); } while ( isNeedRetry ); done: PD_TRACE_EXITRC ( SDB_RTNCOINS_INSTOGROUP, rc ) ; return rc; error: goto done; }
// PD_TRACE_DECLARE_FUNCTION ( SDB_COORDSN_CHECKREMOTEROUTEID, "CoordSession::checkRemoteRouteID" ) INT32 CoordSession::checkRemoteRouteID( const MsgRouteID & routeID ) { INT32 rc = SDB_OK; PD_TRACE_ENTRY ( SDB_COORDSN_CHECKREMOTEROUTEID ); netMultiRouteAgent *pRouteAgent = pmdGetKRCB()->getCoordCB()->getRouteAgent(); SDB_ASSERT( _pEduCB, "_pEduCB can't be NULL!" ); MsgCoordCheckRouteID msgReq; msgReq.header.requestID = 0; msgReq.header.messageLength = sizeof( MsgCoordCheckRouteID ); msgReq.header.opCode = MSG_COOR_CHECK_ROUTEID_REQ; msgReq.header.routeID.value = 0; msgReq.header.TID = _pEduCB->getTID(); msgReq.dstRouteID = routeID; REQUESTID_MAP requestIdMap; REPLY_QUE replyQue; rc = rtnCoordSendRequestToNodeWithoutCheck( (void *)(&msgReq), routeID, pRouteAgent, _pEduCB, requestIdMap ); PD_RC_CHECK( rc, PDERROR, "failed to send the message to the node" "(groupID=%u, nodeID=%u, serviceID=%u)", routeID.columns.groupID, routeID.columns.nodeID, routeID.columns.serviceID ); rc = rtnCoordGetReply( _pEduCB, requestIdMap, replyQue, MSG_COOR_CHECK_ROUTEID_RSP ); PD_RC_CHECK( rc, PDERROR, "failed to get reply from node" "(groupID=%u, nodeID=%u, serviceID=%u, rc=%d)", routeID.columns.groupID, routeID.columns.nodeID, routeID.columns.serviceID, rc ); while ( !replyQue.empty() ) { MsgOpReply *pReply = NULL; pReply = (MsgOpReply *)(replyQue.front()); SDB_ASSERT( pReply, "pReply can't be NULL!" ); replyQue.pop(); rc = rc ? rc : pReply->flags; SDB_OSS_FREE( pReply ); } done: PD_TRACE_EXIT ( SDB_COORDSN_CHECKREMOTEROUTEID ); return rc; error: rtnCoordClearRequest( _pEduCB, requestIdMap ); goto done; }
//PD_TRACE_DECLARE_FUNCTION ( SDB_RTNCOINS_INSTOGROUPS, "rtnCoordInsert::insertToGroups" ) INT32 rtnCoordInsert::insertToGroups( const GroupInsertMsgMap &groupMsgMap, MsgOpInsert *pSrcMsg, netMultiRouteAgent *pRouteAgent, pmdEDUCB *cb, CoordGroupList &successGroupList ) { INT32 rc = SDB_OK; PD_TRACE_ENTRY ( SDB_RTNCOINS_INSTOGROUPS ) ; SINT32 opCode; if ( cb->isTransaction() ) { opCode = MSG_BS_TRANS_INSERT_REQ; } else { opCode = MSG_BS_INSERT_REQ; } REQUESTID_MAP sendNodes; REPLY_QUE replyQue; rc = sendToGroups( groupMsgMap, pSrcMsg, pRouteAgent, cb, sendNodes ) ; if ( rc ) { rtnCoordClearRequest( cb, sendNodes ) ; } PD_RC_CHECK( rc, PDERROR, "Failed to send the request(rc=%d)", rc ); rc = rtnCoordGetReply( cb, sendNodes, replyQue, MAKE_REPLY_TYPE( opCode ) ) ; PD_RC_CHECK( rc, PDWARNING, "Failed to insert on data-node, " "get reply failed(rc=%d)", rc ) ; rc = processReply( replyQue, successGroupList, cb ) ; PD_RC_CHECK( rc, PDWARNING, "Failed to process the reply(rc=%d)", rc ) ; done: PD_TRACE_EXITRC ( SDB_RTNCOINS_INSTOGROUPS, rc ) ; return rc; error: goto done; }