Fine-tune SQLite cache handling#130
Open
jsandfordhughescoop wants to merge 1 commit intocalebporzio:mainfrom
Open
Fine-tune SQLite cache handling#130jsandfordhughescoop wants to merge 1 commit intocalebporzio:mainfrom
jsandfordhughescoop wants to merge 1 commit intocalebporzio:mainfrom
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
Summary
This PR fixes a SQLite cache initialisation race in Sushi that could cause
SQLSTATE[HY000]: ... no such tablewhen multiple processes boot the same model against a fresh cache file.Root cause
Sushi previously treated a cache file as valid based on existence + mtime only. During rebuild, it created/truncated the final cache file before running migrations. A concurrent process could then see that file as “fresh” and query it before the table existed.
What changed
file_exists($cachePath) && filesize($cachePath) > 0 && filemtime($dataPath) <= filemtime($cachePath)migrate()against the temp file.rename()temp file to final cache path.test_rebuilds_empty_cache_file_even_when_its_timestamp_is_freshWhy this fixes the error
The final cache path is no longer exposed in an empty/partially-initialised state. Only a fully migrated SQLite file is published via atomic rename, and zero-byte files are never treated as valid cache hits.
Backwards compatibility
No public API changes.
Existing in-memory fallback behaviour is unchanged.