168 Commits

Author SHA1 Message Date
paul chipchase
935b554612 Add a new cmdline option to UnrealPak allowing all IAS content to be primed on an endpoint, so that testers can have the same experience as an end users.
#rb Per.Larsson
#rnx

### New Command
- Run UnrealPak.exe with the commandline "-PrimeEndPoint=ABC" where ABC is a path to a IoStoreOnDemand.ini containing the info about the end point to prime.
- The command will mount the correct backend, connect to the end point, download the utoc files there and then attempt to download each chunk present so that they will be cached by the CDN endpoint.
- The command does not use the IAS filecache and should not affect the state of the local machine.
- We also make use of the existing IAS code, so this path can also be used for profiling when the IAS requests are saturated etc.

### Code Changes

- The code for parsing the ini file in FIoStoreOnDemandModule::StartupModule has been moved to common utility code so that it can be reused.

[CL 27026561 by paul chipchase in ue5-main branch]
2023-08-11 09:49:46 -04:00
per larsson
24d9d8349c IAS - support for downloading on demand container file(s) with UnrealPak
Usage: UnrealPak.exe -Download=<RemoteTocPath> -Directory=<LocalPath> -ServiceUrl=<URL> -Bucket=<BucketName>

#rb none
#rnx

[CL 26307209 by per larsson in ue5-main branch]
2023-06-29 05:28:06 -04:00
per larsson
3bed8ef537 I/O - support for uploading on demand I/O store containers to S3 with UnrealPak
- added support for uploading containers marked as on demand directly from UnrealPak.exe
- removed C# based upload logic from automation scripts
- removed on demand I/O store writer since this change reads chunks directly from container files instead of loose files

Example usage:
UnrealPak.exe -Upload=<ContainerPathOrWildcard> -ServiceUrl=<URL> -Bucket=<BucketName> -AccessKey=<Key> -SecretKey=<Key>

Read credentials from an AWS key chain file with the following command line:
-CredentialsFile=<Path> -CredentialsFileKeyName=<EntryName>

Specify -KeepUploadedContainers to prevent UnrealPak to delete on demand containers after the upload has been completed.
Specify -BucketPrefix=<Path> to upload chunks to a specific sub directory within the bucket.

#rb none

[CL 26115169 by per larsson in ue5-main branch]
2023-06-20 04:21:22 -04:00
paul chipchase
735fef839d Fix potential threading crash in UnrealPak
#rb Per.Larsson
#jira UE-186965
#preflight 6470b4a9f3773f755083fa2c

- The compressor stat arrays belonging to FOutputPakFile were being initialized right after async pakfile work has been scheduled. In rare cases the scheduled work could run before the initialization was completed and we would attempt to write out stats into uninitialized memory.
- We now make sure that the stat arrays are initialized before any work can be scheduled.
- I did a quick pass to check for similar patterns but couldn't find any.

[CL 25661995 by paul chipchase in ue5-main branch]
2023-05-29 02:46:04 -04:00
Per Larsson
2366c567d6 PAK - flush pending file writers before exiting UnrealPak
#jira UE-179925
#rb CarlMagnus.Nordin
#preflight 642bbaf8da7f95837033d7c6

[CL 24907513 by Per Larsson in ue5-main branch]
2023-04-04 04:15:55 -04:00
justin marcus
29f370f3b8 Check for IO errors when signing paks.
Fix pak files not being signed.


[REVIEW] [at]Graeme.Thornton [at]Bart.Hawthorne

[CL 24906547 by justin marcus in ue5-main branch]
2023-04-03 23:31:44 -04:00
Andriy Tylychko
321c94194f removed core delegates deprecated in 5.2. while it's a bit too early for a normal deprecation removal, these delegates are known race conditions so it's rather an urgency
#preflight 641ddae9973e609670e2f347
#rb francis.hurteau

[CL 24805272 by Andriy Tylychko in ue5-main branch]
2023-03-27 13:25:52 -04:00
pj kack
eb2c730a89 UnrealPak: Add -csv parameter to create pak and create ucas commands to list all the chunks.
Output is the same as when executing the -list command separately.
Running with -csv=<dir> will create one <pakchunkfilename>.pak.csv file per generated pak and one <pakchunkfilename>.utoc.csv file per generated container.
Running with -csv=<file> will create one single <file>.pak.csv for all paks and one <file>.utoc.csv for all containers.

Details:
The container output (the big set of data) is generated based on in-memory writer TOC data once the IoStoreWriters have been finalized.
The pak output (smaller set of data) is generated using the existing list command and loads the newly generated files from disk.
Cleanup the remains of three obsolete csv output features for containers (-csvoutput, -writefinalorder and OUTPUT_CHUNKID_DIRECTORY).
Optimize container output generation by extending FIoStoreTocChunkInfo with OffsetOnDisk and NumCompressedBlocks filled directly by EnumerateChunks.
Add a ChunkIdToFileNameMap to FCookedPackageStore.
Use the FCookedPackageStore to output the actual package ids and package names (this is currently broken when running -list as a separate command).

