aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Server/Migrations/MigrationRunner.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Jellyfin.Server/Migrations/MigrationRunner.cs')
-rw-r--r--Jellyfin.Server/Migrations/MigrationRunner.cs75
1 files changed, 75 insertions, 0 deletions
diff --git a/Jellyfin.Server/Migrations/MigrationRunner.cs b/Jellyfin.Server/Migrations/MigrationRunner.cs
new file mode 100644
index 0000000000..ca4c79cfd3
--- /dev/null
+++ b/Jellyfin.Server/Migrations/MigrationRunner.cs
@@ -0,0 +1,75 @@
+using System;
+using System.Linq;
+using MediaBrowser.Common.Configuration;
+using Microsoft.Extensions.Logging;
+
+namespace Jellyfin.Server.Migrations
+{
+ /// <summary>
+ /// The class that knows which migrations to apply and how to apply them.
+ /// </summary>
+ public sealed class MigrationRunner
+ {
+ /// <summary>
+ /// The list of known migrations, in order of applicability.
+ /// </summary>
+ internal static readonly IUpdater[] Migrations =
+ {
+ new Routines.DisableTranscodingThrottling()
+ };
+
+ /// <summary>
+ /// Run all needed migrations.
+ /// </summary>
+ /// <param name="host">CoreAppHost that hosts current version.</param>
+ /// <param name="loggerFactory">Factory for making the logger.</param>
+ public static void Run(CoreAppHost host, ILoggerFactory loggerFactory)
+ {
+ var logger = loggerFactory.CreateLogger<MigrationRunner>();
+ var migrationOptions = ((IConfigurationManager)host.ServerConfigurationManager).GetConfiguration<MigrationOptions>(MigrationsListStore.StoreKey);
+
+ if (!host.ServerConfigurationManager.Configuration.IsStartupWizardCompleted && migrationOptions.Applied.Length == 0)
+ {
+ // If startup wizard is not finished, this is a fresh install.
+ // Don't run any migrations, just mark all of them as applied.
+ logger.LogInformation("Marking all known migrations as applied because this is fresh install");
+ migrationOptions.Applied = Migrations.Select(m => m.Name).ToArray();
+ host.ServerConfigurationManager.SaveConfiguration(MigrationsListStore.StoreKey, migrationOptions);
+ return;
+ }
+
+ var applied = migrationOptions.Applied.ToList();
+
+ for (var i = 0; i < Migrations.Length; i++)
+ {
+ var updater = Migrations[i];
+ if (applied.Contains(updater.Name))
+ {
+ logger.LogDebug("Skipping migration '{Name}' since it is already applied", updater.Name);
+ continue;
+ }
+
+ logger.LogInformation("Applying migration '{Name}'", updater.Name);
+ try
+ {
+ updater.Perform(host, logger);
+ }
+ catch (Exception ex)
+ {
+ logger.LogError(ex, "Could not apply migration '{Name}'", updater.Name);
+ throw;
+ }
+
+ logger.LogInformation("Migration '{Name}' applied successfully", updater.Name);
+ applied.Add(updater.Name);
+ }
+
+ if (applied.Count > migrationOptions.Applied.Length)
+ {
+ logger.LogInformation("Some migrations were run, saving the state");
+ migrationOptions.Applied = applied.ToArray();
+ host.ServerConfigurationManager.SaveConfiguration(MigrationsListStore.StoreKey, migrationOptions);
+ }
+ }
+ }
+}