browser-db-sqlite-persistence: closing the leader tab fail-stops follower collections with IndeterminateCommitError
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 45/100
- Tipo di issue
- Bug
- Chiarezza
- Abbastanza chiara
- Stato di attività
- Attiva
- Stack tecnologico
- playwright, sqlite, typescript
Direzione di ricerca
Start by tracing BrowserCollectionCoordinator.assertMutationRouteUnchanged and sendRPC, then follow the persistence runtime paths named in the stack trace: persistAndBroadcastExternalSyncTransactionUnsafe and applyBufferedSyncTransactionUnsafe. Reproduce with two same-origin tabs sharing an OPFS database and close the leader while sync changes arrive. Done means a normal leader close no longer leaves follower collections permanently errored, or the supported reconciliation path is clearly documented.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
With BrowserCollectionCoordinator, closing the leader tab often puts collections in the remaining tab into a permanent error state. The follower's in-flight rpc:applyCommittedTx for a sync-sourced transaction (an Electric change) waits for the closed leader, times out after 10 s, crosses leadership, and rejects with IndeterminateCommitError. The collection fail-stops, and the tab stops getting live rows.
Versions
@tanstack/db0.12.3@tanstack/db-sqlite-persistence-core0.4.7@tanstack/browser-db-sqlite-persistence0.2.32 (OPFS,openBrowserWASQLiteOPFSDatabase)@tanstack/electric-db-collection0.5.8- Chromium (Playwright headless shell), two tabs in one browser context, same origin
Setup
- One OPFS database, shared by the tabs through
BrowserCollectionCoordinator({ dbName })andcreateBrowserWASQLitePersistence({ database, coordinator }). - Seven persisted Electric collections (eager and on-demand), created with
persistedCollectionOptions({ ...electricCollectionOptions(...), persistence, schemaVersion: 1 }).
Steps
- Open tab A. It becomes the leader for every collection.
- Open tab B. Wait until both tabs show live rows.
- Close tab A (
page.close(), a normal close, not a crash). - Keep inserting rows on the server, so that tab B's Electric streams deliver changes.
Observed
3 of 6 runs. About 10 s after tab A closes, tab B logs this (ids shortened):
IndeterminateCommitError: Commit outcome is indeterminate for collection "messages":
rpc:applyCommittedTx:req crossed leadership from 65c2… (term 1) to 2f07… (term 2)
<- Error: RPC rpc:applyCommittedTx:req timed out after 10000ms
at BrowserCollectionCoordinator.assertMutationRouteUnchanged
at BrowserCollectionCoordinator.sendRPC
at async PersistedCollectionRuntime.persistAndBroadcastExternalSyncTransactionUnsafe
at async PersistedCollectionRuntime.applyBufferedSyncTransactionUnsafe
The same error occurred for other collections in other runs, sometimes through flushQueuedHydrationTransactionsUnsafe. The collection stays in error, and every later update() on it throws. While tab A closes, it logs PersistedCollectionDurabilityError ... The page is closing its SQLite connection. In the other 3 runs, tab B took over every leader lock, and sending and receiving continued.
Expected
A normal leader-tab close should not fail-stop the other tab's collections. #1845 makes a leader change during a mutating RPC indeterminate and leaves reconciliation to the application. For a transaction that comes from the sync source, the source can deliver the same changes again from the durable resume offset. So one of these seems possible:
- The closing leader rejects or drains pending RPCs (for example on
pagehide), so the follower does not wait 10 s for a leader that has gone. - For sync-sourced transactions, the runtime reconciles by itself: it re-hydrates and resumes from the persisted offset instead of fail-stopping.
- If the application must reconcile, document how to do it for a sync-sourced collection. Is
collection.cleanup()followed by a new collection the intended path?
Not done
- No standalone reproduction yet. We saw this in an app, driven by Playwright. We can try to reduce it if that helps.
- Lingua principale
- TypeScript
- Stelle
- 3.9k
- Fork
- 272
- Merge medio
- 1g 1h
- PR unite (30g)
- 210
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di TanStack/db
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 5/100
I maintainer di solito rispondono entro 1 giorno
-
browser-db-sqlite-persistence: option to load the wa-sqlite WASM by URL instead of inlined base64Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
electric-db-collection: on-demand + persistence fails after relaunch with "Snapshot requests are not supported in full mode"Forse già presa @KyleAMathews l’ha presa 3 giorni fa. Aperta
Difficoltà 3/5 1-2 giorni Idoneità per principianti 68/100
TanStack/db#2056 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
TanStack/db#1972 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
Issue simili
-
effort:S priority:P2
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
cameri/nostream#811 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
dam-agents/dam#4562 ·
I maintainer di solito rispondono entro 1 giorno
-
bug p3 triaged
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
I maintainer di solito rispondono entro 1 giorno
-
bug javascript P2-medium python release:v3.1
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
adrirubio/claude-deck#546 ·
I maintainer di solito rispondono entro 1 giorno