Exemplo n.º 1
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__DPSLGFILEMGR_FLUSH, "_dpsLogFileMgr::flush" )
   INT32 _dpsLogFileMgr::flush( _dpsMessageBlock *mb,
                                const DPS_LSN &beginLsn,
                                BOOLEAN shutdown )
   {
      INT32 rc = SDB_OK;
      PD_TRACE_ENTRY ( SDB__DPSLGFILEMGR_FLUSH );

      dpsLogFile *pWork = WORK_FILE() ;

      SDB_ASSERT ( shutdown || mb->length() == DPS_DEFAULT_PAGE_SIZE,
                   "mb length must be DPS_DEFAULT_PAGE_SIZE unless it's "
                   "shutdown" ) ;
      if ( pWork->getIdleSize() == 0 )
      {
         _work = _incFileID ( _work ) ;
         pWork = WORK_FILE() ;
         _incLogicalFileID () ;

         if ( !_rollFlag && _begin != _work )
         {
            _rollFlag = TRUE ;
         }
         else if ( _begin == _work && _rollFlag )
         {
            _begin = _incFileID ( _begin ) ;
         }
      }

      if ( pWork->getIdleSize() == 0 ||
           pWork->getIdleSize() == pWork->size() )
      {
         pWork->reset( _logicalWork, beginLsn.offset, beginLsn.version ) ;
      }

      rc = pWork->write ( mb->startPtr(), DPS_DEFAULT_PAGE_SIZE ) ;
      if ( rc )
      {
         PD_LOG ( PDERROR, "Failed to write %d bytes into file, rc = %d",
                 DPS_DEFAULT_PAGE_SIZE, rc ) ;
         goto error ;
      }

      if ( DPS_DEFAULT_PAGE_SIZE != mb->length() )
      {
         pWork->idleSize( pWork->getIdleSize() +
                          DPS_DEFAULT_PAGE_SIZE ) ;
      }

   done:
      PD_TRACE_EXITRC ( SDB__DPSLGFILEMGR_FLUSH, rc );
      return rc;
   error:
      goto done;
   }
Exemplo n.º 2
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__DPSLGFILEMGR_FLUSH, "_dpsLogFileMgr::flush" )
   INT32 _dpsLogFileMgr::flush( _dpsMessageBlock *mb,
                                const DPS_LSN &beginLsn,
                                BOOLEAN shutdown )
   {
      INT32 rc = SDB_OK;
      PD_TRACE_ENTRY ( SDB__DPSLGFILEMGR_FLUSH );

      SDB_ASSERT ( shutdown || mb->length() == DPS_DEFAULT_PAGE_SIZE,
                   "mb length must be DPS_DEFAULT_PAGE_SIZE unless it's "
                   "shutdown" ) ;
      if ( WORK_FILE->getIdleSize() == 0 )
      {
         _work = _incFileID ( _work ) ;
         _incLogicalFileID () ;
      }

      if ( WORK_FILE->getIdleSize() == 0 ||
           ( WORK_FILE->getIdleSize() == WORK_FILE->size() &&
             WORK_FILE->header()._logID == DPS_INVALID_LOG_FILE_ID ) )
      {
         WORK_FILE->reset( _logicalWork, beginLsn.offset, beginLsn.version ) ;
      }

      rc = WORK_FILE->write ( mb->startPtr(), DPS_DEFAULT_PAGE_SIZE ) ;
      if ( rc )
      {
         PD_LOG ( PDERROR, "Failed to write %d bytes into file, rc = %d",
                 DPS_DEFAULT_PAGE_SIZE, rc ) ;
         goto error ;
      }
   done:
      PD_TRACE_EXITRC ( SDB__DPSLGFILEMGR_FLUSH, rc );
      return rc;
   error:
      goto done;
   }
