Skip to content

Commit a28a42a

Browse files
authored
Make database version check more reliable on API install (#284)
1 parent 985d3c7 commit a28a42a

File tree

4 files changed

+61
-46
lines changed

4 files changed

+61
-46
lines changed

cli/internal/install/cloudinstall/helm.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -481,23 +481,29 @@ func (inst *Installer) InstallTyger(ctx context.Context) error {
481481

482482
for _, parsedLine := range parsedLines {
483483
if category, ok := parsedLine["category"].(string); ok {
484-
if category == "Tyger.ControlPlane.Database.Migrations.MigrationRunner[NewerDatabaseVersionsExist]" {
484+
// We are accepting Tyger.ControlPlane.Database.Migrations.MigrationRunner
485+
// as well for backwards compatibility.
486+
switch category {
487+
case "Tyger.ControlPlane.Database.Migrations.DatabaseVersions[NewerDatabaseVersionsExist]",
488+
"Tyger.ControlPlane.Database.Migrations.MigrationRunner[NewerDatabaseVersionsExist]":
485489
log.Ctx(ctx).Warn().Msgf("The database schema should be upgraded. Run `tyger api migrations list` to see the available migrations and `tyger api migrations apply` to apply them.")
486490
found = true
487-
break
488-
}
489491

490-
if category == "Tyger.ControlPlane.Database.Migrations.MigrationRunner[UsingMostRecentDatabaseVersion]" {
492+
case "Tyger.ControlPlane.Database.Migrations.DatabaseVersions[UsingMostRecentDatabaseVersion]",
493+
"Tyger.ControlPlane.Database.Migrations.MigrationRunner[UsingMostRecentDatabaseVersion]":
491494
log.Debug().Msg("Database schema is up to date")
492495
found = true
496+
}
497+
498+
if found {
493499
break
494500
}
495501
}
496502
}
497503
}
498504

499505
if !found {
500-
return errors.New("failed to find expected migration log message")
506+
log.Warn().Msg("Unable to determine if database migrations are required")
501507
}
502508

503509
return nil

cli/internal/install/dockerinstall/migrations.go

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"bytes"
99
"context"
1010
"encoding/json"
11-
"errors"
1211
"fmt"
1312
"io"
1413
"strconv"
@@ -245,8 +244,12 @@ func (inst *Installer) initializeDatabase(ctx context.Context) error {
245244
found := false
246245
for _, parsedLine := range parsedLines {
247246
if category, ok := parsedLine["category"].(string); ok {
247+
// We are accepting Tyger.ControlPlane.Database.Migrations.MigrationRunner
248+
// as well for backwards compatibility.
249+
switch category {
250+
case "Tyger.ControlPlane.Database.Migrations.DatabaseVersions[DatabaseMigrationRequired]",
251+
"Tyger.ControlPlane.Database.Migrations.MigrationRunner[DatabaseMigrationRequired]":
248252

249-
if category == "Tyger.ControlPlane.Database.Migrations.MigrationRunner[DatabaseMigrationRequired]" {
250253
if message, ok := parsedLine["message"].(string); ok {
251254
log.Ctx(ctx).Error().Msg(message)
252255
}
@@ -256,25 +259,27 @@ func (inst *Installer) initializeDatabase(ctx context.Context) error {
256259
return install.ErrAlreadyLoggedError
257260
}
258261
}
259-
}
260262

261-
if category == "Tyger.ControlPlane.Database.Migrations.MigrationRunner[NewerDatabaseVersionsExist]" {
263+
case "Tyger.ControlPlane.Database.Migrations.DatabaseVersions[NewerDatabaseVersionsExist]",
264+
"Tyger.ControlPlane.Database.Migrations.MigrationRunner[NewerDatabaseVersionsExist]":
262265
log.Ctx(ctx).Warn().Msgf("The database schema should be upgraded. Run `tyger api migrations list` to see the available migrations and `tyger api migrations apply` to apply them.")
263266
found = true
264-
break
265-
}
266267

267-
if category == "Tyger.ControlPlane.Database.Migrations.MigrationRunner[UsingMostRecentDatabaseVersion]" {
268+
case "Tyger.ControlPlane.Database.Migrations.DatabaseVersions[UsingMostRecentDatabaseVersion]",
269+
"Tyger.ControlPlane.Database.Migrations.MigrationRunner[UsingMostRecentDatabaseVersion]":
268270
log.Debug().Msg("Database schema is up to date")
269271
found = true
272+
}
273+
274+
if found {
270275
break
271276
}
272277
}
273278
}
274279

275280
if exitCode == 0 {
276281
if !found {
277-
return errors.New("failed to find expected migration log message")
282+
log.Warn().Msg("Unable to determine if database migrations are required")
278283
}
279284
return nil
280285
}

server/ControlPlane/Database/Migrations/DatabaseVersions.cs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,18 +175,22 @@ FROM migrations
175175

176176
public override async Task StartAsync(CancellationToken cancellationToken)
177177
{
178+
var knownVersions = GetKnownVersions();
178179
while (true)
179180
{
180181
if (await DoesMigrationsTableExist(cancellationToken))
181182
{
182183
if (await ReadAndUpdateCachedDatabaseVersion(cancellationToken))
183184
{
184-
if (GetKnownVersions().FirstOrDefault(v => v.minimumSupported) is (var minimumVersion, var _, var _) && CachedCurrentVersion < minimumVersion)
185+
186+
if (knownVersions.FirstOrDefault(v => v.minimumSupported) is (var minimumVersion, var _, var _) && CachedCurrentVersion < minimumVersion)
185187
{
186188
_logger.DatabaseMigrationRequired((int)minimumVersion, (int)CachedCurrentVersion);
187189
throw new DatabaseMigrationRequiredException($"This version of Tyger requires the database to be migrated to at least version {(int)minimumVersion}. The current version is {(int)CachedCurrentVersion}.");
188190
}
189191

192+
await LogCurrentOrAvailableDatabaseVersions(knownVersions, cancellationToken);
193+
190194
break;
191195
}
192196
}
@@ -221,6 +225,36 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
221225
}
222226
}
223227

228+
public async Task LogCurrentOrAvailableDatabaseVersions(List<(DatabaseVersion version, Type migrator, bool isMinimumVersion)> knownVersions, CancellationToken cancellationToken)
229+
{
230+
if (!await DoesMigrationsTableExist(cancellationToken))
231+
{
232+
return;
233+
}
234+
235+
var currentVersion = await ReadCurrentDatabaseVersion(cancellationToken);
236+
if (currentVersion == null)
237+
{
238+
return;
239+
}
240+
241+
if (knownVersions.Any(kv => (int)kv.version > (int)currentVersion))
242+
{
243+
if (knownVersions.FirstOrDefault(v => v.isMinimumVersion) is (var minimumVersion, var _, var _) && currentVersion < minimumVersion)
244+
{
245+
_logger.DatabaseMigrationRequired((int)minimumVersion, (int)currentVersion);
246+
}
247+
else
248+
{
249+
_logger.NewerDatabaseVersionsExist();
250+
}
251+
}
252+
else
253+
{
254+
_logger.UsingMostRecentDatabaseVersion();
255+
}
256+
}
257+
224258
private async Task<bool> ReadAndUpdateCachedDatabaseVersion(CancellationToken cancellationToken)
225259
{
226260
var readVersion = await ReadCurrentDatabaseVersion(cancellationToken);

server/ControlPlane/Database/Migrations/MigrationRunner.cs

Lines changed: 2 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public async Task RunMigrations(bool initOnly, int? targetVersion, bool offline,
5757
if (current != null && initOnly)
5858
{
5959
_logger.DatabaseAlreadyInitialized();
60-
await LogCurrentOrAvailableDatabaseVersions(knownVersions, cancellationToken);
60+
await _databaseVersions.LogCurrentOrAvailableDatabaseVersions(knownVersions, cancellationToken);
6161
return;
6262
}
6363

@@ -161,37 +161,7 @@ await migrator.Apply(_dataSource, migrationLogger, cancellationToken),
161161
}
162162
}
163163

164-
await LogCurrentOrAvailableDatabaseVersions(knownVersions, cancellationToken);
165-
}
166-
167-
private async Task LogCurrentOrAvailableDatabaseVersions(List<(DatabaseVersion version, Type migrator, bool isMinimumVersion)> knownVersions, CancellationToken cancellationToken)
168-
{
169-
if (!await _databaseVersions.DoesMigrationsTableExist(cancellationToken))
170-
{
171-
return;
172-
}
173-
174-
var currentVersion = await _databaseVersions.ReadCurrentDatabaseVersion(cancellationToken);
175-
if (currentVersion == null)
176-
{
177-
return;
178-
}
179-
180-
if (knownVersions.Any(kv => (int)kv.version > (int)currentVersion))
181-
{
182-
if (knownVersions.FirstOrDefault(v => v.isMinimumVersion) is (var minimumVersion, var _, var _) && currentVersion < minimumVersion)
183-
{
184-
_logger.DatabaseMigrationRequired((int)minimumVersion, (int)currentVersion);
185-
}
186-
else
187-
{
188-
_logger.NewerDatabaseVersionsExist();
189-
}
190-
}
191-
else
192-
{
193-
_logger.UsingMostRecentDatabaseVersion();
194-
}
164+
await _databaseVersions.LogCurrentOrAvailableDatabaseVersions(knownVersions, cancellationToken);
195165
}
196166

197167
private async Task GrantAccess(CancellationToken cancellationToken)

0 commit comments

Comments
 (0)