예제 #1
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__NETEVNHND_SYNCSND, "_netEventHandler::syncSend" )
   INT32 _netEventHandler::syncSend( const void *buf,
                                     UINT32 len )
   {
      INT32 rc = SDB_OK ;
      PD_TRACE_ENTRY ( SDB__NETEVNHND_SYNCSND );
      UINT32 send = 0 ;

      _lastSendTick = pmdGetDBTick() ;

      try
      {
         while ( send < len )
         {
            send +=  _sock.send(buffer((const void*)((ossValuePtr)buf + send),
                                        len - send));
         }
      }
      catch ( boost::system::system_error &e )
      {
         PD_LOG( PDERROR, "Failed to send to node :%d, %d, %d, %s",
                 _id.columns.groupID, _id.columns.nodeID,
                 _id.columns.serviceID, e.what() ) ;
         rc = SDB_NET_SEND_ERR ;
         goto error ;
      }

   done:
      PD_TRACE_EXITRC ( SDB__NETEVNHND_SYNCSND, rc );
      return rc ;
   error:
      goto done ;
   }
예제 #2
0
 _netEventHandler::_netEventHandler( _netFrame *frame ):
                                     _sock(frame->ioservice()),
                                     _buf(NULL),
                                     _bufLen(0),
                                     _state(NET_EVENT_HANDLER_STATE_HEADER),
                                     _frame(frame),
                                     _handle(_frame->allocateHandle())
 {
    _id.value      = MSG_INVALID_ROUTEID ;
    _isConnected   = FALSE ;
    _isInAsync     = FALSE ;
    _hasRecvMsg    = FALSE ;
    _lastSendTick  = pmdGetDBTick() ;
    _lastRecvTick  = pmdGetDBTick() ;
    _lastBeatTick  = pmdGetDBTick() ;
    _isAcitve      = FALSE ;
    _msgid         = 0 ;
 }
예제 #3
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__DPSLGWRAPP_WRITEDATA, "_dpsLogWrapper::writeData" )
   void _dpsLogWrapper::writeData ( dpsMergeInfo & info )
   {
      PD_TRACE_ENTRY ( SDB__DPSLGWRAPP_WRITEDATA ) ;

      _lastWriteTick = pmdGetDBTick() ;
      ++_writeReordNum ;

      _buf.writeData( info ) ;

      IExecutor *cb = info.getEDUCB() ;

      if ( cb )
      {
         if ( info.hasDummy() )
         {
            cb->insertLsn( info.getDummyBlock().record().head()._lsn ) ;
         }
         cb->insertLsn( info.getMergeBlock().record().head()._lsn ) ;
      }

      if ( _vecEventHandler.size() > 0 && info.isNeedNotify() )
      {
         DPS_LSN_OFFSET offset = DPS_INVALID_LSN_OFFSET ;
         if ( info.hasDummy() )
         {
            offset = info.getDummyBlock().record().head()._lsn ;
            for( UINT32 i = 0 ; i < _vecEventHandler.size() ; ++i )
            {
               _vecEventHandler[i]->onWriteLog( offset ) ;
            }
         }
         offset = info.getMergeBlock().record().head()._lsn ;
         for( UINT32 i = 0 ; i < _vecEventHandler.size() ; ++i )
         {
            _vecEventHandler[i]->onWriteLog( offset ) ;
         }
      }

      if ( info.isTransEnabled() && cb &&
           DPS_INVALID_TRANS_ID != cb->getTransID() )
      {
         UINT64 transID = cb->getTransID() ;
         cb->setCurTransLsn( info.getMergeBlock().record().head()._lsn ) ;

         if ( sdbGetTransCB()->isFirstOp( transID ) )
         {
            sdbGetTransCB()->clearFirstOpTag( transID ) ;
            cb->setTransID( transID ) ;
         }
      }

      info.resetInfoEx() ;

      PD_TRACE_EXIT( SDB__DPSLGWRAPP_WRITEDATA ) ;
   }
예제 #4
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__DPSLGWRAPP_RECDROW, "_dpsLogWrapper::recordRow" )
   INT32 _dpsLogWrapper::recordRow( const CHAR *row, UINT32 len )
   {
      INT32 rc = SDB_OK ;
      PD_TRACE_ENTRY ( SDB__DPSLGWRAPP_RECDROW );
      if ( !_initialized )
      {
         goto done;
      }
      {
         SDB_ASSERT( NULL != row, "row should not be NULL!") ;
         _dpsMergeBlock block ;
         dpsLogRecord &record = block.record();
         dpsLogRecordHeader &header = record.head() ;
         ossMemcpy( &header, row, sizeof(dpsLogRecordHeader) );
         block.setRow( TRUE ) ;
         rc = record.push( DPS_LOG_ROW_ROWDATA,
                           header._length -  sizeof(dpsLogRecordHeader),
                           row + sizeof(dpsLogRecordHeader)) ;
         if ( SDB_OK != rc )
         {
            PD_LOG( PDERROR, "Failed to push row to record:%d", rc ) ;
            goto error;
         }

         _lastWriteTick = pmdGetDBTick() ;
         ++_writeReordNum ;

         rc = _buf.merge( block );
      }

   done :
      PD_TRACE_EXITRC ( SDB__DPSLGWRAPP_RECDROW, rc );
      return rc ;
   error:
      goto done ;
   }
