2023-01-30 04:56:40 -05:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "ValidateVirtualizedContentCommandlet.h"
# include "CommandletUtils.h"
# include "UObject/PackageTrailer.h"
2023-02-28 10:48:04 -05:00
# include "Virtualization/VirtualizationSystem.h"
2023-01-30 04:56:40 -05:00
UValidateVirtualizedContentCommandlet : : UValidateVirtualizedContentCommandlet ( const FObjectInitializer & ObjectInitializer )
: Super ( ObjectInitializer )
{
}
int32 UValidateVirtualizedContentCommandlet : : Main ( const FString & Params )
{
2023-02-28 10:48:04 -05:00
using namespace UE : : Virtualization ;
2023-01-30 04:56:40 -05:00
2023-02-28 10:48:04 -05:00
TRACE_CPUPROFILER_EVENT_SCOPE ( UValidateVirtualizedContentCommandlet ) ;
2023-01-30 04:56:40 -05:00
2023-02-28 10:48:04 -05:00
UE_LOG ( LogVirtualization , Display , TEXT ( " Finding packages in the project... " ) ) ;
2023-03-01 03:47:24 -05:00
TArray < FString > PackagePaths = FindPackages ( EFindPackageFlags : : ExcludeEngineContent ) ;
2023-02-28 10:48:04 -05:00
UE_LOG ( LogVirtualization , Display , TEXT ( " Found %d package(s) " ) , PackagePaths . Num ( ) ) ;
2023-01-30 04:56:40 -05:00
2023-02-28 10:48:04 -05:00
TMap < FString , UE : : FPackageTrailer > Packages ;
TSet < FIoHash > Payloads ;
2023-01-30 04:56:40 -05:00
2023-02-28 10:48:04 -05:00
UE_LOG ( LogVirtualization , Display , TEXT ( " Scanning package(s) for virtualized payloads... " ) , PackagePaths . Num ( ) ) ;
FindVirtualizedPayloadsAndTrailers ( PackagePaths , Packages , Payloads ) ;
UE_LOG ( LogVirtualization , Display , TEXT ( " Found %d virtualized package(s) with %d unique payload(s) " ) , Packages . Num ( ) , Payloads . Num ( ) ) ;
IVirtualizationSystem & System = IVirtualizationSystem : : Get ( ) ;
UE_LOG ( LogVirtualization , Display , TEXT ( " Querying the state of the virtualized payload(s) in persistent storage... " ) ) ;
TArray < EPayloadStatus > PayloadStatuses ;
if ( System . QueryPayloadStatuses ( Payloads . Array ( ) , EStorageType : : Persistent , PayloadStatuses ) ! = EQueryResult : : Success )
2023-01-30 04:56:40 -05:00
{
2023-02-28 10:48:04 -05:00
UE_LOG ( LogVirtualization , Error , TEXT ( " Failed to query the statuses of the payload(s) " ) ) ;
return 1 ;
2023-01-30 04:56:40 -05:00
}
2023-02-28 10:48:04 -05:00
int32 ErrorCount = 0 ;
2023-01-30 04:56:40 -05:00
{
2023-02-28 10:48:04 -05:00
TRACE_CPUPROFILER_EVENT_SCOPE ( ValidatePackages ) ;
2023-01-30 04:56:40 -05:00
2023-02-28 10:48:04 -05:00
UE_LOG ( LogVirtualization , Display , TEXT ( " Checking for missing payloads... " ) ) ;
2023-01-30 04:56:40 -05:00
2023-02-28 10:48:04 -05:00
for ( const TPair < FString , UE : : FPackageTrailer > & Package : Packages )
2023-01-30 04:56:40 -05:00
{
2023-02-28 10:48:04 -05:00
bool bFoundErrors = false ;
const TArray < FIoHash > VirtualizedPayloads = Package . Value . GetPayloads ( UE : : EPayloadStorageType : : Virtualized ) ;
for ( const FIoHash & PayloadId : VirtualizedPayloads )
2023-01-30 04:56:40 -05:00
{
2023-02-28 10:48:04 -05:00
const int32 Index = Payloads . FindId ( PayloadId ) . AsInteger ( ) ;
if ( PayloadStatuses [ Index ] = = EPayloadStatus : : FoundPartial )
2023-01-30 04:56:40 -05:00
{
2023-02-28 10:48:04 -05:00
// TODO: We currently don't have a way to inform the user which persistent backend the payload is not in!
UE_LOG ( LogVirtualization , Error , TEXT ( " %s: Payload '%s' could not be found in all persistent backends " ) , * Package . Key , * LexToString ( PayloadId ) ) ;
bFoundErrors = true ;
2023-01-30 04:56:40 -05:00
}
2023-02-28 10:48:04 -05:00
else if ( PayloadStatuses [ Index ] ! = EPayloadStatus : : FoundAll )
2023-01-30 04:56:40 -05:00
{
2023-02-28 10:48:04 -05:00
UE_LOG ( LogVirtualization , Error , TEXT ( " %s: Payload '%s' could not be found in any persistent backend " ) , * Package . Key , * LexToString ( PayloadId ) ) ;
bFoundErrors = true ;
2023-01-30 04:56:40 -05:00
}
2023-02-28 10:48:04 -05:00
}
if ( bFoundErrors )
{
ErrorCount + + ;
2023-01-30 04:56:40 -05:00
}
}
}
2023-02-28 10:48:04 -05:00
if ( ErrorCount = = 0 )
2023-01-30 04:56:40 -05:00
{
2023-02-28 10:48:04 -05:00
UE_LOG ( LogVirtualization , Display , TEXT ( " All virtualized payloads could be found in persistent storage " ) ) ;
return 0 ;
2023-01-30 04:56:40 -05:00
}
else
{
2023-02-28 10:48:04 -05:00
UE_LOG ( LogVirtualization , Error , TEXT ( " %d/%d package(s) had at least one virtualized payload missing from persistent storage " ) , ErrorCount , Packages . Num ( ) ) ;
return 0 ;
2023-01-30 04:56:40 -05:00
}
}