// 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; }
// 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; }
// 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 ; }
// 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 ) ; }