Fix a race condition around OPFS databases #97
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.
In
web_sqlite_open_factory.dart
, we create a shared mutex derived from the database path when a database is not accessed through shared workers. This is relevant when serving Flutter apps with COOP + COEP headers, because we're able to use a VFS implementation based on OPFS and dedicated workers in that case (so no shared worker is involved).Unfortunately,
web_sqlite_database.dart
allocates its own (anonymous) mutex and passes that as an option to the open factory. This means that the shared mutex isn't used, and two tabs could race to use the database simultaneously, which may cause errors as the VFS runs into blocked sync access handles.Note: A side-effect of this change is that databases with shared workers have no per-tab/client-side lock. This shouldn't be an issue because the shared worker is supposed to hand out leases as well, but it's something to be aware of. This is another improvement though:
exclusive
context in parallel 😬