feat: Implement new virtual glob filesystem #971
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Issue
When uploading images from a networked folder, immich-go slows down due to a large number of syscalls to get file metadata. This can be seen in the attached flamegraph, obtained by trying to upload pictures from a mounted SMB drive:
Fix
We can improve this by walking the filesystem beforehand, and keeping the results in memory. Not only does this batch all the metadata reads, it also deduplicates them, reducing overall network and disk usage, greatly improving performance.
This PR implements such a "virtual" filesystem, as a drop-in replacement for the existing implementation.
Improvements
In my environment, I was able to go from uploading one picture every 2 seconds, to 25 pictures per second; a near 50x increase.
Screenshots
Before, with syscall heavy implementation:

After, with virtual FS implementation:

Notes
All changes to the tests were made before the FS was implemented; they have been run on both the previous and the new FS implementations to ensure backwards compatibility.