aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJPVenson <github@jpb.email>2025-04-07 16:59:00 +0200
committerGitHub <noreply@github.com>2025-04-07 08:59:00 -0600
commit04ca27ad075bdab1eae49c43fde1ed6d45c050e4 (patch)
tree449abee43629682b15d280bb0578db0e397a667b
parente1ef4290afd7dddf5fa2f01ef2d6a4093a7898be (diff)
Fix backup not written to correct directory (#13853)
* Fix backup not written to correct directory * Improve restore handling and only restore on actual error * Fix first failed migration not causing a rollback
-rw-r--r--Jellyfin.Server/Migrations/MigrationRunner.cs33
-rw-r--r--src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/SqliteDatabaseProvider.cs4
2 files changed, 30 insertions, 7 deletions
diff --git a/Jellyfin.Server/Migrations/MigrationRunner.cs b/Jellyfin.Server/Migrations/MigrationRunner.cs
index c3a2e1bc4..c223576da 100644
--- a/Jellyfin.Server/Migrations/MigrationRunner.cs
+++ b/Jellyfin.Server/Migrations/MigrationRunner.cs
@@ -149,11 +149,18 @@ namespace Jellyfin.Server.Migrations
}
}
+ List<IMigrationRoutine> databaseMigrations = [];
try
{
foreach (var migrationRoutine in migrationsToBeApplied)
{
logger.LogInformation("Applying migration '{Name}'", migrationRoutine.Name);
+ var isDbMigration = migrationRoutine is IDatabaseMigrationRoutine;
+
+ if (isDbMigration)
+ {
+ databaseMigrations.Add(migrationRoutine);
+ }
try
{
@@ -167,17 +174,31 @@ namespace Jellyfin.Server.Migrations
// Mark the migration as completed
logger.LogInformation("Migration '{Name}' applied successfully", migrationRoutine.Name);
- migrationOptions.Applied.Add((migrationRoutine.Id, migrationRoutine.Name));
- saveConfiguration(migrationOptions);
- logger.LogDebug("Migration '{Name}' marked as applied in configuration.", migrationRoutine.Name);
+ if (!isDbMigration)
+ {
+ migrationOptions.Applied.Add((migrationRoutine.Id, migrationRoutine.Name));
+ saveConfiguration(migrationOptions);
+ logger.LogDebug("Migration '{Name}' marked as applied in configuration.", migrationRoutine.Name);
+ }
}
}
- catch (System.Exception) when (migrationKey is not null && jellyfinDatabaseProvider is not null)
+ catch (Exception) when (migrationKey is not null && jellyfinDatabaseProvider is not null)
{
- logger.LogInformation("Rollback on database as migration reported failure.");
- await jellyfinDatabaseProvider.RestoreBackupFast(migrationKey, CancellationToken.None).ConfigureAwait(false);
+ if (databaseMigrations.Count != 0)
+ {
+ logger.LogInformation("Rolling back database as migrations reported failure.");
+ await jellyfinDatabaseProvider.RestoreBackupFast(migrationKey, CancellationToken.None).ConfigureAwait(false);
+ }
+
throw;
}
+
+ foreach (var migrationRoutine in databaseMigrations)
+ {
+ migrationOptions.Applied.Add((migrationRoutine.Id, migrationRoutine.Name));
+ saveConfiguration(migrationOptions);
+ logger.LogDebug("Migration '{Name}' marked as applied in configuration.", migrationRoutine.Name);
+ }
}
}
}
diff --git a/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/SqliteDatabaseProvider.cs b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/SqliteDatabaseProvider.cs
index e818c3524..bd5631074 100644
--- a/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/SqliteDatabaseProvider.cs
+++ b/src/Jellyfin.Database/Jellyfin.Database.Providers.Sqlite/SqliteDatabaseProvider.cs
@@ -98,7 +98,7 @@ public sealed class SqliteDatabaseProvider : IJellyfinDatabaseProvider
Directory.CreateDirectory(backupFile);
}
- backupFile = Path.Combine(_applicationPaths.DataPath, $"{key}_jellyfin.db");
+ backupFile = Path.Combine(backupFile, $"{key}_jellyfin.db");
File.Copy(path, backupFile);
return Task.FromResult(key);
}
@@ -106,6 +106,8 @@ public sealed class SqliteDatabaseProvider : IJellyfinDatabaseProvider
/// <inheritdoc />
public Task RestoreBackupFast(string key, CancellationToken cancellationToken)
{
+ // ensure there are absolutly no dangling Sqlite connections.
+ SqliteConnection.ClearAllPools();
var path = Path.Combine(_applicationPaths.DataPath, "jellyfin.db");
var backupFile = Path.Combine(_applicationPaths.DataPath, BackupFolderName, $"{key}_jellyfin.db");