Electric progressive: apply and confirm changes to visible rows during the background full sync
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 30/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- typescript
Hướng nghiên cứu
Start with packages/electric-db-collection/src/electric.ts and the progressive witnesses in electric-live-query.test.ts; trace how buffered changes, snapshot metadata, txid evidence, and the atomic swap interact. Use the recovery and descriptor-isolation oracles to check ordering around snapshot xmin, xmax, and xip, then inspect persistence and reset behavior. Done means visible-row changes and their txids are applied before the swap, with no stale rollback or duplicate application, and the stated evidence passes.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Summary
During a progressive collection's background full sync, Electric buffers stream changes and their txids until the atomic swap. #2115 makes a live query over a progressive source ready as soon as its own subset loads. A user can now edit a visible row while the full sync is still running. That mutation's awaitTxId cannot resolve until the swap. If the full sync takes longer than the awaitTxId timeout, the handler throws and the optimistic change rolls back.
The stream starts at once, so Electric receives the confirming change long before the swap. Electric could apply that change and its txid during buffering for rows that the client already shows.
Current behavior
In packages/electric-db-collection/src/electric.ts:
- While
isBufferingInitialSync()is true, change messages go tobufferedMessages. Their txids are not added tonewTxids. The comment says "txids will be extracted during atomic swap". - The atomic swap on the first
up-to-dateapplies the buffered changes, extracts their txids, and then resolves txid waiters throughpublishEvidence.
As a result:
- Confirmation waits for the full sync.
awaitTxId(txid)for a write to a visible row resolves only at the swap. - Visible rows go stale. A ready progressive query shows its subset snapshot rows unchanged until the swap. #2115 records this as a known limit, and
electric-live-query.test.tspins it ("a ready query's rows update only when the full sync completes").
Before #2115, useLiveQuery already rendered rows in this window. Suspense users now reach it too.
Proposal
Apply stream changes during buffering for keys that a subset snapshot already loaded, when the change is newer than that snapshot. Record their txids when the change applies. Keep buffering every other change until the swap.
Electric has the needed pieces:
progressiveSnapshotRowskeeps the snapshot row for a key when a later stream update needs that row as its baseline.- Each
fetchSnapshotreturns snapshot metadata, andisVisibleInSnapshotcan order a txid against it.
The txid must resolve only when its change is visible. If Electric confirms a change that it still buffers, the optimistic state drops and the old snapshot row shows again until the swap.
Questions to settle
- Ordering. A change can be older than, or included in, the snapshot that loaded its key. Use the snapshot's xmin, xmax, and xip list to decide whether to apply the change, skip it as already included, or keep buffering it.
- The swap. The swap must not apply an early-applied change a second time, and it must not move a row back to an older value.
- Keys outside any subset. Changes to keys that no subset loaded stay buffered, so their txids stay unconfirmed until the swap. Decide whether
awaitTxIdshould report this case, or whether a write to a row the client never loaded is outside scope. - Must-refetch. A reset during buffering discards the subset rows. Changes applied early before the reset must follow the reset's truncate rules.
- Persistence. Early-applied changes go through the same commit and receipt path. Check resume metadata and
seenTxidsevidence for persisted collections.
Evidence to add
- Extend the progressive witnesses in
electric-live-query.test.ts. A write to a visible row during buffering must become visible, and itsawaitTxIdmust resolve before the swap. - Flip the pinned freshness test on purpose, and update the limit in
packages/db/src/query/live/ARCHITECTURE.mdand in the #2115 review record. - Add an ordering lane with changes before, inside, and after the loading snapshot, checked against an independent model. The Electric recovery and descriptor-isolation oracles already generate progressive histories and are a good place to start.
- A hostile control: a design that confirms a txid without applying its change must fail at the first checkpoint after confirmation.
Related: #2113, #2115, #2118.
- Ngôn ngữ chính
- TypeScript
- Star
- 3.9k
- Fork
- 272
- Merge trung bình
- 1 ngày 1 giờ
- Pull request đã merge (30 ngày)
- 222
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của TanStack/db
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 38/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Extend the Effect skipInitial oracle lane: ordered windows, includes, failures, and ordinary EffectsĐang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 42/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Progressive collection live queries remain suspended after their requested subset finishes loadingCó thể đã có người làm @KyleAMathews đã nhận hôm nay. Đang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 25/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 5/100
Maintainer thường phản hồi trong vòng 1 ngày
-
browser-db-sqlite-persistence: option to load the wa-sqlite WASM by URL instead of inlined base64Có thể đã có người làm @KyleAMathews đã nhận 2 ngày trước. Đang mở
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
TanStack/db#2101 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
db-ux-design-system/core-web#8461 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Cannot run an integration on windows when power shell is selected as the default profile terminalĐang mởPriority/Blocker Type/Bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
wso2/product-integrator#2767 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 85/100
-
severity:low
Độ khó 1/5 1-3 giờ Mức phù hợp với người mới 84/100
Maintainer thường phản hồi trong vòng 1 ngày