diff --git a/extensions/sql-migration/src/models/migrationLocalStorage.ts b/extensions/sql-migration/src/models/migrationLocalStorage.ts index fe59b9820e..9e0f5ee456 100644 --- a/extensions/sql-migration/src/models/migrationLocalStorage.ts +++ b/extensions/sql-migration/src/models/migrationLocalStorage.ts @@ -20,12 +20,14 @@ export class MigrationLocalStorage { const result: MigrationContext[] = []; const validMigrations: MigrationContext[] = []; + // fetch saved migrations const migrationMementos: MigrationContext[] = this.context.globalState.get(this.mementoToken) || []; for (let i = 0; i < migrationMementos.length; i++) { const migration = migrationMementos[i]; migration.migrationContext = this.removeMigrationSecrets(migration.migrationContext); migration.sessionId = migration.sessionId ?? undefinedSessionId; if (migration.sourceConnectionProfile.serverName === connectionProfile.serverName) { + // refresh migration status if (refreshStatus) { try { await this.refreshMigrationAzureAccount(migration); @@ -59,7 +61,25 @@ export class MigrationLocalStorage { } validMigrations.push(migration); } - await this.context.globalState.update(this.mementoToken, validMigrations); + + // only save updated migration context + if (refreshStatus) { + const migrations: MigrationContext[] = this.context.globalState.get(this.mementoToken) || []; + validMigrations.forEach(migration => { + const idx = migrations.findIndex(m => m.migrationContext.id === migration.migrationContext.id); + if (idx > -1) { + migrations[idx] = migration; + } + }); + + // check global state for migrations count mismatch, avoid saving + // state if the count has changed when a migration may have been added + const current: MigrationContext[] = this.context.globalState.get(this.mementoToken) || []; + if (current.length === migrations.length) { + await this.context.globalState.update(this.mementoToken, migrations); + } + } + return result; }