// PD_TRACE_DECLARE_FUNCTION ( SDB_RTNCOQUERY_GETNODEGROUPS, "rtnCoordQuery::getNodeGroups" )
   INT32 rtnCoordQuery::getNodeGroups( const CoordCataInfoPtr &cataInfo,
                                       BSONObj &queryObj,
                                       const CoordGroupList &sendGroupLst,
                                       CoordGroupList &groupLst )
   {
      INT32 rc = SDB_OK;
      PD_TRACE_ENTRY ( SDB_RTNCOQUERY_GETNODEGROUPS ) ;

      cataInfo->getGroupByMatcher( queryObj, groupLst ) ;
      PD_CHECK( groupLst.size() > 0, SDB_CAT_NO_MATCH_CATALOG, error, PDERROR,
               "failed to get match groups" );
      {
      CoordGroupList::const_iterator iterList
                              = sendGroupLst.begin();
      while( iterList != sendGroupLst.end() )
      {
         groupLst.erase( iterList->first );
         ++iterList;
      }
      }

   done:
      PD_TRACE_EXITRC ( SDB_RTNCOQUERY_GETNODEGROUPS, rc ) ;
      return rc;
   error:
      goto done;
   }
 INT32 rtnCoordDelete::getNodeGroups( const CoordCataInfoPtr &cataInfo,
                         bson::BSONObj &deleteObj,
                         CoordGroupList &sendGroupLst,
                         CoordGroupList &groupLst )
 {
    INT32 rc = SDB_OK;
    PD_TRACE_ENTRY ( SDB_RTNCODEL_GETNODEGROUPS ) ;
    cataInfo->getGroupByMatcher( deleteObj, groupLst );
    if ( groupLst.size() <= 0 )
    {
       rc = SDB_CAT_NO_MATCH_CATALOG;
    }
    else
    {
       CoordGroupList::iterator iter = sendGroupLst.begin();
       while( iter != sendGroupLst.end() )
       {
          groupLst.erase( iter->first );
          ++iter;
       }
    }
    PD_TRACE_EXITRC ( SDB_RTNCODEL_GETNODEGROUPS, rc ) ;
    return rc;
 }
   INT32 rtnCoordInsert::insertToMainCL( const CoordCataInfoPtr &cataInfo,
                                         CHAR *pReceiveBuffer,
                                         CHAR *pInsertor, INT32 count,
                                         netMultiRouteAgent *pRouteAgent,
                                         pmdEDUCB *cb,
                                         GroupSubCLMap &groupSubCLMap )
   {
      INT32 rc = SDB_OK ;
      INT32 filler = 0 ;
      GroupInsertMsgMap groupMsgMap ;
      CoordGroupList successGroupList ;
      std::vector< BSONObj > subCLInfoCache ;

      if ( groupSubCLMap.size() == 0 )
      {
         rc = shardDataByGroup( cataInfo, count, pInsertor, cb,
                                groupSubCLMap ) ;
      }
      else
      {
         rc = reshardData( cataInfo, cb, groupSubCLMap );
      }
      PD_RC_CHECK( rc, PDERROR, "Failed to shard the data(rc=%d)", rc ) ;

      if ( cb->isTransaction() )
      {
         CoordGroupList groupLst;
         GroupSubCLMap::iterator iterMap = groupSubCLMap.begin();
         while( iterMap != groupSubCLMap.end() )
         {
            groupLst[ iterMap->first ] = iterMap->first;
            ++iterMap ;
         }
         rc = buildTransSession( groupLst, pRouteAgent, cb ) ;
         PD_RC_CHECK( rc, PDERROR, "Failed to build transaction "
                      "session(rc=%d)", rc ) ;
      }

      {
         CHAR *pHeadRemain = pReceiveBuffer + sizeof( MsgHeader );
         INT32 remainLen = pInsertor - pHeadRemain ;
         rc = buildInsertMsg( pHeadRemain, remainLen, groupSubCLMap,
                              subCLInfoCache, &filler, groupMsgMap );
         PD_RC_CHECK( rc, PDERROR, "Failed to build the message(rc=%d)",
                      rc ) ;
      }

      rc = insertToGroups( groupMsgMap, (MsgOpInsert *)pReceiveBuffer,
                           pRouteAgent, cb, successGroupList ) ;
      if ( rc != SDB_OK )
      {
         CoordGroupList::iterator iterSuc = successGroupList.begin() ;
         while( iterSuc != successGroupList.end() )
         {
            groupSubCLMap.erase( iterSuc->first );
            ++iterSuc ;
         }
         PD_LOG( PDWARNING, "failed to insert the data(rc=%d)", rc );
         goto error ;
      }
      else
      {
         groupSubCLMap.clear();
      }

   done:
      return rc;
   error:
      goto done;
   }
   INT32 rtnCoordInsert::insertToNormalCL( const CoordCataInfoPtr &cataInfo,
                                           CHAR *pReceiveBuffer,
                                           CHAR *pInsertor, INT32 count,
                                           netMultiRouteAgent *pRouteAgent,
                                           pmdEDUCB *cb,
                                           GroupObjsMap &groupObjsMap,
                                           BOOLEAN &hasSendSomeData )
   {
      INT32 rc = SDB_OK;
      INT32 filler = 0;
      GroupInsertMsgMap groupMsgMap;
      CoordGroupList successGroupList;

      if ( groupObjsMap.size() == 0 )
      {
         rc = shardDataByGroup( cataInfo, count, pInsertor, groupObjsMap ) ;
      }
      else
      {
         rc = reshardData( cataInfo, groupObjsMap ) ;
      }
      PD_RC_CHECK( rc, PDERROR, "Failed to shard the data by group(rc=%d)",
                   rc ) ;

      if ( cb->isTransaction() )
      {
         CoordGroupList groupLst ;
         GroupObjsMap::iterator iterGroup ;
         iterGroup = groupObjsMap.begin();
         while( iterGroup != groupObjsMap.end() )
         {
            groupLst[ iterGroup->first ] = iterGroup->first ;
            ++iterGroup ;
         }
         rc = buildTransSession( groupLst, pRouteAgent, cb ) ;
         PD_RC_CHECK( rc, PDERROR,
                      "Failed to build transaction session(rc=%d)",
                      rc ) ;
      }

      if ( groupObjsMap.size() == 1 && !hasSendSomeData )
      {
         GroupObjsMap::iterator iterMap = groupObjsMap.begin();
         rc = insertToAGroup( pReceiveBuffer, iterMap->first,
                              pRouteAgent, cb );
         PD_RC_CHECK( rc, PDERROR,
                      "Failed to insert on group(groupID:%u, rc=%d)",
                      iterMap->first, rc );
         successGroupList[iterMap->first] = iterMap->first ;
      }
      else
      {
         CHAR *pHeadRemain = pReceiveBuffer + sizeof( MsgHeader );
         INT32 remainLen = pInsertor - pHeadRemain;
         rc = buildInsertMsg( pHeadRemain, remainLen, groupObjsMap,
                              &filler, groupMsgMap ) ;
         PD_RC_CHECK( rc, PDERROR,"Failed to build the message(rc=%d)", rc );

         rc = insertToGroups( groupMsgMap, (MsgOpInsert *)pReceiveBuffer,
                              pRouteAgent, cb, successGroupList ) ;
         if ( successGroupList.size() != 0 )
         {
            hasSendSomeData = TRUE ;
         }
         if ( rc != SDB_OK )
         {
            CoordGroupList::iterator iterSuc = successGroupList.begin();
            while( iterSuc != successGroupList.end() )
            {
               groupObjsMap.erase( iterSuc->first ) ;
               ++iterSuc ;
            }
            PD_LOG( PDWARNING, "Failed to insert the data(rc=%d)", rc ) ;
            goto error ;
         }
         else
         {
            groupObjsMap.clear() ;
         }
      }

   done:
      return rc ;
   error:
      goto done ;
   }