browser-db-sqlite-persistence: closing the leader tab fail-stops follower collections with IndeterminateCommitError
Mantenedores costumam responder em até 1 dia
Ninguém assumiu esta issue ainda.
Avaliação
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Facilidade para iniciantes
- 45/100
- Tipo de issue
- Bug
- Clareza
- Razoavelmente clara
- Status de atividade
- Ativa
- Stack de tecnologia
- playwright, sqlite, typescript
Direção de pesquisa
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.
Escrita pelo modelo de indexação a partir do texto da issue.
Descrição
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.
- Linguagem predominante
- TypeScript
- Estrelas
- 4k
- Forks
- 277
- Merge médio
- 1d 11h
- PRs com merge (30d)
- 148
Preparar o ambiente
- Sem Dockerfile nem arquivo Docker Compose
- Tem um modelo de pull request
- Ler o guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Mais de TanStack/db
-
Dificuldade 1/5 1-3 horas Facilidade para iniciantes 88/100
Mantenedores costumam responder em até 1 dia
-
OfflineExecutor.dispose() never settles pendingTransactionPromisesTalvez livre de novo @Claire-ovo assumiu há 11 dias e não há nenhum pull request aberto. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
TanStack/db#2254 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 78/100
Mantenedores costumam responder em até 1 dia
-
Two @tanstack/db tests time out under CPU load because a cold module import counts against the 5 s default timeoutTalvez já em andamento @jp-knj assumiu há 9 dias. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 82/100
Mantenedores costumam responder em até 1 dia
-
Dificuldade 4/5 3-5 dias Facilidade para iniciantes 48/100
Mantenedores costumam responder em até 1 dia
Todas as issues de TanStack/db
Issues semelhantes
-
Navbar avatar and name stay stale after saving profile changesTalvez já em andamento @alexechoi assumiu hoje. Aberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 76/100
marmelab/atomic-crm#416 ·
Mantenedores costumam responder em até 1 dia
-
feature-request
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 66/100
bluesky-social/social-app#12343 ·
Mantenedores costumam responder em até 1 dia
-
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 68/100
lucide-icons/lucide#5165 ·
Mantenedores costumam responder em até 1 dia
-
[Feature] Preferences - Keep the theme selection popover open after selection for quick previewAberta
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 64/100
marktext/marktext#6033 · 1 comentário ·
Mantenedores costumam responder em até 1 dia
-
area:desktop bug has repro platform:macos
Dificuldade 2/5 1-3 horas Facilidade para iniciantes 62/100
anthropics/claude-code#107903 ·