2020-04-28 13:05:49 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "InstallBundleCache.h"
2022-08-26 01:45:41 -04:00
# include "InstallBundleManagerPrivate.h"
2020-04-28 13:05:49 -04:00
2020-08-11 01:36:57 -04:00
# define INSTALLBUNDLE_CACHE_CHECK_INVARIANTS (DO_CHECK && 0)
2021-01-21 16:22:06 -04:00
# define INSTALLBUNDLE_CACHE_DUMP_INFO (0)
2020-04-28 13:05:49 -04:00
FInstallBundleCache : : ~ FInstallBundleCache ( )
{
}
void FInstallBundleCache : : Init ( FInstallBundleCacheInitInfo InitInfo )
{
CacheName = InitInfo . CacheName ;
TotalSize = InitInfo . Size ;
}
2020-08-11 01:36:57 -04:00
void FInstallBundleCache : : AddOrUpdateBundle ( EInstallBundleSourceType Source , const FInstallBundleCacheBundleInfo & AddInfo )
2020-04-28 13:05:49 -04:00
{
2021-01-21 16:22:06 -04:00
CSV_SCOPED_TIMING_STAT ( InstallBundleManager , FInstallBundleCache_AddOrUpdateBundle ) ;
2020-08-11 01:36:57 -04:00
FPerSourceBundleCacheInfo & Info = PerSourceCacheInfo . FindOrAdd ( AddInfo . BundleName ) . FindOrAdd ( Source ) ;
Info . FullInstallSize = AddInfo . FullInstallSize ;
2023-12-05 14:23:19 -05:00
Info . InstallOverheadSize = AddInfo . InstallOverheadSize ;
2020-08-11 01:36:57 -04:00
Info . CurrentInstallSize = AddInfo . CurrentInstallSize ;
2020-09-01 14:07:48 -04:00
Info . TimeStamp = AddInfo . TimeStamp ;
2021-12-10 18:32:36 -05:00
Info . AgeScalar = FMath : : Clamp ( AddInfo . AgeScalar , 0.1 , 1.0 ) ;
2020-08-11 01:36:57 -04:00
UpdateCacheInfoFromSourceInfo ( AddInfo . BundleName ) ;
2020-04-28 13:05:49 -04:00
CheckInvariants ( ) ;
}
2020-08-11 01:36:57 -04:00
void FInstallBundleCache : : RemoveBundle ( EInstallBundleSourceType Source , FName BundleName )
2020-04-28 13:05:49 -04:00
{
2021-01-21 16:22:06 -04:00
CSV_SCOPED_TIMING_STAT ( InstallBundleManager , FInstallBundleCache_RemoveBundle ) ;
2020-08-11 01:36:57 -04:00
TMap < EInstallBundleSourceType , FPerSourceBundleCacheInfo > * SourcesMap = PerSourceCacheInfo . Find ( BundleName ) ;
if ( SourcesMap )
{
SourcesMap - > Remove ( Source ) ;
UpdateCacheInfoFromSourceInfo ( BundleName ) ;
CheckInvariants ( ) ;
}
2020-04-28 13:05:49 -04:00
}
2023-01-31 00:54:38 -05:00
TOptional < FInstallBundleCacheBundleInfo > FInstallBundleCache : : GetBundleInfo ( FName BundleName ) const
{
TOptional < FInstallBundleCacheBundleInfo > Ret ;
if ( FBundleCacheInfo * Info = CacheInfo . Find ( BundleName ) )
{
FInstallBundleCacheBundleInfo & OutInfo = Ret . Emplace ( ) ;
OutInfo . BundleName = BundleName ;
OutInfo . FullInstallSize = Info - > FullInstallSize ;
2023-12-05 14:23:19 -05:00
OutInfo . InstallOverheadSize = Info - > InstallOverheadSize ;
2023-01-31 00:54:38 -05:00
OutInfo . CurrentInstallSize = Info - > CurrentInstallSize ;
OutInfo . TimeStamp = Info - > TimeStamp ;
OutInfo . AgeScalar = Info - > AgeScalar ;
}
return Ret ;
}
2021-04-08 14:32:07 -04:00
TOptional < FInstallBundleCacheBundleInfo > FInstallBundleCache : : GetBundleInfo ( EInstallBundleSourceType Source , FName BundleName ) const
2020-04-28 13:05:49 -04:00
{
2020-06-23 18:40:00 -04:00
TOptional < FInstallBundleCacheBundleInfo > Ret ;
2020-08-11 01:36:57 -04:00
2021-04-08 14:32:07 -04:00
const TMap < EInstallBundleSourceType , FPerSourceBundleCacheInfo > * SourcesMap = PerSourceCacheInfo . Find ( BundleName ) ;
2020-08-11 01:36:57 -04:00
if ( SourcesMap )
2020-06-23 18:40:00 -04:00
{
2021-04-08 14:32:07 -04:00
const FPerSourceBundleCacheInfo * SourceInfo = SourcesMap - > Find ( Source ) ;
2020-08-11 01:36:57 -04:00
if ( SourceInfo )
{
FInstallBundleCacheBundleInfo & OutInfo = Ret . Emplace ( ) ;
OutInfo . BundleName = BundleName ;
OutInfo . FullInstallSize = SourceInfo - > FullInstallSize ;
2023-12-05 14:23:19 -05:00
OutInfo . InstallOverheadSize = SourceInfo - > InstallOverheadSize ;
2020-08-11 01:36:57 -04:00
OutInfo . CurrentInstallSize = SourceInfo - > CurrentInstallSize ;
2021-01-21 16:22:06 -04:00
OutInfo . TimeStamp = SourceInfo - > TimeStamp ;
2021-12-10 18:32:36 -05:00
OutInfo . AgeScalar = SourceInfo - > AgeScalar ;
2020-08-11 01:36:57 -04:00
}
2020-06-23 18:40:00 -04:00
}
return Ret ;
2020-04-28 13:05:49 -04:00
}
uint64 FInstallBundleCache : : GetSize ( ) const
{
return TotalSize ;
}
2021-01-21 16:22:06 -04:00
uint64 FInstallBundleCache : : GetUsedSize ( ) const
2020-04-28 13:05:49 -04:00
{
2021-01-21 16:22:06 -04:00
CSV_SCOPED_TIMING_STAT ( InstallBundleManager , FInstallBundleCache_GetUsedSize ) ;
2020-04-28 13:05:49 -04:00
uint64 UsedSize = 0 ;
for ( const TPair < FName , FBundleCacheInfo > & Pair : CacheInfo )
{
UsedSize + = Pair . Value . GetSize ( ) ;
}
2021-01-21 16:22:06 -04:00
return UsedSize ;
}
uint64 FInstallBundleCache : : GetFreeSpaceInternal ( uint64 UsedSize ) const
{
2020-04-28 13:05:49 -04:00
if ( UsedSize > TotalSize )
return 0 ;
return TotalSize - UsedSize ;
}
2021-01-21 16:22:06 -04:00
uint64 FInstallBundleCache : : GetFreeSpace ( ) const
{
CSV_SCOPED_TIMING_STAT ( InstallBundleManager , FInstallBundleCache_GetFreeSpace ) ;
uint64 UsedSize = GetUsedSize ( ) ;
return GetFreeSpaceInternal ( UsedSize ) ;
}
2020-04-28 13:05:49 -04:00
FInstallBundleCacheReserveResult FInstallBundleCache : : Reserve ( FName BundleName )
{
2021-01-21 16:22:06 -04:00
CSV_SCOPED_TIMING_STAT ( InstallBundleManager , FInstallBundleCache_Reserve ) ;
2020-04-28 13:05:49 -04:00
FInstallBundleCacheReserveResult Result ;
FBundleCacheInfo * BundleInfo = CacheInfo . Find ( BundleName ) ;
if ( BundleInfo = = nullptr )
{
Result . Result = EInstallBundleCacheReserveResult : : Success ;
return Result ;
}
if ( BundleInfo - > State = = ECacheState : : PendingEvict )
{
2020-06-23 18:40:00 -04:00
Result . Result = EInstallBundleCacheReserveResult : : Fail_PendingEvict ;
2020-04-28 13:05:49 -04:00
return Result ;
}
if ( BundleInfo - > State = = ECacheState : : Reserved )
{
Result . Result = EInstallBundleCacheReserveResult : : Success ;
return Result ;
}
2023-12-05 14:23:19 -05:00
const uint64 SizeNeeded = ( BundleInfo - > FullInstallSize < = BundleInfo - > CurrentInstallSize ) ?
BundleInfo - > InstallOverheadSize :
BundleInfo - > InstallOverheadSize + ( BundleInfo - > FullInstallSize - BundleInfo - > CurrentInstallSize ) ;
2021-01-21 16:22:06 -04:00
const uint64 UsedSize = GetUsedSize ( ) ;
2023-12-05 14:23:19 -05:00
if ( TotalSize > = UsedSize + SizeNeeded )
2020-04-28 13:05:49 -04:00
{
BundleInfo - > State = ECacheState : : Reserved ;
Result . Result = EInstallBundleCacheReserveResult : : Success ;
2021-01-21 16:22:06 -04:00
2020-04-28 13:05:49 -04:00
return Result ;
}
2020-06-23 18:40:00 -04:00
Result . Result = EInstallBundleCacheReserveResult : : Fail_NeedsEvict ;
2020-04-28 13:05:49 -04:00
2021-01-21 16:22:06 -04:00
// TODO: Bundles that have BundleSize > 0 or are PendingEvict should be
// sorted to the beginning. We should be able to stop iterating sooner in that case.
2021-12-10 20:58:04 -05:00
CacheInfo . ValueSort ( FCacheSortPredicate ( ) ) ;
2020-04-28 13:05:49 -04:00
2021-01-21 16:22:06 -04:00
uint64 CanFreeSpace = 0 ;
2020-04-28 13:05:49 -04:00
for ( const TPair < FName , FBundleCacheInfo > & Pair : CacheInfo )
{
if ( Pair . Key = = BundleName )
continue ;
if ( Pair . Value . State = = ECacheState : : Reserved )
continue ;
uint64 BundleSize = Pair . Value . GetSize ( ) ;
if ( BundleSize > 0 )
{
2021-01-21 16:22:06 -04:00
check ( UsedSize > = CanFreeSpace ) ;
if ( TotalSize < UsedSize - CanFreeSpace + SizeNeeded )
2020-06-23 18:40:00 -04:00
{
CanFreeSpace + = BundleSize ;
2021-01-21 16:22:06 -04:00
TArray < EInstallBundleSourceType > & SourcesToEvictFrom = Result . BundlesToEvict . Add ( Pair . Key ) ;
PerSourceCacheInfo . FindChecked ( Pair . Key ) . GenerateKeyArray ( SourcesToEvictFrom ) ;
2020-06-23 18:40:00 -04:00
}
}
else if ( Pair . Value . State = = ECacheState : : PendingEvict )
{
// Bundle manager must wait for all previous pending evictions to complete
// to ensure that there is actually enough free space in the cache
// before installing a bundle
2021-01-21 16:22:06 -04:00
TArray < EInstallBundleSourceType > & SourcesToEvictFrom = Result . BundlesToEvict . Add ( Pair . Key ) ;
PerSourceCacheInfo . FindChecked ( Pair . Key ) . GenerateKeyArray ( SourcesToEvictFrom ) ;
2020-04-28 13:05:49 -04:00
}
}
2021-01-21 16:22:06 -04:00
check ( UsedSize > = CanFreeSpace ) ;
if ( TotalSize < UsedSize - CanFreeSpace + SizeNeeded )
2020-04-28 13:05:49 -04:00
{
2020-06-23 18:40:00 -04:00
Result . Result = EInstallBundleCacheReserveResult : : Fail_CacheFull ;
2020-04-28 13:05:49 -04:00
}
else
{
check ( Result . BundlesToEvict . Num ( ) > 0 ) ;
}
2021-01-21 16:22:06 -04:00
# if INSTALLBUNDLE_CACHE_DUMP_INFO
2023-12-05 14:23:19 -05:00
GetStats ( EInstallBundleCacheDumpToLog : : Default , true ) ;
2021-01-21 16:22:06 -04:00
# endif // INSTALLBUNDLE_CACHE_DUMP_INFO
2020-04-28 13:05:49 -04:00
return Result ;
}
2021-04-08 14:32:07 -04:00
FInstallBundleCacheFlushResult FInstallBundleCache : : Flush ( EInstallBundleSourceType * Source /*= nullptr*/ )
{
CSV_SCOPED_TIMING_STAT ( InstallBundleManager , FInstallBundleCache_Flush ) ;
FInstallBundleCacheFlushResult Result ;
for ( const TPair < FName , FBundleCacheInfo > & Pair : CacheInfo )
{
if ( Pair . Value . State = = ECacheState : : Reserved )
continue ;
if ( Pair . Value . CurrentInstallSize = = 0 )
continue ;
if ( Source )
{
if ( PerSourceCacheInfo . FindChecked ( Pair . Key ) . Contains ( * Source ) )
{
TArray < EInstallBundleSourceType > & SourcesToEvictFrom = Result . BundlesToEvict . Add ( Pair . Key ) ;
SourcesToEvictFrom . Add ( * Source ) ;
}
}
else
{
TArray < EInstallBundleSourceType > & SourcesToEvictFrom = Result . BundlesToEvict . Add ( Pair . Key ) ;
PerSourceCacheInfo . FindChecked ( Pair . Key ) . GenerateKeyArray ( SourcesToEvictFrom ) ;
}
}
# if INSTALLBUNDLE_CACHE_DUMP_INFO
2023-12-05 14:23:19 -05:00
GetStats ( EInstallBundleCacheDumpToLog : : Default , true ) ;
2021-04-08 14:32:07 -04:00
# endif // INSTALLBUNDLE_CACHE_DUMP_INFO
return Result ;
}
2022-03-21 12:48:24 -04:00
bool FInstallBundleCache : : Contains ( FName BundleName ) const
{
return CacheInfo . Contains ( BundleName ) ;
}
bool FInstallBundleCache : : Contains ( EInstallBundleSourceType Source , FName BundleName ) const
{
const TMap < EInstallBundleSourceType , FPerSourceBundleCacheInfo > * SourcesMap = PerSourceCacheInfo . Find ( BundleName ) ;
if ( SourcesMap )
{
return SourcesMap - > Contains ( Source ) ;
}
return false ;
}
2023-11-02 19:26:08 -04:00
bool FInstallBundleCache : : IsReserved ( FName BundleName ) const
{
const FBundleCacheInfo * BundleInfo = CacheInfo . Find ( BundleName ) ;
if ( BundleInfo )
{
return BundleInfo - > State = = ECacheState : : Reserved ;
}
return false ;
}
2020-04-28 13:05:49 -04:00
bool FInstallBundleCache : : Release ( FName BundleName )
{
2021-01-21 16:22:06 -04:00
CSV_SCOPED_TIMING_STAT ( InstallBundleManager , FInstallBundleCache_Release ) ;
2020-04-28 13:05:49 -04:00
FBundleCacheInfo * BundleInfo = CacheInfo . Find ( BundleName ) ;
if ( BundleInfo = = nullptr )
{
return true ;
}
if ( BundleInfo - > State = = ECacheState : : Released )
{
return true ;
}
2021-04-08 14:32:07 -04:00
if ( BundleInfo - > State = = ECacheState : : Reserved )
2020-04-28 13:05:49 -04:00
{
BundleInfo - > State = ECacheState : : Released ;
return true ;
}
return false ;
}
bool FInstallBundleCache : : SetPendingEvict ( FName BundleName )
{
2021-01-21 16:22:06 -04:00
CSV_SCOPED_TIMING_STAT ( InstallBundleManager , FInstallBundleCache_SetPendingEvict ) ;
2020-04-28 13:05:49 -04:00
FBundleCacheInfo * BundleInfo = CacheInfo . Find ( BundleName ) ;
if ( BundleInfo = = nullptr )
{
return true ;
}
if ( BundleInfo - > State = = ECacheState : : PendingEvict )
{
return true ;
}
if ( BundleInfo - > State = = ECacheState : : Released )
{
BundleInfo - > State = ECacheState : : PendingEvict ;
return true ;
}
return false ;
}
2021-04-08 14:32:07 -04:00
bool FInstallBundleCache : : ClearPendingEvict ( FName BundleName )
{
CSV_SCOPED_TIMING_STAT ( InstallBundleManager , FInstallBundleCache_ClearPendingEvict ) ;
FBundleCacheInfo * BundleInfo = CacheInfo . Find ( BundleName ) ;
if ( BundleInfo = = nullptr )
{
return true ;
}
if ( BundleInfo - > State = = ECacheState : : Released )
{
return true ;
}
if ( BundleInfo - > State = = ECacheState : : PendingEvict )
{
BundleInfo - > State = ECacheState : : Released ;
return true ;
}
return false ;
}
2020-04-28 13:05:49 -04:00
void FInstallBundleCache : : HintRequested ( FName BundleName , bool bRequested )
{
2021-01-21 16:22:06 -04:00
CSV_SCOPED_TIMING_STAT ( InstallBundleManager , FInstallBundleCache_HintRequested ) ;
2020-04-28 13:05:49 -04:00
FBundleCacheInfo * BundleInfo = CacheInfo . Find ( BundleName ) ;
if ( BundleInfo )
{
2021-04-08 14:32:07 -04:00
if ( bRequested )
{
BundleInfo - > HintReqeustedCount + = 1 ;
}
else
{
BundleInfo - > HintReqeustedCount - = 1 ;
check ( BundleInfo - > HintReqeustedCount > = 0 ) ;
}
2020-04-28 13:05:49 -04:00
}
}
void FInstallBundleCache : : CheckInvariants ( ) const
{
# if INSTALLBUNDLE_CACHE_CHECK_INVARIANTS
2020-08-11 01:36:57 -04:00
check ( PerSourceCacheInfo . Num ( ) = = CacheInfo . Num ( ) ) ;
for ( const TPair < FName , FBundleCacheInfo > & CachePair : CacheInfo )
{
const TMap < EInstallBundleSourceType , FPerSourceBundleCacheInfo > * SourcesMap = PerSourceCacheInfo . Find ( CachePair . Key ) ;
check ( SourcesMap ) ;
uint64 FullInstallSize = 0 ;
uint64 CurrentInstallSize = 0 ;
for ( const TPair < EInstallBundleSourceType , FPerSourceBundleCacheInfo > & Pair : * SourcesMap )
{
FullInstallSize + = Pair . Value . FullInstallSize ;
CurrentInstallSize + = Pair . Value . CurrentInstallSize ;
}
check ( CachePair . Value . FullInstallSize = = FullInstallSize ) ;
check ( CachePair . Value . CurrentInstallSize = = CurrentInstallSize ) ;
}
2020-04-28 13:05:49 -04:00
# endif // INSTALLBUNDLE_CACHE_CHECK_INVARIANTS
}
2020-08-11 01:36:57 -04:00
2022-02-25 15:02:33 -05:00
FInstallBundleCacheStats FInstallBundleCache : : GetStats ( EInstallBundleCacheDumpToLog DumpToLog /*= EInstallBundleCacheDumpToLog::None*/ , bool bVerbose /*= false*/ ) const
2021-01-21 16:22:06 -04:00
{
FInstallBundleCacheStats Stats ;
Stats . CacheName = CacheName ;
Stats . MaxSize = TotalSize ;
2022-02-25 15:02:33 -05:00
bool bDumpToLog = DumpToLog ! = EInstallBundleCacheDumpToLog : : None ;
2021-01-21 16:22:06 -04:00
if ( bDumpToLog )
{
2022-02-25 15:02:33 -05:00
UE_LOG ( LogInstallBundleManager , Display , TEXT ( " " ) ) ;
UE_LOG ( LogInstallBundleManager , Display , TEXT ( " * Install Bundle Cache Stats %s " ) , * CacheName . ToString ( ) ) ;
2021-12-10 20:58:04 -05:00
// Dump info in eviction order
CacheInfo . ValueSort ( FCacheSortPredicate ( ) ) ;
2021-01-21 16:22:06 -04:00
}
2022-02-25 15:02:33 -05:00
auto AddStats = [ & Stats ] ( const FBundleCacheInfo & Info )
2021-01-21 16:22:06 -04:00
{
Stats . UsedSize + = Info . GetSize ( ) ;
if ( Info . State = = ECacheState : : Reserved )
{
Stats . ReservedSize + = Info . CurrentInstallSize ;
}
2022-02-25 15:02:33 -05:00
} ;
2021-01-21 16:22:06 -04:00
2022-02-25 15:02:33 -05:00
// Note: Yes this verbosity is correct and very non-intuitive
# define INSTALLBUNDLECACHE_DEFAULT_LOG(Verbosity) \
if ( Info . CurrentInstallSize > 0 | | Info . State ! = ECacheState : : Released ) \
{ \
UE_LOG ( LogInstallBundleManager , Verbosity , TEXT ( " * \t bundle %s " ) , * BundleName . ToString ( ) ) \
UE_LOG ( LogInstallBundleManager , Verbosity , TEXT ( " * \t \t full size: % " UINT64_FMT ) , Info . FullInstallSize ) \
2023-12-05 14:23:19 -05:00
UE_LOG ( LogInstallBundleManager , Verbosity , TEXT ( " * \t \t overhead size: % " UINT64_FMT ) , Info . InstallOverheadSize ) \
2022-02-25 15:02:33 -05:00
UE_LOG ( LogInstallBundleManager , Verbosity , TEXT ( " * \t \t current size: % " UINT64_FMT ) , Info . CurrentInstallSize ) \
UE_LOG ( LogInstallBundleManager , Verbosity , TEXT ( " * \t \t reserved: %s " ) , ( Info . State = = ECacheState : : Reserved ) ? TEXT ( " true " ) : TEXT ( " false " ) ) \
UE_LOG ( LogInstallBundleManager , Verbosity , TEXT ( " * \t \t timestamp: %s " ) , * Info . TimeStamp . ToString ( ) ) \
UE_LOG ( LogInstallBundleManager , Verbosity , TEXT ( " * \t \t age scale: %f " ) , Info . AgeScalar ) \
}
# define INSTALLBUNDLECACHE_CSV_HEADER_LOG(Verbosity) \
2023-12-05 14:23:19 -05:00
UE_LOG ( LogInstallBundleManager , Verbosity , TEXT ( " * \t bundle, full size, overhead size, current size, diff, reserved, timestamp, age scale " ) )
2022-02-25 15:02:33 -05:00
# define INSTALLBUNDLECACHE_CSV_LOG(Verbosity) \
if ( Info . CurrentInstallSize > 0 | | Info . State ! = ECacheState : : Released ) \
{ \
2022-05-20 18:47:04 -04:00
const TCHAR * Diff = TEXT ( " = " ) ; \
if ( Info . FullInstallSize > Info . CurrentInstallSize ) Diff = TEXT ( " > " ) ; \
else if ( Info . FullInstallSize < Info . CurrentInstallSize ) Diff = TEXT ( " < " ) ; \
2023-12-05 14:23:19 -05:00
UE_LOG ( LogInstallBundleManager , Verbosity , TEXT ( " * \t %s, % " UINT64_FMT " , % " UINT64_FMT " , % " UINT64_FMT " , %s, %s, %s, %f " ) , * BundleName . ToString ( ) , Info . FullInstallSize , Info . InstallOverheadSize , Info . CurrentInstallSize , Diff , ( Info . State = = ECacheState : : Reserved ) ? TEXT ( " true " ) : TEXT ( " false " ) , * Info . TimeStamp . ToString ( ) , Info . AgeScalar ) \
2022-02-25 15:02:33 -05:00
}
auto DumpToLog_Default = [ ] ( FName BundleName , const FBundleCacheInfo & Info )
{
INSTALLBUNDLECACHE_DEFAULT_LOG ( Verbose ) ;
} ;
auto DumpToLog_DefaultVerbose = [ ] ( FName BundleName , const FBundleCacheInfo & Info )
{
INSTALLBUNDLECACHE_DEFAULT_LOG ( Display ) ;
} ;
auto DumpToLog_CSV = [ ] ( FName BundleName , const FBundleCacheInfo & Info )
{
INSTALLBUNDLECACHE_CSV_LOG ( Verbose ) ;
} ;
auto DumpToLog_CSVVerbose = [ ] ( FName BundleName , const FBundleCacheInfo & Info )
{
INSTALLBUNDLECACHE_CSV_LOG ( Display ) ;
} ;
switch ( DumpToLog )
{
default :
case EInstallBundleCacheDumpToLog : : None :
for ( const TPair < FName , FBundleCacheInfo > & CachePair : CacheInfo )
2021-01-21 16:22:06 -04:00
{
2022-02-25 15:02:33 -05:00
const FBundleCacheInfo & Info = CachePair . Value ;
AddStats ( Info ) ;
}
break ;
case EInstallBundleCacheDumpToLog : : Default :
if ( bVerbose )
{
for ( const TPair < FName , FBundleCacheInfo > & CachePair : CacheInfo )
2021-12-10 20:58:04 -05:00
{
2022-02-25 15:02:33 -05:00
const FBundleCacheInfo & Info = CachePair . Value ;
AddStats ( Info ) ;
DumpToLog_DefaultVerbose ( CachePair . Key , Info ) ;
2021-12-10 20:58:04 -05:00
}
2021-01-21 16:22:06 -04:00
}
2022-02-25 15:02:33 -05:00
else
{
for ( const TPair < FName , FBundleCacheInfo > & CachePair : CacheInfo )
{
const FBundleCacheInfo & Info = CachePair . Value ;
AddStats ( Info ) ;
DumpToLog_Default ( CachePair . Key , Info ) ;
}
}
break ;
case EInstallBundleCacheDumpToLog : : CSV :
if ( bVerbose )
{
INSTALLBUNDLECACHE_CSV_HEADER_LOG ( Display ) ;
for ( const TPair < FName , FBundleCacheInfo > & CachePair : CacheInfo )
{
const FBundleCacheInfo & Info = CachePair . Value ;
AddStats ( Info ) ;
DumpToLog_CSVVerbose ( CachePair . Key , Info ) ;
}
}
else
{
INSTALLBUNDLECACHE_CSV_HEADER_LOG ( Verbose ) ;
for ( const TPair < FName , FBundleCacheInfo > & CachePair : CacheInfo )
{
const FBundleCacheInfo & Info = CachePair . Value ;
AddStats ( Info ) ;
DumpToLog_CSV ( CachePair . Key , Info ) ;
}
}
break ;
2021-01-21 16:22:06 -04:00
}
2022-02-25 15:02:33 -05:00
# undef INSTALLBUNDLECACHE_CSV_LOG
# undef INSTALLBUNDLECACHE_CSV_HEADER_LOG
# undef INSTALLBUNDLECACHE_DEFAULT_LOG
2021-01-21 16:22:06 -04:00
Stats . FreeSize = GetFreeSpaceInternal ( Stats . UsedSize ) ;
if ( bDumpToLog )
{
2022-02-25 15:02:33 -05:00
UE_LOG ( LogInstallBundleManager , Display , TEXT ( " * \t size: % " UINT64_FMT ) , Stats . MaxSize ) ;
UE_LOG ( LogInstallBundleManager , Display , TEXT ( " * \t used: % " UINT64_FMT ) , Stats . UsedSize ) ;
UE_LOG ( LogInstallBundleManager , Display , TEXT ( " * \t reserved: % " UINT64_FMT ) , Stats . ReservedSize ) ;
UE_LOG ( LogInstallBundleManager , Display , TEXT ( " * \t free: % " UINT64_FMT ) , Stats . FreeSize ) ;
UE_LOG ( LogInstallBundleManager , Display , TEXT ( " " ) ) ;
2021-01-21 16:22:06 -04:00
}
return Stats ;
}
2020-08-11 01:36:57 -04:00
void FInstallBundleCache : : UpdateCacheInfoFromSourceInfo ( FName BundleName )
{
2021-01-21 16:22:06 -04:00
CSV_SCOPED_TIMING_STAT ( InstallBundleManager , FInstallBundleCache_UpdateCacheInfoFromSourceInfo ) ;
2020-08-11 01:36:57 -04:00
TMap < EInstallBundleSourceType , FPerSourceBundleCacheInfo > * SourcesMap = PerSourceCacheInfo . Find ( BundleName ) ;
if ( SourcesMap = = nullptr )
{
CacheInfo . Remove ( BundleName ) ;
return ;
}
if ( SourcesMap - > Num ( ) = = 0 )
{
PerSourceCacheInfo . Remove ( BundleName ) ;
CacheInfo . Remove ( BundleName ) ;
return ;
}
2020-09-01 14:07:48 -04:00
FDateTime TimeStamp = FDateTime : : MinValue ( ) ;
2021-12-10 18:32:36 -05:00
double AgeScalar = 1.0 ;
2020-08-11 01:36:57 -04:00
uint64 FullInstallSize = 0 ;
2023-12-05 14:23:19 -05:00
uint64 InstallOverheadSize = 0 ;
2020-08-11 01:36:57 -04:00
uint64 CurrentInstallSize = 0 ;
for ( const TPair < EInstallBundleSourceType , FPerSourceBundleCacheInfo > & Pair : * SourcesMap )
{
FullInstallSize + = Pair . Value . FullInstallSize ;
2023-12-05 14:23:19 -05:00
InstallOverheadSize + = Pair . Value . InstallOverheadSize ;
2020-08-11 01:36:57 -04:00
CurrentInstallSize + = Pair . Value . CurrentInstallSize ;
2023-12-05 14:23:19 -05:00
2021-12-10 18:32:36 -05:00
if ( Pair . Value . CurrentInstallSize > 0 )
2020-09-01 14:07:48 -04:00
{
2021-12-10 18:32:36 -05:00
if ( Pair . Value . TimeStamp > TimeStamp )
{
TimeStamp = Pair . Value . TimeStamp ;
}
if ( Pair . Value . AgeScalar < AgeScalar )
{
AgeScalar = Pair . Value . AgeScalar ;
}
2020-09-01 14:07:48 -04:00
}
2020-08-11 01:36:57 -04:00
}
FBundleCacheInfo & BundleCacheInfo = CacheInfo . FindOrAdd ( BundleName ) ;
checkf ( BundleCacheInfo . FullInstallSize = = FullInstallSize | | BundleCacheInfo . State ! = ECacheState : : Reserved , TEXT ( " Bundle %s: FullInstallSize should not be updated while a bundle is Reserved! " ) , * BundleName . ToString ( ) ) ;
BundleCacheInfo . FullInstallSize = FullInstallSize ;
2023-12-05 14:23:19 -05:00
BundleCacheInfo . InstallOverheadSize = InstallOverheadSize ;
2020-08-11 01:36:57 -04:00
BundleCacheInfo . CurrentInstallSize = CurrentInstallSize ;
2020-09-01 14:07:48 -04:00
BundleCacheInfo . TimeStamp = TimeStamp ;
2021-12-10 18:32:36 -05:00
BundleCacheInfo . AgeScalar = AgeScalar ;
2020-08-11 01:36:57 -04:00
}