Shared worker: Immediate reconnect on connection interrupt#937
Open
Shared worker: Immediate reconnect on connection interrupt#937
Conversation
🦋 Changeset detectedLatest commit: 2d72e64 The changes in this PR will be included in the next version bump. This PR includes changesets to release 8 packages
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
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.
When the sync process is managed by the Rust client as part of the SQLite extension, the client's state machine is coupled to the physical SQLite connection.
On the web, the shared sync worker use experience different connections over time as tabs are opened and closed. With the Rust sync client, attempting to handle a sync event on a connection without an active client throws. We recover from these (and all other sync errors) eventually, but it's not ideal:
Issue 1 isn't problematic on its own (we don't really have anything to do without an event so we might as well use a broken connection), but issue 2 also means that we introduce a retry delay on the next checkpoint if it is sent before the next keepalive. This behavior is problematic and we should reconnect immediately to avoid this latency.
This PR fixes both issues: A field stores whether a connection may have been interrupted. If we get an "no iteration active" error from Rust while that field is set, we retry immediately instead of waiting for the retry delay (fixing issue 2). Also, we emit a bogus sync event as soon as the shared worker detects that the database may have been closed (fixing issue 1). This makes the Rust client much more usable on the web.