From bfd15507264d382d8a225da9dc5867faa8375737 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Thu, 26 Mar 2026 23:20:05 +0100 Subject: [PATCH] feat(migrate): reset federation sync checkpoint for legacy DM replication Adds migrateResetFederationSyncForLegacyDms which resets last_synced_at=0 on all active federation peers so the S2S sync worker re-pulls all mutation log entries (including newly-backfilled legacy DMs) on next server startup. A legacy_dm_sync_done flag on instance_settings ensures this runs exactly once. --- packages/server/src/db/migrate.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/server/src/db/migrate.ts b/packages/server/src/db/migrate.ts index a960edc6..f37b66a6 100644 --- a/packages/server/src/db/migrate.ts +++ b/packages/server/src/db/migrate.ts @@ -610,6 +610,8 @@ export function runMigrations(db: Database.Database): void { console.error('Federation mutation log backfill failed (non-fatal):', err); } + migrateResetFederationSyncForLegacyDms(db); + console.log('Migrations complete.'); } @@ -1592,3 +1594,31 @@ function migrateFixOneOnOneOwnerIds(db: Database.Database): void { console.error('migrateFixOneOnOneOwnerIds failed (non-fatal):', err); } } + +/** Reset federation sync checkpoint so legacy DMs get replicated via S2S */ +function migrateResetFederationSyncForLegacyDms(db: Database.Database): void { + try { + const peersTable = db.prepare(`PRAGMA table_info(federation_peers)`).all() as Array<{ name: string }>; + if (peersTable.length === 0) return; // No federation tables yet + + const hasSyncFlag = (db.pragma('table_info(instance_settings)') as Array<{ name: string }>) + .some(c => c.name === 'legacy_dm_sync_done'); + + if (!hasSyncFlag) { + db.exec(`ALTER TABLE instance_settings ADD COLUMN legacy_dm_sync_done INTEGER DEFAULT 0`); + } + + const settings = db.prepare('SELECT legacy_dm_sync_done FROM instance_settings WHERE id = 1').get() as { legacy_dm_sync_done: number } | undefined; + if (settings?.legacy_dm_sync_done) return; // Already ran + + const result = db.prepare(`UPDATE federation_peers SET last_synced_at = 0 WHERE status = 'active'`).run(); + + if (result.changes > 0) { + console.log(`[migrate] Reset sync checkpoint on ${result.changes} federation peer(s) for legacy DM replication`); + } + + db.prepare('UPDATE instance_settings SET legacy_dm_sync_done = 1 WHERE id = 1').run(); + } catch (err) { + console.error('migrateResetFederationSyncForLegacyDms failed (non-fatal):', err); + } +}