Exemplo n.º 3
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__DPSLGFILEMGR_MOVE, "_dpsLogFileMgr::move" )
   INT32 _dpsLogFileMgr::move( const DPS_LSN_OFFSET &offset,
                               const DPS_LSN_VER &version )
   {
      INT32 rc = SDB_OK ;
      PD_TRACE_ENTRY ( SDB__DPSLGFILEMGR_MOVE );
      UINT32 i = 0 ;
      UINT32 file = ( offset /_logFileSz ) % _logFileNum ;
      UINT32 fileOffset = offset  % _logFileSz ;
      INT32 signFlag = -1 ;

      if ( _files[_work]->header()._logID != DPS_INVALID_LOG_FILE_ID &&
           offset > _files[_work]->getFirstLSN().offset +
           _files[_work]->getValidLength() )
      {
         signFlag = 1 ;
      }

      while ( i < _logFileNum )
      {
         if ( _files[_work]->header()._logID != DPS_INVALID_LOG_FILE_ID &&
             ( _files[_work]->getFirstLSN().offset <= offset &&
               offset <= _files[_work]->getFirstLSN().offset +
               _files[_work]->getValidLength() ) )
         {
            if ( file != _work )
            {
               SDB_ASSERT( 0 == fileOffset, "File offset must be 0" ) ;
               SDB_ASSERT( file == _incFileID( _work ), "File must work + 1" ) ;
               SDB_ASSERT( 0 == _files[_work]->getIdleSize(),
                           "Idle size must be 0" ) ;
            }
            else
            {
               _files[_work]->idleSize ( _logFileSz - fileOffset ) ;
               _files[_work]->invalidateData() ;
            }
            _logicalWork = _files[_work]->header()._logID ;
            break ;
         }

         if ( _files[_work]->header()._logID != DPS_INVALID_LOG_FILE_ID )
         {
            rc = _files[_work]->reset ( DPS_INVALID_LOG_FILE_ID,
                                        DPS_INVALID_LSN_OFFSET,
                                        DPS_INVALID_LSN_VERSION ) ;
         }

         if ( SDB_OK != rc )
         {
            break ;
         }

         _work = signFlag == -1 ? _decFileID ( _work ) : _incFileID ( _work ) ;
         ++i ;
      }

      if ( i == _logFileNum )
      {
         _begin = file ;
         _work = file ;
         _rollFlag = FALSE ;
         _logicalWork = DPS_LSN_2_FILEID( offset, _logFileSz ) ;
         rc = _files[_work]->reset ( _logicalWork, offset, version ) ;
         _files[_work]->idleSize ( _logFileSz - fileOffset ) ;
      }

      PD_TRACE_EXITRC ( SDB__DPSLGFILEMGR_MOVE, rc );
      return rc ;
   }
Exemplo n.º 4
0
   // PD_TRACE_DECLARE_FUNCTION ( SDB__DPSLGFILEMGR__ANLYS, "_dpsLogFileMgr::_analysis" )
   void _dpsLogFileMgr::_analysis ()
   {
      PD_TRACE_ENTRY ( SDB__DPSLGFILEMGR__ANLYS );
      _dpsLogFile *file = NULL ;
      UINT32 i = 0 ;
      UINT32 beginLogID = DPS_INVALID_LOG_FILE_ID ;

      while ( i < _files.size() )
      {
         file = _files[i] ;
         if ( file->header()._logID == DPS_INVALID_LOG_FILE_ID )
         {
            ++i ;
            continue ;
         }

         if ( beginLogID == DPS_INVALID_LOG_FILE_ID ||
              DPS_FILEID_COMPARE( file->header()._logID, beginLogID ) < 0 )
         {
            beginLogID = file->header()._logID ;
            _begin = i ;
         }

         ++i ;
      }

      UINT32 tmpWork = _begin ;
      i = 0 ;

      while ( _files[tmpWork]->getIdleSize() == 0 && i < _files.size() )
      {
         _work = tmpWork ;
         tmpWork = _incFileID ( tmpWork ) ;
         ++i ;
      }

      if ( i < _files.size() &&
           _files[tmpWork]->header()._logID != DPS_INVALID_LOG_FILE_ID )
      {
         _work = tmpWork ;
         tmpWork = _incFileID ( tmpWork ) ;
         ++i ;
      }

      while ( i < _files.size () )
      {
         if ( _files[tmpWork]->header()._logID != DPS_INVALID_LOG_FILE_ID )
         {
            _files[tmpWork]->reset( DPS_INVALID_LOG_FILE_ID,
                                    DPS_INVALID_LSN_OFFSET,
                                    DPS_INVALID_LSN_VERSION ) ;
         }
         tmpWork = _incFileID( tmpWork ) ;
         ++i ;
      }

      if ( _files[_work]->header()._logID != DPS_INVALID_LOG_FILE_ID )
      {
         _logicalWork = _files[_work]->header()._logID ;
      }
      _rollFlag = ( _begin == _work ? FALSE : TRUE ) ;

      PD_LOG( PDEVENT, "Analysis dps logs[begin: %u, work: %u, "
              "logicalWork: %u]", _begin, _work, _logicalWork ) ;

      PD_TRACE_EXIT ( SDB__DPSLGFILEMGR__ANLYS ) ;
   }