fix(core): scope v1 migration event deletion - #41781
Closed
kitlangton wants to merge 1 commit into
Closed
Conversation
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.
What
Scope V1 migration event cleanup to each legacy session instead of deleting the entire
eventtable before session backfill begins.This avoids an unbounded startup write over large event histories and preserves events owned by sessions outside the legacy migration set.
Closes #41739
Before / After
Before: Starting the V1 migration first deleted every row in
eventin one transaction. On a database with hundreds of thousands of event rows, that whole-table write could hold SQLite's writer lock and delay service startup. If a later session checkpoint failed, events for the failed session, not-yet-processed sessions, and unrelated aggregates had already been removed globally.After: Each session checkpoint deletes only rows whose
aggregate_idis the session being migrated. That deletion commits atomically with projection replacement, session backfill, the event-sequence watermark, and the migration cursor. A failed checkpoint rolls all of those changes back, and events for unrelated aggregates remain untouched.How
packages/core/src/database/v1-migration.tsremoves the startup-wideEventTabledelete and performs an aggregate-scoped delete inside the per-session transaction.packages/core/test/v1-migration.test.tsseeds events for a committed session, a failing session, a not-yet-processed session, and a non-legacy aggregate. It verifies only committed legacy sessions lose their events and that rollback and resume preserve the required boundaries.Scope
This does not change V1 transformation rules, checkpoint ordering, migration progress architecture, or service startup lifecycle beyond removing the unbounded event deletion.
Testing
bun run test test/v1-migration.test.ts test/database-migration.test.tsfrompackages/core(31 tests passed)bun typecheckfrompackages/corebun turbo typecheck --concurrency=3(33 packages passed)git diff --checkFlow
sequenceDiagram participant Migration participant SQLite loop Each legacy session Migration->>SQLite: Begin checkpoint transaction Migration->>SQLite: Delete events for this aggregate_id Migration->>SQLite: Replace projection and session state Migration->>SQLite: Overwrite event-sequence watermark Migration->>SQLite: Advance durable cursor alt Session succeeds SQLite-->>Migration: Commit all replacements else Session fails SQLite-->>Migration: Roll back events, projection, watermark, and cursor end end