Ejemplo n.º 1
0
        public async Task MigrateAsync()
        {
            var version = 0;

            try
            {
                var lastMigrator = migrations.FirstOrDefault();

                while (!await migrationStatus.TryLockAsync())
                {
                    log.LogInformation(w => w
                                       .WriteProperty("action", "Migrate")
                                       .WriteProperty("mesage", $"Waiting {LockWaitMs}ms to acquire lock."));

                    await Task.Delay(LockWaitMs);
                }

                version = await migrationStatus.GetVersionAsync();

                if (lastMigrator != null && lastMigrator.ToVersion != version)
                {
                    var migrationPath = FindMigratorPath(version, lastMigrator.ToVersion).ToList();

                    var previousMigrations = new List <IMigration>();

                    foreach (var migration in migrationPath)
                    {
                        var name = migration.GetType().ToString();

                        log.LogInformation(w => w
                                           .WriteProperty("action", "Migration")
                                           .WriteProperty("status", "Started")
                                           .WriteProperty("migrator", name));

                        using (log.MeasureInformation(w => w
                                                      .WriteProperty("action", "Migration")
                                                      .WriteProperty("status", "Completed")
                                                      .WriteProperty("migrator", name)))
                        {
                            await migration.UpdateAsync(previousMigrations.ToList());

                            version = migration.ToVersion;
                        }

                        previousMigrations.Add(migration);
                    }
                }
            }
            finally
            {
                await migrationStatus.UnlockAsync(version);
            }
        }
Ejemplo n.º 2
0
        public async Task MigrateAsync()
        {
            var version = 0;

            try
            {
                while (!await migrationStatus.TryLockAsync())
                {
                    log.LogInformation(w => w
                                       .WriteProperty("action", "Migrate")
                                       .WriteProperty("mesage", $"Waiting {LockWaitMs}ms to acquire lock."));

                    await Task.Delay(LockWaitMs);
                }

                version = await migrationStatus.GetVersionAsync();

                while (true)
                {
                    var migrationStep = migrationPath.GetNext(version);

                    if (migrationStep.Migrations == null || !migrationStep.Migrations.Any())
                    {
                        break;
                    }

                    foreach (var migration in migrationStep.Migrations)
                    {
                        var name = migration.GetType().ToString();

                        log.LogInformation(w => w
                                           .WriteProperty("action", "Migration")
                                           .WriteProperty("status", "Started")
                                           .WriteProperty("migrator", name));

                        using (log.MeasureInformation(w => w
                                                      .WriteProperty("action", "Migration")
                                                      .WriteProperty("status", "Completed")
                                                      .WriteProperty("migrator", name)))
                        {
                            await migration.UpdateAsync();
                        }
                    }

                    version = migrationStep.Version;
                }
            }
            finally
            {
                await migrationStatus.UnlockAsync(version);
            }
        }
Ejemplo n.º 3
0
        private async Task <bool> TryLockAsync(
            CancellationToken ct)
        {
            try
            {
                while (!await migrationStatus.TryLockAsync(ct))
                {
                    log.LogInformation("Could not acquire lock to start migrating. Tryping again in {time}ms.", LockWaitMs);
                    await Task.Delay(LockWaitMs, ct);
                }
            }
            catch (OperationCanceledException)
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 4
0
        private async Task <bool> TryLockAsync(
            CancellationToken ct)
        {
            try
            {
                while (!await migrationStatus.TryLockAsync(ct))
                {
                    log.LogInformation(w => w
                                       .WriteProperty("action", "Migrate")
                                       .WriteProperty("mesage", $"Waiting {LockWaitMs}ms to acquire lock."));

                    await Task.Delay(LockWaitMs, ct);
                }
            }
            catch (OperationCanceledException)
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 5
0
        public async Task MigrateAsync(CancellationToken ct = default)
        {
            var version = 0;

            try
            {
                while (!await migrationStatus.TryLockAsync())
                {
                    log.LogInformation(w => w
                                       .WriteProperty("action", "Migrate")
                                       .WriteProperty("mesage", $"Waiting {LockWaitMs}ms to acquire lock."));

                    await Task.Delay(LockWaitMs, ct);
                }

                version = await migrationStatus.GetVersionAsync();

                while (!ct.IsCancellationRequested)
                {
                    var(newVersion, migrations) = migrationPath.GetNext(version);

                    if (migrations == null || !migrations.Any())
                    {
                        break;
                    }

                    foreach (var migration in migrations)
                    {
                        var name = migration.GetType().ToString();

                        log.LogInformation(w => w
                                           .WriteProperty("action", "Migration")
                                           .WriteProperty("status", "Started")
                                           .WriteProperty("migrator", name));

                        try
                        {
                            using (log.MeasureInformation(w => w
                                                          .WriteProperty("action", "Migration")
                                                          .WriteProperty("status", "Completed")
                                                          .WriteProperty("migrator", name)))
                            {
                                await migration.UpdateAsync();
                            }
                        }
                        catch (Exception ex)
                        {
                            log.LogFatal(ex, w => w
                                         .WriteProperty("action", "Migration")
                                         .WriteProperty("status", "Failed")
                                         .WriteProperty("migrator", name));

                            throw new MigrationFailedException(name, ex);
                        }
                    }

                    version = newVersion;
                }
            }
            finally
            {
                await migrationStatus.UnlockAsync(version);
            }
        }
Ejemplo n.º 6
0
 public MigratorTests()
 {
     A.CallTo(() => status.GetVersionAsync()).Returns(0);
     A.CallTo(() => status.TryLockAsync()).Returns(true);
 }