fix(schema): normalize federation_peers.consecutive_failures to NOT NULL
The column was `integer DEFAULT 0` (nullable) since the initial schema. Counters should not be nullable — the semantics are a count, not an optional measurement. `consecutive_auth_failures` (added later) was correctly declared NOT NULL; tightening `consecutive_failures` to match removes the drift and eliminates the "|null" burden everywhere the value is read. SQLite does not support in-place ALTER … SET NOT NULL, so drizzle-kit cannot auto-generate this. The manual migration uses the standard SQLite recreate pattern (new table + INSERT SELECT + DROP + RENAME + recreate index) under `PRAGMA defer_foreign_keys = ON` so the existing federation_outbox → federation_peers FK survives the swap. The COPY step coalesces any hypothetical NULL to 0 defensively; live probes on both test instances (nova, orbit) showed zero NULL rows so no actual backfill is required. Verified by applying the full migration chain against a copy of the VM's live DB: column ends as `notnull=1 dflt=0`, the peer row is preserved, the unique index on origin is recreated, NULL inserts are rejected, and `PRAGMA foreign_key_check` reports no violations. Server `SanitizedPeer.consecutiveFailures` tightened to `number` to match the new drizzle inference and the shared `FederationPeer` shape. Follow-up #22 from S2S DM unification backlog.
This commit is contained in:
@@ -362,7 +362,7 @@ export const federationPeers = sqliteTable('federation_peers', {
|
||||
status: text('status').notNull().default('active'),
|
||||
lastSeenAt: integer('last_seen_at'),
|
||||
lastFailureAt: integer('last_failure_at'),
|
||||
consecutiveFailures: integer('consecutive_failures').default(0),
|
||||
consecutiveFailures: integer('consecutive_failures').notNull().default(0),
|
||||
consecutiveAuthFailures: integer('consecutive_auth_failures').notNull().default(0),
|
||||
lastSyncedAt: integer('last_synced_at').default(0),
|
||||
remoteMaxUploadSize: integer('remote_max_upload_size'),
|
||||
|
||||
@@ -27,7 +27,7 @@ interface SanitizedPeer {
|
||||
status: string;
|
||||
lastSeenAt: number | null;
|
||||
lastFailureAt: number | null;
|
||||
consecutiveFailures: number | null;
|
||||
consecutiveFailures: number;
|
||||
lastSyncedAt: number | null;
|
||||
createdAt: number;
|
||||
rotationInProgress: boolean;
|
||||
|
||||
Reference in New Issue
Block a user