예제 #5
0
 UINT64 _SDB_KRCB::getDBTick() const
 {
    return pmdGetDBTick() ;
 }
예제 #6
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__NETEVNHND__RDCALLBK, "_netEventHandler::_readCallback" )
   void _netEventHandler::_readCallback( const boost::system::error_code &
                                         error )
   {
      PD_TRACE_ENTRY ( SDB__NETEVNHND__RDCALLBK ) ;

      if ( error )
      {
         if ( error.value() == boost::system::errc::operation_canceled ||
              error.value() == boost::system::errc::no_such_file_or_directory )
         {
            PD_LOG ( PDINFO, "connection aborted, node:%d, %d, %d",
                     _id.columns.groupID, _id.columns.nodeID,
                     _id.columns.serviceID ) ;
         }
         else
         {
            PD_LOG ( PDERROR, "Error received, node:%d, %d, %d, err=%d",
                     _id.columns.groupID, _id.columns.nodeID,
                     _id.columns.serviceID, error.value() ) ;
         }

         goto error_close ;
      }

      _lastRecvTick = pmdGetDBTick() ;
      _lastBeatTick = _lastRecvTick ;

      if ( NET_EVENT_HANDLER_STATE_HEADER == _state )
      {
         if ( ( UINT32 )MSG_SYSTEM_INFO_LEN == (UINT32)_header.messageLength )
         {
            if ( SDB_OK != _allocateBuf( sizeof(MsgSysInfoRequest) ))
            {
               goto error_close ;
            }
            _hasRecvMsg = TRUE ;
            ossMemcpy( _buf, &_header, sizeof( MsgSysInfoRequest ) ) ;
            _frame->handleMsg( shared_from_this() ) ;
            _state = NET_EVENT_HANDLER_STATE_HEADER ;
            asyncRead() ;
            goto done ;
         }
         else if ( sizeof(_MsgHeader) > (UINT32)_header.messageLength ||
                   SDB_MAX_MSG_LENGTH < (UINT32)_header.messageLength )
         {
            PD_LOG( PDERROR, "Error header[len: %d, opCode: (%d)%d, TID:%d] "
                    "received, node:%d, %d, %d", _header.messageLength,
                    IS_REPLY_TYPE(_header.opCode) ? 1 : 0,
                    GET_REQUEST_TYPE(_header.opCode), _header.TID,
                    _id.columns.groupID,
                    _id.columns.nodeID, _id.columns.serviceID ) ;
            goto error_close ;
         }
         else
         {
            if ( FALSE == _hasRecvMsg )
            {
               _hasRecvMsg = TRUE ;
               _state = NET_EVENT_HANDLER_STATE_HEADER_LAST ;
               asyncRead() ;
               _state = NET_EVENT_HANDLER_STATE_HEADER ;
               goto done ;
            }

            PD_LOG( PDDEBUG, "msg header: [len:%d], [opCode: [%d]%d], "
                             "[TID:%d], [groupID:%d], [nodeID:%d], "
                             "[ADDR:%s], [PORT:%d]",
                    _header.messageLength, IS_REPLY_TYPE(_header.opCode)?1:0,
                    GET_REQUEST_TYPE(_header.opCode),
                    _header.TID, _header.routeID.columns.groupID,
                    _header.routeID.columns.nodeID,
                    remoteAddr().c_str(), remotePort() ) ;
            if ( MSG_INVALID_ROUTEID == _id.value )
            {
               if ( MSG_INVALID_ROUTEID != _header.routeID.value )
               {
                  _id = _header.routeID ;
                  _frame->_addRoute( shared_from_this() ) ;
               }
            }
         }
         if ( (UINT32)sizeof(_MsgHeader) == (UINT32)_header.messageLength )
         {
            if ( SDB_OK != _allocateBuf( sizeof(_MsgHeader) ))
            {
               goto error_close ;
            }
            ossMemcpy( _buf, &_header, sizeof( _MsgHeader ) ) ;
            _frame->handleMsg( shared_from_this() ) ;
            _state = NET_EVENT_HANDLER_STATE_HEADER ;
            asyncRead() ;
            goto done ;
         }

#if defined (_LINUX)
         try
         {
            boost::asio::detail::socket_option::boolean<IPPROTO_TCP, TCP_QUICKACK>
                                                    quickack( TRUE ) ;
            _sock.set_option( quickack ) ;
         }
         catch ( boost::system::system_error &e )
         {
            PD_LOG ( PDERROR, "Failed to quick ack: %s", e.what() ) ;
         }
#endif // _LINUX

         _state = NET_EVENT_HANDLER_STATE_BODY ;
         asyncRead() ;
      }
      else
      {
         _frame->handleMsg( shared_from_this() ) ;
         _state = NET_EVENT_HANDLER_STATE_HEADER ;
         asyncRead() ;
      }

   done:
      PD_TRACE_EXIT ( SDB__NETEVNHND__RDCALLBK ) ;
      return ;
   error_close:
      if ( _isConnected )
      {
         close() ;
      }
      _frame->handleClose( shared_from_this(), _id ) ;
      _frame->_erase( handle() ) ;
      goto done ;
   }
예제 #7
0
 void _netEventHandler::syncLastBeatTick()
 {
    _lastBeatTick = pmdGetDBTick() ;
 }