UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
CacheJournalSectioned.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
5#include "CacheJournal.h"
6
7#if !UE_BUILD_SHIPPING
8
9#include "CoreMinimal.h"
11#include "Tasks/Task.h"
12
13namespace StorageServer
14{
15 enum class EPageType : uint8
16 {
17 Chunk = 1,
18 ChunkInfo = 2
19 };
20
22 {
25 bool bValid;
26
28 {
29 return ChunkId < Other.ChunkId;
30 }
31
33 {
34 Ar << StoreEntry.ChunkId;
35 Ar << StoreEntry.Entry;
36 Ar << StoreEntry.bValid;
37 return Ar;
38 }
39 };
40
42 {
43 Ok,
47 };
48
50 {
54
55 static constexpr int32 SerializedSize = 32; // actual size is 12 bytes, but we reserve some for future use
56
58 {
59 Ar << Header.Magic;
60 Ar << Header.Version;
61 Ar << Header.PageCount;
62 return Ar;
63 }
64 };
65
67 {
69 uint32 PageSize; // total size of page in bytes, should be used to calculate offset of next page
70 uint32 DataSize; // size of data in current page minus header, can be less than page size if page is not full
71 FIoHash DataHash; // hash of data in current page
73
74 static constexpr int32 SerializedSize = 64; // actual size is 33 bytes, but we reserve some for future use
75
77 {
78 Ar << Desc.Magic;
79 Ar << Desc.PageSize;
80 Ar << Desc.DataSize;
81 Ar << Desc.DataHash;
82 Ar << Desc.Type;
83 return Ar;
84 }
85 };
86
88 {
89 public:
96
98 {
99 }
100
101 [[nodiscard]] virtual bool Contains(const FIoChunkId&) const = 0;
102 [[nodiscard]] virtual bool IsFull() const = 0;
103
105 {
107 }
108
110 {
111 return FilePos;
112 }
113
115 {
116 return PageSize;
117 }
118
120
122 {
123 Page.Serialize(Ar);
124 return Ar;
125 }
126
127 protected:
131 bool bDirty = false;
132
133 virtual void Serialize(FArchive& Ar) = 0;
134 };
135
137 {
138 public:
140
141 EJournalPageResult Add(const FIoChunkId& ChunkId, const FCacheChunkInfo& Entry);
142 bool GetEntry(const FIoChunkId& ChunkId, FCacheChunkInfo& Info);
143 virtual bool Contains(const FIoChunkId& ChunkId) const override;
144 virtual bool IsFull() const override
145 {
146 return Entries.Num() >= MaxEntryCount;
147 }
149 {
150 return Entries.Num();
151 }
152
153 void Invalidate(const FIoChunkId& ChunkId);
154 void InvalidateAll();
155
156 void IterateChunkIds(TFunctionRef<void(const FIoChunkId& ChunkId, const FCacheChunkInfo& ChunkInfo)> Callback);
157
159
160 private:
161 int32 MaxEntryCount;
163
164 virtual void Serialize(FArchive& Ar) override
165 {
166 Ar << *this;
167 }
168 };
169
171 {
172 public:
174
175 EJournalPageResult Add(const FIoChunkId& ChunkId, const FCacheEntry& Entry);
176 bool GetEntry(const FIoChunkId& ChunkId, const uint64 ChunkOffset, const uint64 ChunkSize, FCacheEntry& OutEntry);
177 virtual bool Contains(const FIoChunkId& ChunkId) const override
178 {
179 return ChunkMap.Contains(ChunkId);
180 }
181
182 void IterateCacheEntriesForChunkId(const FIoChunkId& ChunkId, TFunctionRef<void(const FCacheEntry& Entry)> Callback);
183 void IterateCacheEntries(TFunctionRef<void(const FIoChunkId& ChunkId, const FCacheEntry& Entry)> Callback);
184 virtual bool IsFull() const override
185 {
186 return Entries.Num() == MaxEntryCount;
187 }
189 {
190 return Entries.Num();
191 }
192
193 void Invalidate(const FIoChunkId& ChunkId);
194 void InvalidateAll();
195
197
198 private:
199 using FIntervalMap = TMap<TInterval<uint64>, int32>;
202 int32 MaxEntryCount;
203 bool bContainsInvalidEntries = false;
204
205 virtual void Serialize(FArchive& Ar) override
206 {
207 Ar << *this;
208 }
209 };
210
212 {
213 public:
214
216 virtual ~FCacheJournalSectioned() override = default;
217
218 virtual void Flush(bool bImmediate) override;
219 virtual void InvalidateAll() override;
220 virtual void Invalidate(const FIoChunkId& ChunkId) override;
221
222 virtual bool SetChunkInfo(const FIoChunkId& ChunkId, const TOptional<uint64>& OptModHash, const TOptional<int64>& OptRawSize, const TOptional<int32>& OptRawBlockSize) override;
223 virtual bool TryGetChunkInfo(const FIoChunkId& ChunkId, FCacheChunkInfo& OutChunkInfo) override;
224
225 virtual bool AddEntry(const FIoChunkId& ChunkId, const FCacheEntry& Entry) override;
226 virtual bool TryGetEntry(const FIoChunkId& ChunkId, const uint64 ChunkOffset, const uint64 ChunkSize, FCacheEntry& OutEntry) override;
227
228 virtual void IterateChunkIds(TFunctionRef<void(const FIoChunkId& ChunkId, const FCacheChunkInfo& ChunkInfo)> Callback) override;
229 virtual void IterateCacheEntriesForChunkId(const FIoChunkId& ChunkId, TFunctionRef<void(const FCacheEntry& Entry)> Callback) override;
230 virtual void IterateCacheEntries(TFunctionRef<void(const FIoChunkId& ChunkId, const FCacheEntry& Entry)> Callback) override;
231
232 private:
233 bool LoadCacheJournal();
234 void ValidateJournal();
235
236 FJournalChunkInfoPage* FindOrAddChunkInfoPage(const FIoChunkId& ChunkId);
237 FJournalChunkPage* FindOrAddChunkPage(const FIoChunkId& ChunkId);
238
239 FJournalChunkInfoPage* AddChunkInfoPage();
240 FJournalChunkPage* AddChunkPage();
241
242 int32 AllocateJournalFilePos(int32 PageSize)
243 {
244 int32 CurrentJournalPos = NextAvailableJournalPos;
245 NextAvailableJournalPos += PageSize;
246 return CurrentJournalPos;
247 }
248
249 void ResetJournalFilePos()
250 {
251 NextAvailableJournalPos = FJournalHeader::SerializedSize;
252 }
253
254 private:
255 FString JournalFilePath;
256 TUniquePtr<IFileHandle> JournalFileHandle;
257 uint32 NextAvailableJournalPos = FJournalHeader::SerializedSize;
258 UE::Tasks::TTask<void> FlushTask;
259
260 bool bPagesModified = false;
261
262 TArray<FJournalChunkPage> ChunkPages;
263 TArray<FJournalChunkInfoPage> ChunkInfoPages;
264 FJournalChunkPage* CurrentChunkPage = nullptr;
265
266 FCriticalSection CriticalSection;
267
268 void FlushImmediate();
269 };
270
271}
272
273#endif // !UE_BUILD_SHIPPING
FPlatformTypes::int64 int64
A 64-bit signed integer.
Definition Platform.h:1127
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
UE::FPlatformRecursiveMutex FCriticalSection
Definition CriticalSection.h:53
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
virtual void Serialize(void *V, int64 Length)
Definition Archive.h:1689
Definition IoChunkId.h:64
Definition GenericPlatformFile.h:117
Definition CacheJournalSectioned.h:212
virtual void IterateChunkIds(TFunctionRef< void(const FIoChunkId &ChunkId, const FCacheChunkInfo &ChunkInfo)> Callback) override
Definition CacheJournalSectioned.cpp:220
virtual bool AddEntry(const FIoChunkId &ChunkId, const FCacheEntry &Entry) override
Definition CacheJournalSectioned.cpp:188
virtual void IterateCacheEntriesForChunkId(const FIoChunkId &ChunkId, TFunctionRef< void(const FCacheEntry &Entry)> Callback) override
Definition CacheJournalSectioned.cpp:230
virtual ~FCacheJournalSectioned() override=default
virtual bool SetChunkInfo(const FIoChunkId &ChunkId, const TOptional< uint64 > &OptModHash, const TOptional< int64 > &OptRawSize, const TOptional< int32 > &OptRawBlockSize) override
Definition CacheJournalSectioned.cpp:149
virtual bool TryGetEntry(const FIoChunkId &ChunkId, const uint64 ChunkOffset, const uint64 ChunkSize, FCacheEntry &OutEntry) override
Definition CacheJournalSectioned.cpp:205
virtual void IterateCacheEntries(TFunctionRef< void(const FIoChunkId &ChunkId, const FCacheEntry &Entry)> Callback) override
Definition CacheJournalSectioned.cpp:240
virtual void InvalidateAll() override
Definition CacheJournalSectioned.cpp:120
virtual bool TryGetChunkInfo(const FIoChunkId &ChunkId, FCacheChunkInfo &OutChunkInfo) override
Definition CacheJournalSectioned.cpp:173
Definition CacheJournalSectioned.h:137
friend FArchive & operator<<(FArchive &Ar, FJournalChunkInfoPage &Page)
Definition CacheJournalSectioned.cpp:628
virtual bool Contains(const FIoChunkId &ChunkId) const override
Definition CacheJournalSectioned.cpp:599
void IterateChunkIds(TFunctionRef< void(const FIoChunkId &ChunkId, const FCacheChunkInfo &ChunkInfo)> Callback)
Definition CacheJournalSectioned.cpp:620
virtual bool IsFull() const override
Definition CacheJournalSectioned.h:144
void InvalidateAll()
Definition CacheJournalSectioned.cpp:614
bool GetEntry(const FIoChunkId &ChunkId, FCacheChunkInfo &Info)
Definition CacheJournalSectioned.cpp:587
int32 GetEntryCount() const
Definition CacheJournalSectioned.h:148
Definition CacheJournalSectioned.h:171
virtual bool Contains(const FIoChunkId &ChunkId) const override
Definition CacheJournalSectioned.h:177
void InvalidateAll()
Definition CacheJournalSectioned.cpp:721
void IterateCacheEntriesForChunkId(const FIoChunkId &ChunkId, TFunctionRef< void(const FCacheEntry &Entry)> Callback)
Definition CacheJournalSectioned.cpp:682
friend FArchive & operator<<(FArchive &Ar, FJournalChunkPage &Page)
Definition CacheJournalSectioned.cpp:728
virtual bool IsFull() const override
Definition CacheJournalSectioned.h:184
bool GetEntry(const FIoChunkId &ChunkId, const uint64 ChunkOffset, const uint64 ChunkSize, FCacheEntry &OutEntry)
Definition CacheJournalSectioned.cpp:666
void IterateCacheEntries(TFunctionRef< void(const FIoChunkId &ChunkId, const FCacheEntry &Entry)> Callback)
Definition CacheJournalSectioned.cpp:694
int32 GetEntryCount() const
Definition CacheJournalSectioned.h:188
Definition CacheJournalSectioned.h:88
virtual bool Contains(const FIoChunkId &) const =0
const EPageType PageType
Definition CacheJournalSectioned.h:130
FJournalPageBase(EPageType InPageType, int64 InPageSize)
Definition CacheJournalSectioned.h:90
bool bDirty
Definition CacheJournalSectioned.h:131
virtual ~FJournalPageBase()
Definition CacheJournalSectioned.h:97
int64 GetPageSize() const
Definition CacheJournalSectioned.h:114
int64 FilePos
Definition CacheJournalSectioned.h:128
virtual bool IsFull() const =0
virtual void Serialize(FArchive &Ar)=0
void SetFilePos(int64 FileCursor)
Definition CacheJournalSectioned.h:104
friend FArchive & operator<<(FArchive &Ar, FJournalPageBase &Page)
Definition CacheJournalSectioned.h:121
int64 GetFilePos() const
Definition CacheJournalSectioned.h:109
const int64 PageSize
Definition CacheJournalSectioned.h:129
Definition CacheJournal.h:91
Definition Array.h:670
Definition AssetRegistryState.h:50
Definition UnrealString.h.inl:34
Definition UniquePtr.h:107
Definition Task.h:191
Definition CacheJournal.h:15
EJournalPageResult
Definition CacheJournalSectioned.h:42
EPageType
Definition CacheJournalSectioned.h:16
Definition IoHash.h:33
Definition CacheJournal.h:17
Definition CacheJournal.h:63
Definition CacheJournalSectioned.h:50
uint32 PageCount
Definition CacheJournalSectioned.h:53
static constexpr int32 SerializedSize
Definition CacheJournalSectioned.h:55
friend FArchive & operator<<(FArchive &Ar, FJournalHeader &Header)
Definition CacheJournalSectioned.h:57
uint32 Magic
Definition CacheJournalSectioned.h:51
uint32 Version
Definition CacheJournalSectioned.h:52
Definition CacheJournalSectioned.h:67
uint32 DataSize
Definition CacheJournalSectioned.h:70
static constexpr int32 SerializedSize
Definition CacheJournalSectioned.h:74
uint32 PageSize
Definition CacheJournalSectioned.h:69
uint32 Magic
Definition CacheJournalSectioned.h:68
FIoHash DataHash
Definition CacheJournalSectioned.h:71
EPageType Type
Definition CacheJournalSectioned.h:72
friend FArchive & operator<<(FArchive &Ar, FJournalPageHeader &Desc)
Definition CacheJournalSectioned.h:76
Definition CacheJournalSectioned.h:22
bool bValid
Definition CacheJournalSectioned.h:25
FIoChunkId ChunkId
Definition CacheJournalSectioned.h:23
FCacheEntry Entry
Definition CacheJournalSectioned.h:24
friend FArchive & operator<<(FArchive &Ar, FJournalStoreEntry &StoreEntry)
Definition CacheJournalSectioned.h:32
bool operator<(const FJournalStoreEntry &Other) const
Definition CacheJournalSectioned.h:27
Definition Optional.h:131