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.
This commit is contained in:
Jannis Braun
2026-03-26 23:20:05 +01:00
parent 660505b954
commit bfd1550726
+30
View File
@@ -610,6 +610,8 @@ export function runMigrations(db: Database.Database): void {
console.error('Federation mutation log backfill failed (non-fatal):', err); console.error('Federation mutation log backfill failed (non-fatal):', err);
} }
migrateResetFederationSyncForLegacyDms(db);
console.log('Migrations complete.'); console.log('Migrations complete.');
} }
@@ -1592,3 +1594,31 @@ function migrateFixOneOnOneOwnerIds(db: Database.Database): void {
console.error('migrateFixOneOnOneOwnerIds failed (non-fatal):', err); 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);
}
}