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:
@@ -360,7 +360,7 @@ Migration flags (internal): `voice_bit_migrated`, `profile_attachments_cleaned`,
|
||||
| status | text NOT NULL | `'active'` | active/pending/awaiting_approval/unreachable/revoked/rejected/needs_attention |
|
||||
| lastSeenAt | integer | | |
|
||||
| lastFailureAt | integer | | |
|
||||
| consecutiveFailures | integer | 0 | >=10 → unreachable (network/5xx failures) |
|
||||
| consecutiveFailures | integer NOT NULL | 0 | >=10 → unreachable (network/5xx failures). Counter — never null. |
|
||||
| consecutiveAuthFailures | integer NOT NULL | 0 | >=5 → needs_attention. Tracked separately from `consecutiveFailures` (network) because auth (401/403) and network failures have different resolution paths. |
|
||||
| lastSyncedAt | integer | 0 | |
|
||||
| remoteMaxUploadSize | integer | | Bytes, from peer |
|
||||
|
||||
Reference in New Issue
Block a user