From fbe7533d4b0d721f6a929d09640c17c7a79a6b12 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Sat, 25 Jan 2020 16:16:34 +0100 Subject: [PATCH] Run database migrations in parallel with the rest of game startup to improve load times. --- Content.Server/EntryPoint.cs | 4 +++- .../Interfaces/IServerPreferencesManager.cs | 3 ++- .../Preferences/ServerPreferencesManager.cs | 15 +++++++++++++-- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Content.Server/EntryPoint.cs b/Content.Server/EntryPoint.cs index 9f5fe35a4f..7a97e2f538 100644 --- a/Content.Server/EntryPoint.cs +++ b/Content.Server/EntryPoint.cs @@ -68,6 +68,8 @@ namespace Content.Server var logManager = IoCManager.Resolve(); logManager.GetSawmill("Storage").Level = LogLevel.Info; + + IoCManager.Resolve().StartInit(); } public override void PostInit() @@ -76,7 +78,7 @@ namespace Content.Server _gameTicker.Initialize(); IoCManager.Resolve().Initialize(); - IoCManager.Resolve().Initialize(); + IoCManager.Resolve().FinishInit(); } public override void Update(ModUpdateLevel level, FrameEventArgs frameEventArgs) diff --git a/Content.Server/Interfaces/IServerPreferencesManager.cs b/Content.Server/Interfaces/IServerPreferencesManager.cs index 71b91af8f9..f63edf8859 100644 --- a/Content.Server/Interfaces/IServerPreferencesManager.cs +++ b/Content.Server/Interfaces/IServerPreferencesManager.cs @@ -5,8 +5,9 @@ namespace Content.Server.Interfaces { public interface IServerPreferencesManager { - void Initialize(); + void FinishInit(); void OnClientConnected(IPlayerSession session); PlayerPreferences GetPreferences(string username); + void StartInit(); } } diff --git a/Content.Server/Preferences/ServerPreferencesManager.cs b/Content.Server/Preferences/ServerPreferencesManager.cs index 064f3ce12d..ee2a76e525 100644 --- a/Content.Server/Preferences/ServerPreferencesManager.cs +++ b/Content.Server/Preferences/ServerPreferencesManager.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Threading.Tasks; using Content.Server.Database; using Content.Server.Interfaces; using Content.Shared.Preferences; @@ -23,8 +24,9 @@ namespace Content.Server.Preferences [Dependency] private readonly IResourceManager _resourceManager; #pragma warning restore 649 private PreferencesDatabase _preferencesDb; + private Task _prefsDbLoadTask; - public void Initialize() + public void StartInit() { _netManager.RegisterNetMessage(nameof(MsgPreferencesAndSettings)); _netManager.RegisterNetMessage(nameof(MsgSelectCharacter), @@ -68,7 +70,16 @@ namespace Content.Server.Preferences var maxCharacterSlots = _configuration.GetCVar("game.maxcharacterslots"); - _preferencesDb = new PreferencesDatabase(dbConfig, maxCharacterSlots); + // Actually loading the preferences database takes a while, + // because EFCore has to initialize and run migrations. + // We load it in the thread pool here and then fetch the .Result in FinishInit. + // This means it'll run in parallel with other loading like prototypes & map load. + _prefsDbLoadTask = Task.Run(() => new PreferencesDatabase(dbConfig, maxCharacterSlots)); + } + + public void FinishInit() + { + _preferencesDb = _prefsDbLoadTask.Result; } private void HandleSelectCharacterMessage(MsgSelectCharacter message)