Beispiel #1
0
 void _pmdController::registerCB( SDB_ROLE dbrole )
 {
    // For data node we need DPS ( log ), Transaction, Cluster and Bufferpool
    if ( SDB_ROLE_DATA == dbrole )
    {
       PMD_REGISTER_CB( sdbGetDPSCB() ) ;        // DPS
       PMD_REGISTER_CB( sdbGetTransCB() ) ;      // TRANS
       PMD_REGISTER_CB( sdbGetClsCB() ) ;        // CLS
       PMD_REGISTER_CB( sdbGetBPSCB() ) ;        // BPS
    }
    // For coord node we need Transaction, Coordinator and FMP
    else if ( SDB_ROLE_COORD == dbrole )
    {
       PMD_REGISTER_CB( sdbGetTransCB() ) ;      // TRANS
       PMD_REGISTER_CB( sdbGetCoordCB() ) ;      // COORD
       PMD_REGISTER_CB( sdbGetFMPCB () ) ;       // FMP
    }
    // For catalog node we need DPS ( log ), Transaction, Cluster, Catalog
    // Bufferpool and Authentication
    else if ( SDB_ROLE_CATALOG == dbrole )
    {
       PMD_REGISTER_CB( sdbGetDPSCB() ) ;        // DPS
       PMD_REGISTER_CB( sdbGetTransCB() ) ;      // TRANS
       PMD_REGISTER_CB( sdbGetClsCB() ) ;        // CLS
       PMD_REGISTER_CB( sdbGetCatalogueCB() ) ;  // CATALOGUE
       PMD_REGISTER_CB( sdbGetBPSCB() ) ;        // BPS
       PMD_REGISTER_CB( sdbGetAuthCB() ) ;       // AUTH
    }
    // For standalone mode we need DPS ( log ), Transaction and Bufferpool
    else if ( SDB_ROLE_STANDALONE == dbrole )
    {
       PMD_REGISTER_CB( sdbGetDPSCB() ) ;        // DPS
       PMD_REGISTER_CB( sdbGetTransCB() ) ;      // TRANS
       PMD_REGISTER_CB( sdbGetBPSCB() ) ;        // BPS
    }
    // For OM we need DPS ( log ), transaction, bufferpool, Authentication
    // and OMService
    else if ( SDB_ROLE_OM == dbrole )
    {
       PMD_REGISTER_CB( sdbGetDPSCB() ) ;        // DPS
       PMD_REGISTER_CB( sdbGetTransCB() ) ;      // TRANS
       PMD_REGISTER_CB( sdbGetBPSCB() ) ;        // BPS
       PMD_REGISTER_CB( sdbGetAuthCB() ) ;       // AUTH
       PMD_REGISTER_CB( sdbGetOMManager() ) ;    // OMSVC
    }
    // Everyone need DMS ( data management ), Runtime, SQL, Aggregator
    // and Controller
    PMD_REGISTER_CB( sdbGetDMSCB() ) ;           // DMS
    PMD_REGISTER_CB( sdbGetRTNCB() ) ;           // RTN
    PMD_REGISTER_CB( sdbGetSQLCB() ) ;           // SQL
    PMD_REGISTER_CB( sdbGetAggrCB() ) ;          // AGGR
    PMD_REGISTER_CB( sdbGetPMDController() ) ;   // CONTROLLER
 }
 void _pmdController::registerCB( SDB_ROLE dbrole )
 {
    if ( SDB_ROLE_DATA == dbrole )
    {
       PMD_REGISTER_CB( sdbGetDPSCB() ) ;        // DPS
       PMD_REGISTER_CB( sdbGetTransCB() ) ;      // TRANS
       PMD_REGISTER_CB( sdbGetClsCB() ) ;        // CLS
       PMD_REGISTER_CB( sdbGetBPSCB() ) ;        // BPS
    }
    else if ( SDB_ROLE_COORD == dbrole )
    {
       PMD_REGISTER_CB( sdbGetTransCB() ) ;      // TRANS
       PMD_REGISTER_CB( sdbGetCoordCB() ) ;      // COORD
       PMD_REGISTER_CB( sdbGetFMPCB () ) ;       // FMP
    }
    else if ( SDB_ROLE_CATALOG == dbrole )
    {
       PMD_REGISTER_CB( sdbGetDPSCB() ) ;        // DPS
       PMD_REGISTER_CB( sdbGetTransCB() ) ;      // TRANS
       PMD_REGISTER_CB( sdbGetClsCB() ) ;        // CLS
       PMD_REGISTER_CB( sdbGetCatalogueCB() ) ;  // CATALOGUE
       PMD_REGISTER_CB( sdbGetBPSCB() ) ;        // BPS
       PMD_REGISTER_CB( sdbGetAuthCB() ) ;       // AUTH
    }
    else if ( SDB_ROLE_STANDALONE == dbrole )
    {
       PMD_REGISTER_CB( sdbGetDPSCB() ) ;        // DPS
       PMD_REGISTER_CB( sdbGetTransCB() ) ;      // TRANS
       PMD_REGISTER_CB( sdbGetBPSCB() ) ;        // BPS
    }
    else if ( SDB_ROLE_OM == dbrole )
    {
       PMD_REGISTER_CB( sdbGetDPSCB() ) ;        // DPS
       PMD_REGISTER_CB( sdbGetTransCB() ) ;      // TRANS
       PMD_REGISTER_CB( sdbGetBPSCB() ) ;        // BPS
       PMD_REGISTER_CB( sdbGetAuthCB() ) ;       // AUTH
       PMD_REGISTER_CB( sdbGetOMManager() ) ;    // OMSVC
    }
    PMD_REGISTER_CB( sdbGetDMSCB() ) ;           // DMS
    PMD_REGISTER_CB( sdbGetRTNCB() ) ;           // RTN
    PMD_REGISTER_CB( sdbGetSQLCB() ) ;           // SQL
    PMD_REGISTER_CB( sdbGetAggrCB() ) ;          // AGGR
    PMD_REGISTER_CB( sdbGetPMDController() ) ;   // CONTROLLER
 }
   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
   }