#rb carlmagnus.nordin
#rnx
#preflight 63e5eacb98775169f8dea431

[CL 24118941 by pj kack in ue5-main branch]
2023-02-10 10:13:22 -05:00
dan thompson
fbd5b69cbc Tidy up pak log spam a bit when making 1000s of pak files.
#preflight 63e2c7a8c11233cdcaaa8e4a
#rb pj.kack

[CL 24066993 by dan thompson in ue5-main branch]
2023-02-08 00:25:30 -05:00
pj kack
5450132470 UnrealPak: Improve diffutils
Add support for diffing pak directories for pak diff.
Add support for different cryptokeys for pak diff and legacy iostore diff.

#jira UE-175144
#rb carlmagnus.nordin
#rnx
#preflight 63d9259e7a39a18021d4f997

[CL 23945218 by pj kack in ue5-main branch]
2023-02-01 03:39:07 -05:00
Francis Hurteau
9dfe27ab41 Truncation warning fixes for multiple core modules:
CookOnTheFly, CookOnTheFlyNetServer, PakFileUtilities, PakFile

#jira UE-166274
#rb PJ.Kack
#preflight 63c041f01a06fc61057115b7

[CL 23666183 by Francis Hurteau in ue5-main branch]
2023-01-12 13:17:30 -05:00
carlmagnus nordin
434141b1f8 UnrealPak: Fix check triggering for modifying compression tasks array while iterating over it
#jira UE-172561
#preflight 6398867d2960b73220f611d5
#rb paul.chipchase

[CL 23514303 by carlmagnus nordin in ue5-main branch]
2022-12-14 13:19:01 -05:00
pj kack
8c69b411f5 UnrealPak: Fix unavoidable crash when using -repack (fallout from cl 18836432).
Let CollectFilesToAdd fallback to the old logic of using the source file name when the FPakInputPair.Dest specifies a directory, i.e. is ending with a "/".
Let ExtractFilesFromPak start using destination file names just as ProcessCommandLine reading from response files is doing so that -Extract with -responsefile will generate the same format as UAT with file names.
Remove dead code in ProcessPakFileSpecificCommandLine.

#jira UE-171678
#rb carlmagnus.nordin
#lockdown mark.lintott
#preflight 6390679d1776b8c21cf42bac

[CL 23427029 by pj kack in ue5-main branch]
2022-12-07 07:17:57 -05:00
graeme thornton
f8f4e8769d PakFile: Add functionality to sign a pak as a separate step
[FYI] carlmagnus.nordin

[CL 23312474 by graeme thornton in ue5-main branch]
2022-11-29 12:35:16 -05:00
paul chipchase
2c1e11b225 UnrealPak now supports rehydrating virtualized files as they are placed into pak files
#rb CarlMagnus.Nordin, Per.Larsson
#rnx
#preflight 63496fcf1f6054a99fe8bd0c

- When parsing the paklist, any file with a -rehydrate flag will be considered for rehydration

- Add the virtualization module to the PakFileUtilities module
- Add the source control module to UnrealPak (the virtualization module should be taking care of this)
- While parsing the files to be included in the pak file, we will record if any of the files require rehydration, if so this will be noted in FPakCommandLineParameters::bRequiresRehydration and used to initialize the virtualization system.
-- We only need to initialize the system once, even if we detect that multiple pak files have files that need rehydration.
-- If no pak file needs rehydration we do not initialize the system and the virtualization module is never loaded.
- FOutputPakFileEntry::CompressedFileBuffer was made private with accessors to make the refactor easier.
- Now when we start to compress a file, we always load it entirely into memory (along with any potential padding needed), if we then detect that the file doesn't require padding then we just use the in memory buffer as the output and if we do need compression we compress the buffer.
-- This means that there is only one place we load the file from disk, meaing only one place we need to insert the rehydration code to. This load is where the rehydration occurs.
-- In the previous code we would load the file into memory and then retain this copy during the compression pass, so no additional memory should be used.
- At the moment when we get the buffer back fromt he rehydration pass it will be in the form of a FSharedBuffer and so for now we need to memcpy to FCompressedFileBuffer::UncompressedBuffer, which is a waste of cpu cycles.
-- In a future change we should change UncompressedBuffer from TArray to FSharedBuffer to avoid this.

[CL 22595708 by paul chipchase in ue5-main branch]
2022-10-18 05:23:58 -04:00
paul chipchase
45c1322f06 Fix a bug where UnrealPak would produce inconsistent binary output due to occasionally skipping compression on files that should've been compressed.
#rb CarlMagnus.Nordin
#rnx
#preflight 6346ab768a0a7b2adc72cce4

