Exemple #1
0
        public async void Upgrade_MarkMigrationAsComplete()
        {
            A.CallTo(() => finder.FindMigrationsForUpgradeAsync(A <IMigrationContext> ._))
            .Returns(Task.FromResult <IList <IMigration> >(new List <IMigration> {
                migration1
            }));

            await runner.UpgradeAsync();

            A.CallTo(() => storage.MarkAsCompleteAsync(context, migration1, A <long> ._)).MustHaveHappened();
        }
Exemple #2
0
        /// <summary>
        /// Upgrade the environment
        /// </summary>
        public virtual async Task UpgradeAsync()
        {
            // 1. Ensure no one else runs migrations (i.e. lock)
            // 2. Find migrations
            // 3. Run each migration
            // 4. Mark successfully run migrations as completed

            using (await appLocker.AcquireAsync(GetLockName(), TimeSpan.FromSeconds(30), TimeSpan.MaxValue))
            {
                logger.LogInformation($"Lock {GetLockName()} acquired");
                var sw = new Stopwatch();

                var context = GetContext();

                foreach (var migration in await finder.FindMigrationsForUpgradeAsync(context))
                {
                    try
                    {
                        logger.LogInformation($"Attempt to run migration {migration.Name}");
                        sw.Restart();
                        await migration.UpgradeAsync(context);

                        sw.Stop();
                        logger.LogInformation($"Succeeded in running {migration.Name}. It took {sw.ElapsedMilliseconds} milliseconds.");

                        await storage.MarkAsCompleteAsync(context, migration, sw.ElapsedMilliseconds);
                    }
                    catch (Exception ex)
                    {
                        sw.Stop();
                        logger.LogCritical(666, ex, $"Failed to run migration {migration.Name} after {sw.ElapsedMilliseconds} milliseconds.");
                        throw new MigrationException($"Failed to run migration {migration.Name}. See inner exception.", ex);
                    }
                }
            }
        }