diff --git a/src/Core/Abstractions/IStateMigrationService.cs b/src/Core/Abstractions/IStateMigrationService.cs index bdd9164e3..00a162011 100644 --- a/src/Core/Abstractions/IStateMigrationService.cs +++ b/src/Core/Abstractions/IStateMigrationService.cs @@ -4,7 +4,6 @@ namespace Bit.Core.Abstractions { public interface IStateMigrationService { - Task NeedsMigration(); - Task Migrate(); + Task MigrateIfNeededAsync(); } } diff --git a/src/Core/Services/StateMigrationService.cs b/src/Core/Services/StateMigrationService.cs index b7cb938ed..e209d5551 100644 --- a/src/Core/Services/StateMigrationService.cs +++ b/src/Core/Services/StateMigrationService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Bit.Core.Abstractions; using Bit.Core.Enums; @@ -17,6 +18,7 @@ namespace Bit.Core.Services private readonly IStorageService _preferencesStorageService; private readonly IStorageService _liteDbStorageService; private readonly IStorageService _secureStorageService; + private readonly SemaphoreSlim _semaphore; private enum Storage { @@ -31,9 +33,27 @@ namespace Bit.Core.Services _liteDbStorageService = liteDbStorageService; _preferencesStorageService = preferenceStorageService; _secureStorageService = secureStorageService; + + _semaphore = new SemaphoreSlim(1); } - public async Task NeedsMigration() + public async Task MigrateIfNeededAsync() + { + await _semaphore.WaitAsync(); + try + { + if (await IsMigrationNeededAsync()) + { + await PerformMigrationAsync(); + } + } + finally + { + _semaphore.Release(); + } + } + + private async Task IsMigrationNeededAsync() { var lastVersion = await GetLastStateVersionAsync(); if (lastVersion == 0) @@ -45,7 +65,7 @@ namespace Bit.Core.Services return lastVersion < StateVersion; } - public async Task Migrate() + private async Task PerformMigrationAsync() { var lastVersion = await GetLastStateVersionAsync(); switch (lastVersion) diff --git a/src/Core/Services/StateService.cs b/src/Core/Services/StateService.cs index 5e04b6e3c..6617610da 100644 --- a/src/Core/Services/StateService.cs +++ b/src/Core/Services/StateService.cs @@ -1537,11 +1537,8 @@ namespace Bit.Core.Services { if (!_migrationChecked) { - var migrationService = ServiceContainer.Resolve("stateMigrationService"); - if (await migrationService.NeedsMigration()) - { - await migrationService.Migrate(); - } + var migrationService = ServiceContainer.Resolve(); + await migrationService.MigrateIfNeededAsync(); _migrationChecked = true; }