Skip to content

fix(core): scope v1 migration event deletion - #41781

Closed
kitlangton wants to merge 1 commit into
v2from
scoped-event-delete
Closed

fix(core): scope v1 migration event deletion#41781
kitlangton wants to merge 1 commit into
v2from
scoped-event-delete

Conversation

@kitlangton

Copy link
Copy Markdown
Contributor

What

Scope V1 migration event cleanup to each legacy session instead of deleting the entire event table 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 event in 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_id is 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.ts removes the startup-wide EventTable delete and performs an aggregate-scoped delete inside the per-session transaction.
  • The initial progress label now reflects session migration rather than a removed global event-clearing phase.
  • packages/core/test/v1-migration.test.ts seeds 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.ts from packages/core (31 tests passed)
  • bun typecheck from packages/core
  • Push hook: bun turbo typecheck --concurrency=3 (33 packages passed)
  • git diff --check

Flow

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
Loading

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant