Ordered window starts two full-source reads after a signalling refetch with no unexpressible page end

Offen
#2,268 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Maintainer antworten meist innerhalb von 1 Tag

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
4/5
Geschätzter Aufwand
1-2 Tage
Anfängerfreundlichkeit
44/100
Issue-Typ
Bug
Klarheit
Größtenteils klar
Aktivitätsstatus
Aktiv
Tech-Stack
typescript

Rechercherichtung

Start with packages/db/tests/query/ordered-work-oracle.property.test.ts and replay seed 2146201763 using the command in the issue. Trace how the joined ordered window handles the signalling refetch and counts full-source requests; the cause is not diagnosed. Done means the replay passes with zero new full-source requests after the refetch, while preserving the oracle's row and work bounds.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

Summary

After one signalling refetch, a joined ordered window with an unindexed source starts two full-source reads. The ordered-work oracle allows none for this history: no page in it ends on a null or NaN rank, so the documented full-source fallback does not apply.

This is a different counterexample from #2221. That one needs a NaN rank, an anti-joined filter, and a descending window, and it exceeds a bound of one. This one has a single row with rank 0, a joined filter, an ascending window, and exceeds a bound of zero.

The failure is on main. A randomized CI campaign found it while testing an unrelated pull request (#2103, which does not change packages/db).

Law

packages/db/tests/query/ordered-work-oracle.property.test.ts, in the eager indexed ordered windows lane: after a signalling refetch, if no page end became unexpressible, the loader starts no new full-source request.

if (signalsRefetch && unexpressiblePageEnds === unexpressibleBefore) {
  expect(
    fullSourceRequests,
    `full-source requests after a signalling refetch at step ${step}`,
  ).toBe(fullSourceBefore)
}

Reproduce

On main at 7e46f81ad, from packages/db:

TANSTACK_DB_ORACLE_SEED=2146201763 npx vitest run --coverage.enabled=false \
  tests/query/ordered-work-oracle.property.test.ts \
  -t "eager indexed ordered windows keeps rows and per-change work bounded for a random or replayed seed"

Result, every run:

AssertionError: full-source requests after a signalling refetch at step 1: expected 2 to be +0

Shrunk counterexample:

{"path":"on-demand","provider":"refetch-signal","latency":"immediate","cancellation":"cooperative","peer":false,"filter":"joined","via":"marker","indexed":false,"direction":"asc","nulls":"first","terms":1,"limit":1,"offset":0,"initial":[],"history":[{"type":"upsert","id":0,"rank":0,"eligible":false}]}

The cause is not diagnosed. The seed was first seen in CI job Test (db-1) for #2103 at cb9db1da1, which reproduced the same counterexample.

Vorherrschende Sprache
TypeScript
Sterne
4k
Forks
277
Ø Merge
1 T. 7 Std.
Gemergte PRs (30 T.)
170

Entwicklungsumgebung

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus TanStack/db

Alle Issues in TanStack/db

Ähnliche Issues

Weitere Issues zu TypeScript

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.