UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
OnDemandContentInstaller.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "Async/Mutex.h"
6#include "Containers/Set.h"
9#include "IO/OnDemandError.h"
10#include "IO/PackageId.h"
12#include "IO/IoAllocators.h"
13#include "IO/IoContainers.h"
14#include "IO/HttpIoDispatcher.h"
15#include "Misc/TVariant.h"
16#include "OnDemandIoStore.h"
17#include "Tasks/Pipe.h"
18
19#include <atomic>
20
21class FIoBuffer;
23
24namespace UE::IoStore
25{
26
27class FOnDemandHttpThread;
28class FOnDemandIoStore;
29
31
32namespace Private
33{
34
42
45 const TSet<FPackageId>& PackageIds,
49
52 const TSet<FSharedOnDemandContainer>& Containers,
53 const TSet<FPackageId>& PackageIds,
58
59} // namespace Private
60
63{
64 struct FRequest;
65
66 struct FChunkHttpRequestHandle : public TIntrusiveListElement<FChunkHttpRequestHandle>
67 {
68 FChunkHttpRequestHandle* Next = nullptr;
69 FRequest* OwnerRequest = nullptr;
70
72 int32 EntryIndex = INDEX_NONE;
73 };
74
75 struct FRequest
76 {
99
109
119
127
135
137
138 FRequest(FOnDemandInstallArgs&& Args, FOnDemandInstallCompleted&& OnCompleted, FOnDemandInstallProgressed&& OnProgress)
139 {
140 Variant.Emplace<FInstall>(MoveTemp(Args), MoveTemp(OnCompleted), MoveTemp(OnProgress));
141 }
142
143 FRequest(FOnDemandPurgeArgs&& Args, FOnDemandPurgeCompleted&& OnCompleted)
144 {
145 Variant.Emplace<FPurge>(MoveTemp(Args), MoveTemp(OnCompleted));
146 }
147
148 FRequest(FOnDemandDefragArgs&& Args, FOnDemandDefragCompleted&& OnCompleted)
149 {
150 Variant.Emplace<FDefrag>(MoveTemp(Args), MoveTemp(OnCompleted));
151 }
152
153 FRequest(FOnDemandVerifyCacheCompleted&& OnCompleted)
154 {
155 Variant.Emplace<FVerify>(MoveTemp(OnCompleted));
156 }
157
158 FRequest(FOnDemandFlushLastAccessCompleted&& OnCompleted)
159 {
160 Variant.Emplace<FFlushLastAccess>(MoveTemp(OnCompleted));
161 }
162
163 bool IsCancelled() const { return bCancelled; }
164 bool TryCancel()
165 {
166 bool bPrev = bCancelled;
167 bCancelled = true;
168 return bPrev == false;
169 }
170 bool IsOk() const { return !IsCancelled() && !Result.HasError(); }
171 FString GetErrorString() const { return IsOk() ? TEXT("Ok") : IsCancelled() ? TEXT("Cancelled") : LexToString(Result.GetError()); }
172
173 bool IsInstall() const { return Variant.IsType<FInstall>(); }
174 bool IsPurge() const { return Variant.IsType<FPurge>(); }
175 bool IsDefrag() const { return Variant.IsType<FDefrag>(); }
176 bool IsVerify() const { return Variant.IsType<FVerify>(); }
177 bool IsFlushLastAccess() const { return Variant.IsType<FFlushLastAccess>(); }
178
179 FInstall& AsInstall() { return Variant.Get<FInstall>(); }
180 FPurge& AsPurge() { return Variant.Get<FPurge>(); }
181 FDefrag& AsDefrag() { return Variant.Get<FDefrag>(); }
182 FVerify& AsVerify() { return Variant.Get<FVerify>(); }
183 FFlushLastAccess& AsFlushLastAccess() { return Variant.Get<FFlushLastAccess>(); }
184
186
187 static uint32 NextSeqNo;
188
189 uint32 SeqNo = NextSeqNo++;
190 int32 Priority = 0;
191 uint64 StartTimeCycles = FPlatformTime::Cycles64();
193 bool bCancelled = false;
194 FRequestVariant Variant;
195 };
196
197 struct FChunkDownloadRequest
198 {
200 TIntrusiveList<FChunkHttpRequestHandle> ChunkRequestHttpHandles;
201
202 // Should only be used to compare two requests for the same iochunk, otherwise RequestId is not unique
203 uint32 RequestId = 0;
204 bool bChunkCanceled = false;
205 };
206
207 static bool RequestSortPredicate(const FRequest& LHS, const FRequest& RHS)
208 {
209 if (LHS.Variant.GetIndex() == RHS.Variant.GetIndex())
210 {
211 if (LHS.Priority == RHS.Priority)
212 {
213 return LHS.SeqNo < RHS.SeqNo;
214 }
215
216 return LHS.Priority > RHS.Priority;
217 }
218
219 return LHS.SeqNo < RHS.SeqNo;
220 }
221
222 using FRequestAllocator = TSingleThreadedSlabAllocator<FRequest, 32>;
223
224public:
225 FOnDemandContentInstaller(FOnDemandIoStore& IoStore, FOnDemandHttpThread* HttpClient);
227
229 FOnDemandInstallArgs&& Args,
230 FOnDemandInstallCompleted&& OnCompleted,
231 FOnDemandInstallProgressed&& OnProgress);
232 void EnqueuePurgeRequest(FOnDemandPurgeArgs&& Args, FOnDemandPurgeCompleted&& OnCompleted);
233 void EnqueueDefragRequest(FOnDemandDefragArgs&& Args, FOnDemandDefragCompleted&& OnCompleted);
239
240private:
241 bool CanExecuteRequest(FRequest& Request) const;
242 void TryExecuteNextRequest();
243 void ExecuteRequest(FRequest& Request);
244 void PinCachedChunks(FRequest::FInstall& InstallRequest, TFunctionRef<void(int32, int32, bool)> OnChunkFound) const;
245 void ProcessInstallRequest(FRequest& Request);
246 void ExecuteInstallRequest(FRequest& Request);
247 void ExecutePurgeRequest(FRequest& Request);
248 void ExecuteDefragRequest(FRequest& Request);
249 void ExecuteVerifyRequest(FRequest& Request);
250 void ExectuteFlushLastAccessRequest(FRequest& Request);
251 void ProcessDownloadedChunk(
252 const FIoHash& ChunkHash,
253 uint32 RequestId,
256 FIoBuffer&& Chunk);
257 void OnProcessDownloadedChunkNotifyRequest(const FChunkHttpRequestHandle& HttpRequest, const FResult& ChunkDownloadResult, bool bChunkCancelled);
258 void TryCancelHttpRequestsForInstallRequest(FRequest::FInstall& InstallRequest, int32& OutNumCancelled);
259 void NotifyInstallProgress(FRequest& Request);
260 void DestroyRequest(FRequest& Request);
261 void CompleteInstallRequest(FRequest& Request);
262 void CompletePurgeRequest(FRequest& Request);
263 void CompleteDefragRequest(FRequest& Request);
264 void CompleteVerifyRequest(FRequest& Request);
265 void CompleteFlushLastAccessRequest(FRequest& Request);
266 void Shutdown();
267
268 FOnDemandIoStore& IoStore;
269 FOnDemandHttpThread* HttpClient;
270 UE::Tasks::FPipe InstallerPipe;
271
272 FMutex Mutex;
273 FRequestAllocator RequestAllocator;
274 TArray<FRequest*> RequestQueue;
275 TArray<FRequest*> RunningRequests;
276 // This needs to be a multimap to support cancelation. At any time, there may be multiple
277 // requests for the same iochunk but only one of them should be active with the remainder
278 // waiting on final callbacks after being cancelled. See FChunkDownloadRequest.
279 TMultiMap<FIoHash, FChunkDownloadRequest> PendingChunkDownloads;
280 std::atomic_bool bShuttingDown{false};
281};
282
283} // namespace UE::IoStore
@ INDEX_NONE
Definition CoreMiscDefines.h:150
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::int32 int32
A 32-bit signed integer.
Definition Platform.h:1125
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
EIoErrorCode
Definition IoStatus.h:19
UE_INTRINSIC_CAST UE_REWRITE constexpr std::remove_reference_t< T > && MoveTemp(T &&Obj) noexcept
Definition UnrealTemplate.h:520
UE_REWRITE TValueOrError_ValueProxy< ArgTypes... > MakeValue(ArgTypes &&... Args UE_LIFETIMEBOUND)
Definition ValueOrError.h:35
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition IoBuffer.h:15
Definition Array.h:670
Definition AssetRegistryState.h:50
Definition IoContainers.h:68
Definition IoAllocators.h:10
Definition OnDemandContentInstaller.h:63
void EnqueueVerifyRequest(FOnDemandVerifyCacheCompleted &&OnCompleted)
Definition OnDemandContentInstaller.cpp:340
FOnDemandContentInstaller(FOnDemandIoStore &IoStore, FOnDemandHttpThread *HttpClient)
Definition OnDemandContentInstaller.cpp:284
void EnqueuePurgeRequest(FOnDemandPurgeArgs &&Args, FOnDemandPurgeCompleted &&OnCompleted)
Definition OnDemandContentInstaller.cpp:320
void UpdateInstallRequestPriority(FSharedInternalInstallRequest InstallRequest, int32 NewPriority)
Definition OnDemandContentInstaller.cpp:417
void EnqueueFlushLastAccessRequest(FOnDemandFlushLastAccessCompleted &&OnCompleted)
Definition OnDemandContentInstaller.cpp:350
~FOnDemandContentInstaller()
Definition OnDemandContentInstaller.cpp:291
void EnqueueDefragRequest(FOnDemandDefragArgs &&Args, FOnDemandDefragCompleted &&OnCompleted)
Definition OnDemandContentInstaller.cpp:330
FSharedInternalInstallRequest EnqueueInstallRequest(FOnDemandInstallArgs &&Args, FOnDemandInstallCompleted &&OnCompleted, FOnDemandInstallProgressed &&OnProgress)
Definition OnDemandContentInstaller.cpp:296
void ReportAnalytics(TArray< FAnalyticsEventAttribute > &OutAnalyticsArray) const
Definition OnDemandContentInstaller.cpp:495
void CancelInstallRequest(FSharedInternalInstallRequest InstallRequest)
Definition OnDemandContentInstaller.cpp:360
Definition Pipe.h:29
bool IsOk(int32 StatusCode)
Definition IHttpResponse.h:38
Definition OverriddenPropertySet.cpp:45
void ResolveChunksToInstall(const TSet< FSharedOnDemandContainer > &Containers, const TSet< FPackageId > &PackageIds, bool bIncludeSoftReferences, bool bIncludeOptionalBulkData, TArray< FResolvedContainerChunks > &OutResolvedContainerChunks, TSet< FPackageId > &OutMissing)
Definition OnDemandContentInstaller.cpp:160
void ResolvePackageDependencies(const TSet< FPackageId > &PackageIds, bool bIncludeSoftReferences, TSet< FPackageId > &OutResolved, TSet< FPackageId > &OutMissing)
Definition OnDemandContentInstaller.cpp:85
NO_LOGGING.
Definition Client.h:20
TUniqueFunction< void(FOnDemandVerifyCacheResult)> FOnDemandVerifyCacheCompleted
Definition IoStoreOnDemand.h:528
TUniqueFunction< void(FOnDemandPurgeResult)> FOnDemandPurgeCompleted
Definition IoStoreOnDemand.h:389
FString LexToString(const FOnDemandContentHandle &Handle)
Definition IoStoreOnDemandInternals.cpp:68
TValueOrError< void, UE::UnifiedError::FError > FResult
Definition OnDemandError.h:32
TFunction< void(FOnDemandInstallProgress)> FOnDemandInstallProgressed
Definition IoStoreOnDemand.h:308
TUniqueFunction< void(FOnDemandFlushLastAccessResult)> FOnDemandFlushLastAccessCompleted
Definition OnDemandIoStore.h:326
TUniqueFunction< void(FOnDemandInstallResult)> FOnDemandInstallCompleted
Definition IoStoreOnDemand.h:324
TUniqueFunction< void(FOnDemandDefragResult)> FOnDemandDefragCompleted
Definition IoStoreOnDemand.h:422
TSharedPtr< class FOnDemandInternalInstallRequest, ESPMode::ThreadSafe > FSharedInternalInstallRequest
Definition IoStoreOnDemand.h:39
UE_STRING_CLASS Result(Forward< LhsType >(Lhs), RhsLen)
Definition String.cpp.inl:732
Definition AnalyticsEventAttribute.h:48
static uint64 Cycles64()
Definition AndroidPlatformTime.h:34
Definition IoHash.h:33
Definition IoContainers.h:52
Definition Optional.h:131
Definition OnDemandContentInstaller.h:111
FOnDemandDefragCompleted OnCompleted
Definition OnDemandContentInstaller.h:117
FOnDemandDefragArgs Args
Definition OnDemandContentInstaller.h:116
FDefrag(FOnDemandDefragArgs &&InArgs, FOnDemandDefragCompleted &&InOnCompleted)
Definition OnDemandContentInstaller.h:112
FOnDemandFlushLastAccessCompleted OnCompleted
Definition OnDemandContentInstaller.h:133
FFlushLastAccess(FOnDemandFlushLastAccessCompleted &&InOnCompleted)
Definition OnDemandContentInstaller.h:130
Definition OnDemandContentInstaller.h:78
TArray< FChunkHttpRequestHandle > HttpRequestHandles
Definition OnDemandContentInstaller.h:92
FOnDemandInstallArgs Args
Definition OnDemandContentInstaller.h:87
bool bHttpRequestsIssued
Definition OnDemandContentInstaller.h:96
FInstall(FOnDemandInstallArgs &&InArgs, FOnDemandInstallCompleted &&InOnCompleted, FOnDemandInstallProgressed &&InOnProgress)
Definition OnDemandContentInstaller.h:79
FOnDemandInstallCompleted OnCompleted
Definition OnDemandContentInstaller.h:88
uint64 DownloadedChunkCount
Definition OnDemandContentInstaller.h:94
std::atomic_bool bNotifyingProgressOnGameThread
Definition OnDemandContentInstaller.h:97
FOnDemandInstallProgressed OnProgress
Definition OnDemandContentInstaller.h:89
FSharedInternalInstallRequest Request
Definition OnDemandContentInstaller.h:90
uint64 LastProgressCycles
Definition OnDemandContentInstaller.h:95
FOnDemandInstallProgress Progress
Definition OnDemandContentInstaller.h:93
TArray< Private::FResolvedContainerChunks > ResolvedChunks
Definition OnDemandContentInstaller.h:91
Definition OnDemandContentInstaller.h:101
FOnDemandPurgeCompleted OnCompleted
Definition OnDemandContentInstaller.h:107
FOnDemandPurgeArgs Args
Definition OnDemandContentInstaller.h:106
FPurge(FOnDemandPurgeArgs &&InArgs, FOnDemandPurgeCompleted &&InOnCompleted)
Definition OnDemandContentInstaller.h:102
Definition OnDemandContentInstaller.h:121
FOnDemandVerifyCacheCompleted OnCompleted
Definition OnDemandContentInstaller.h:125
FVerify(FOnDemandVerifyCacheCompleted &&InOnCompleted)
Definition OnDemandContentInstaller.h:122
Definition IoStoreOnDemand.h:403
Definition IoStoreOnDemand.h:233
Definition IoStoreOnDemand.h:252
Definition IoStoreOnDemand.h:370
Definition OnDemandContentInstaller.h:37
FSharedOnDemandContainer Container
Definition OnDemandContentInstaller.h:38
TArray< int32 > EntryIndices
Definition OnDemandContentInstaller.h:39
uint64 TotalSize
Definition OnDemandContentInstaller.h:40