### Problem
- The bug was originally introduced in CL 21791765
- Each file to be compressed calls FPakWriterContext::BeginCompress which will create a FMemoryCompressor and assign it to the files FOutputPakFileEntry. The problem is that the work done by the FMemoryCompressor can potentially complete and signal EndCompressionBarrier before the FMemoryCompresseor has been assigned. This can be due to the work itself being very small, or that closing a file handle when FCompressedFileBuffer::BeginCompressFileToWorkingBuffer returns (which creates the FMemoryCompressor) stalls against system resources. This potentially allows FPakWriterContext::EndCompres to execute concurrently and incorrectly believe that the file is not being compressed as FOutputPakFileEntry::MemoryCompressor is still nullptr.
- Not only does this mean that some files end up being paked uncompressed when they should be compressed, the results are not deterministic which means we can end up with different binary output when paking the exact same data with the exact same settings.

### Solution
- The constructor of FMemoryCompressor no longer adds its work to the task graph system. Instead the tasks are only added after the compressor has been assigned to FOutputPakFileEntry.
- Replaced auto in ranged for loops with the type, as per recent coding standards discussions.

[CL 22505090 by paul chipchase in ue5-main branch]
2022-10-13 11:12:42 -04:00
carlmagnus nordin
ce567d1e8e UnrealPak: Fixed issue with files larger than 2GB
#rb none
#preflight 6346695a8d665d55d024fdbc

[CL 22497602 by carlmagnus nordin in ue5-main branch]
2022-10-13 02:48:05 -04:00
Andriy Tylychko
4a6985cfbe Deprecated all global vars of thread-safe delegates from FCoreDelegates and replaced them by functions returning local static singleton.
thread-safe delegates are not zero-initializable and so can't be used as global vars because they are vulnerable to static initialization order fiasco.

#jira UE-163668
#rb steve.robb
#preflight 632462db3752284a3179ec02

[CL 22094531 by Andriy Tylychko in ue5-main branch]
2022-09-20 11:45:56 -04:00
jason walter
26117b5d31 Rename IniKeyBlacklist to IniKeyDenylist and IniSectionBlacklist to IniSectionDenyList
#jira UE-131078
#rb josh.adams
#preflight 6320c90f47741a7dbd237e5f

[CL 21997756 by jason walter in ue5-main branch]
2022-09-13 21:47:24 -04:00
josh adams
882d771a9c Unshelved from pending changelist '21985878':
- Fixed an assert with -makebinaryconfig
#jira UE-161112
#rb trivial
#preflight skip

[CL 21990880 by josh adams in ue5-main branch]
2022-09-13 15:56:41 -04:00
carlmagnus nordin
efeccfe4c7 UnrealPak: Refactor compression code to avoid busy waiting from within a task
#rb per.larsson
#preflight 6315e359da63cdf170d7b13d

[CL 21794638 by carlmagnus nordin in ue5-main branch]
2022-09-05 10:53:47 -04:00
zack neyland
d043077847 UnrealPak: Resolves an extremely rare race condition that happens when Flush() reaches the CompressionThread.Wait() before the CompressionThread has an opportunity to run and check for the flush condition.
#jira UE-162050
#preflight 630be41ce352708d44d1cd54
#rb carlmagnus.nordin

[CL 21701333 by zack neyland in ue5-main branch]
2022-08-30 11:08:24 -04:00
mark lintott
3d47f895e5 Fixed unacceptable words in PakFileUtilities
#jira UE-158611
#rb pj.kack
#preflight 62f383dbbc175ec68c338e38

[CL 21316108 by mark lintott in ue5-main branch]
2022-08-10 06:24:40 -04:00
henrik karlsson
68b551b1d7 [UnrealPak]
* Added -cryptofile documentation line when starting unrealpak without parameters

#rb Erik.Knapik
#preflight skip

#ROBOMERGE-AUTHOR: henrik.karlsson
#ROBOMERGE-SOURCE: CL 21183712 via CL 21195199 via CL 21195379 via CL 21195491
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v972-20964824)

[CL 21196924 by henrik karlsson in ue5-main branch]
2022-07-20 21:51:41 -04:00
marc audy
cd4b7d3c78 Game user settings fix and rollback of 20905839, which was itself a rollback of 20029182
#rb [at]Josh.Adams
#preflight

#ROBOMERGE-OWNER: marc.audy
#ROBOMERGE-AUTHOR: mic.rooney
#ROBOMERGE-SOURCE: CL 20973575 via CL 20978259
#ROBOMERGE-BOT: UE5 (Release-Engine-Staging -> Main) (v972-20964824)
#ROBOMERGE-CONFLICT from-shelf

[CL 20980862 by marc audy in ue5-main branch]
2022-07-07 01:55:35 -04:00