You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
#rb Devin.Doucette #jira UE-161599 #rnx #preflight 6303c8d65a5d4e4624e7bf52 - There are some use cases that require the VA system to be initialized and configured correctly but would prefer that the backend connections only run if absolutely needed (usually when a payload is pulled or pushed for the first time), this change provides four different ways of doing this: -- Setting [Core.VirtualizationModule]LazyInitConnections=true in the Engine ini file -- Setting the define 'UE_VIRTUALIZATION_CONNECTION_LAZY_INIT' to 1 in a programs .target.cs -- Running with the commandline option -VA-LazyInitConnections -- Setting the cvar 'VA.LazyInitConnections' to 1 (only works if it is set before the VA system is initialized, changing it mid editor via the console does nothing) --- Note that after the config file, each setting there only opts into lazy initializing the connections, setting the cvar to 0 for example will not prevent the cmdline from opting in etc. - In the future we will allow the connection code to run async, so the latency can be hidden behind the editor loading, but for the current use case we are taking the minimal approach. -- This means we only support the backend being in 3 states. No connection has been made yet, the connection is broken and the connection is working. -- To keep things simple we only record if we have attempted to connect the backends or not. We don't check individual backends nor do we try to reconnect failed ones etc. This is all scheduled for a future work item. - If the connections are not initialized when the VA system is, we wait until the first time someone calls one of the virtualization methods that will actually use a connection: Push/Pull/Query -- We try connecting all of the backends at once, even if they won't be used in the call to keep things simple. - Only the source control backend makes use of the connection system. The horde storage (http) backend could take advantage too, but it is currently unused and most likely going to just be deleted so there seemed little point updating it. - If we try to run an operation on an unconnected backend we only log to verbose. This is to maintain existing behaviour where a failed backend would not be mounted at all. This logging will likely be revisited in a future work item. [CL 21511855 by paul chipchase in ue5-main branch]
126 lines
5.3 KiB
C++
126 lines
5.3 KiB
C++
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#pragma once
|
|
|
|
#include "IVirtualizationBackend.h"
|
|
|
|
#include "Containers/StringView.h"
|
|
|
|
class ISourceControlProvider;
|
|
|
|
namespace UE::Virtualization
|
|
{
|
|
|
|
class FSemaphore;
|
|
|
|
/**
|
|
* This backend can be used to access payloads stored in source control.
|
|
* The backend doesn't 'check out' a payload file but instead will just download the payload as
|
|
* a binary blob.
|
|
* It is assumed that the files are stored with the same path convention as the file system
|
|
* backend, found in Utils::PayloadIdToPath.
|
|
*
|
|
* Ini file setup:
|
|
* 'Name'=(Type=P4SourceControl, DepotRoot="//XXX/", UsePartitionedClient=X, SubmitFromTempDir=X)
|
|
* Where 'Name' is the backend name in the hierarchy and 'XXX' is the path in the source control
|
|
* depot where the payload files are being stored.
|
|
*
|
|
* Optional Values:
|
|
* ClientStream [string]: Used when the payloads are stored in a stream based depot. It should contain
|
|
* the stream name to use when creating a workspace for payload submission.
|
|
* UsePartitionedClient [bool]: When true the temporary workspace client created to submit payloads
|
|
* from will be created as a partitioned workspace which is less overhead
|
|
* on the source control server. If your server does not support this then
|
|
* use false. [Default=True]
|
|
* SubmitFromTempDir [bool]: When set to true, payloads will be submitted from the temp directory of
|
|
* the current machine and when false the files will be submitted from the
|
|
* Save directory of the current project. [Default=false]
|
|
* RetryCount [int32]: How many times we should try to download a payload before giving up with
|
|
* an error. Useful when the connection is unreliable but does not experience
|
|
* frequent persistent outages. [Default=2]
|
|
* RetryWaitTime [int32]: The length of time the process should wait between each download attempt
|
|
* in milliseconds. Remember that the max length of time that the process
|
|
* can stall attempting to download a payload file is
|
|
* RetryCount * RetryWaitTime; [Default=100ms]
|
|
* BatchCount [int32] The max number of payloads that can be pushed to source control in a
|
|
* single submit. If the number of payloads in a request batch exceeds
|
|
* this size then it will be split into multiple smaller batches. [Default=100]
|
|
* SuppressNotifications[bool]: When true the system will not display a pop up notification when a
|
|
* connection error occurs, allowing the user to stay unaware of the error
|
|
* unless it actually causes some sort of problem. [Default=false]
|
|
*
|
|
* Environment Variables:
|
|
* UE-VirtualizationWorkingDir [string]: This can be set to a valid directory path that the backend
|
|
* should use as the root location to submit payloads from.
|
|
* If the users machine has this set then 'SubmitFromTempDir'
|
|
* will be ignored.
|
|
*/
|
|
class FSourceControlBackend final : public IVirtualizationBackend
|
|
{
|
|
public:
|
|
explicit FSourceControlBackend(FStringView ProjectName, FStringView ConfigName, FStringView InDebugName);
|
|
virtual ~FSourceControlBackend() = default;
|
|
|
|
private:
|
|
/* IVirtualizationBackend implementation */
|
|
|
|
virtual bool Initialize(const FString& ConfigEntry) override;
|
|
|
|
virtual EConnectionStatus OnConnect() override;
|
|
|
|
virtual EPushResult PushData(const FIoHash& Id, const FCompressedBuffer& Payload, const FString& Context) override;
|
|
virtual bool PushData(TArrayView<FPushRequest> Requests) override;
|
|
|
|
virtual FCompressedBuffer PullData(const FIoHash& Id) override;
|
|
|
|
virtual bool DoesPayloadExist(const FIoHash& Id) override;
|
|
|
|
virtual bool DoPayloadsExist(TArrayView<const FIoHash> PayloadIds, TArray<bool>& OutResults) override;
|
|
|
|
private:
|
|
|
|
bool TryApplySettingsFromConfigFiles(const FString& ConfigEntry);
|
|
|
|
void CreateDepotPath(const FIoHash& PayloadId, FStringBuilderBase& OutPath);
|
|
|
|
bool FindSubmissionWorkingDir(const FString& ConfigEntry);
|
|
|
|
/** Will display a FMessage notification to the user on the next valid engine tick to try and keep them aware of connection failures */
|
|
void OnConnectionError();
|
|
|
|
/** A source control connection owned by the backend*/
|
|
TUniquePtr<ISourceControlProvider> SCCProvider;
|
|
|
|
/** The name of the current project */
|
|
FString ProjectName;
|
|
|
|
/** The root where the virtualized payloads are stored in source control */
|
|
FString DepotRoot;
|
|
|
|
/** The stream containing the DepotRoot where the virtualized payloads are stored in source control */
|
|
FString ClientStream;
|
|
|
|
/** The root directory from which payloads are submitted. */
|
|
FString SubmissionRootDir;
|
|
|
|
/** Should we try to make the temp client partitioned or not? */
|
|
bool bUsePartitionedClient = true;
|
|
|
|
/** When true, the backend will not raise a pop up notification on connection error */
|
|
bool bSuppressNotifications = false;
|
|
|
|
/** The maximum number of files to send in a single source control operation */
|
|
int32 MaxBatchCount = 100;
|
|
|
|
/** A counted semaphore that will limit the number of concurrent connections that we can make */
|
|
TUniquePtr<UE::Virtualization::FSemaphore> ConcurrentConnectionLimit;
|
|
|
|
/** The number of times to retry pulling a payload from the depot */
|
|
int32 RetryCount = 2;
|
|
|
|
/** The length of time (in milliseconds) to wait after each pull attempt before retrying. */
|
|
int32 RetryWaitTimeMS = 100;
|
|
};
|
|
|
|
} // namespace UE::Virtualization
|