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;
   }
Exemple #3
0
   // 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;
   }