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
        public async Task MigrateAsync(
            CancellationToken ct = default)
        {
            if (!await TryLockAsync(ct))
            {
                return;
            }

            try
            {
                var version = await migrationStatus.GetVersionAsync(ct);

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

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

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

                        log.LogInformation("Migration {migration} started.", name);

                        try
                        {
                            var watch = ValueStopwatch.StartNew();

                            await migration.UpdateAsync(ct);

                            log.LogInformation("Migration {migration} completed after {time}ms.", name, watch.Stop());
                        }
                        catch (Exception ex)
                        {
                            log.LogCritical(ex, "Migration {migration} failed.", name);
                            throw new MigrationFailedException(name, ex);
                        }
                    }

                    version = newVersion;

                    await migrationStatus.CompleteAsync(newVersion, ct);
                }
            }
            finally
            {
                await UnlockAsync();
            }
        }
Ejemplo n.º 4
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.º 5
0
 public MigratorTests()
 {
     A.CallTo(() => status.GetVersionAsync()).Returns(0);
     A.CallTo(() => status.TryLockAsync()).Returns(true);
 }
Ejemplo n.º 6
0
        public async Task MigrateAsync(
            CancellationToken ct = default)
        {
            if (!await TryLockAsync(ct))
            {
                return;
            }

            try
            {
                var version = await migrationStatus.GetVersionAsync(ct);

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

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

                    foreach (var migration in migrations)
                    {
                        var name = migration.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(ct);
                            }
                        }
                        catch (Exception ex)
                        {
                            log.LogFatal(ex, w => w
                                         .WriteProperty("action", "Migration")
                                         .WriteProperty("status", "Failed")
                                         .WriteProperty("migrator", name));

                            throw new MigrationFailedException(name, ex);
                        }
                    }

                    version = newVersion;

                    await migrationStatus.CompleteAsync(newVersion, ct);
                }
            }
            finally
            {
                await UnlockAsync();
            }
        }