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)