You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Container listing cache includes every .meta sidecar, doubling its size #15608
AssetContainerContents::all() (src/Assets/AssetContainerContents.php:31) caches the raw recursive Flysystem listing of the container, including every .meta/*.yaml sidecar. With cache_meta enabled each asset has one, so roughly half of the cached listing is meta files that nothing reads through the listing: Asset::meta() reads them by path via disk()->get($this->metaPath()), and filteredFilesIn() filters them back out for every consumer.
Only two callers want them: metaFilesIn() (src/Assets/AssetContainerContents.php:179), used by AssetContainer::metaFiles() for assets:meta-clean and folder deletion, and Asset::metaExists() (src/Assets/Asset.php:316).
Real numbers from one site: 197,603 entries in the listing, 99,944 of them .meta yaml. The cached key is 80 MB serialized and loading it exhausts a 1 GB PHP-FPM worker.
How to reproduce
S3 container with cache_meta on and a large number of assets.
Warm the listing (AssetContainer::find('x')->files()).
Inspect the cached asset-list-contents-<handle> value: half the entries are under .meta/.
Logs
Allowed memory size of 1073741824 bytes exhausted (tried to allocate 80320709 bytes) at vendor/laravel/framework/src/Illuminate/Redis/Connections/Connection.php:124
Suggested fix: drop .meta paths from the cached listing in all() (filter in the remember callback, next to normalizeFlysystemAttributes()), and have metaFilesIn() list <folder>/.meta directly from the filesystem on demand instead of filtering files(). ensureMissingDirectoriesExist() should not synthesize .meta directory entries either.
Callers to check: AssetContainer::metaFiles() / metaFilesIn() (src/Assets/AssetContainer.php:376), AssetsMetaClean (src/Console/Commands/AssetsMetaClean.php:85), Asset::metaExists(), and AssetContainerContents::add() / forget() which currently insert meta paths into the list on write.
Tests in tests/Assets/AssetContainerContentsTest.php (or wherever the listing is covered): cached listing contains no .meta entries; metaFilesIn() still returns the right files for root, a folder, and recursive; assets:meta-clean still finds orphaned meta. Existing filteredFilesIn() tests should pass unchanged.
Related: #11998 moves meta off the container disk entirely, which would make this moot for sites that opt in, but the default layout still benefits. Companion issue: Asset::exists() loading the full listing.
Activity