Run database migrations in parallel with the rest of game startup to improve load times.

This commit is contained in:
Pieter-Jan Briers
2020-01-25 16:16:34 +01:00
parent 4a833e82cd
commit fbe7533d4b
3 changed files with 18 additions and 4 deletions

View File

@@ -68,6 +68,8 @@ namespace Content.Server
var logManager = IoCManager.Resolve<ILogManager>(); var logManager = IoCManager.Resolve<ILogManager>();
logManager.GetSawmill("Storage").Level = LogLevel.Info; logManager.GetSawmill("Storage").Level = LogLevel.Info;
IoCManager.Resolve<IServerPreferencesManager>().StartInit();
} }
public override void PostInit() public override void PostInit()
@@ -76,7 +78,7 @@ namespace Content.Server
_gameTicker.Initialize(); _gameTicker.Initialize();
IoCManager.Resolve<ISandboxManager>().Initialize(); IoCManager.Resolve<ISandboxManager>().Initialize();
IoCManager.Resolve<IServerPreferencesManager>().Initialize(); IoCManager.Resolve<IServerPreferencesManager>().FinishInit();
} }
public override void Update(ModUpdateLevel level, FrameEventArgs frameEventArgs) public override void Update(ModUpdateLevel level, FrameEventArgs frameEventArgs)

View File

@@ -5,8 +5,9 @@ namespace Content.Server.Interfaces
{ {
public interface IServerPreferencesManager public interface IServerPreferencesManager
{ {
void Initialize(); void FinishInit();
void OnClientConnected(IPlayerSession session); void OnClientConnected(IPlayerSession session);
PlayerPreferences GetPreferences(string username); PlayerPreferences GetPreferences(string username);
void StartInit();
} }
} }

View File

@@ -1,5 +1,6 @@
using System; using System;
using System.IO; using System.IO;
using System.Threading.Tasks;
using Content.Server.Database; using Content.Server.Database;
using Content.Server.Interfaces; using Content.Server.Interfaces;
using Content.Shared.Preferences; using Content.Shared.Preferences;
@@ -23,8 +24,9 @@ namespace Content.Server.Preferences
[Dependency] private readonly IResourceManager _resourceManager; [Dependency] private readonly IResourceManager _resourceManager;
#pragma warning restore 649 #pragma warning restore 649
private PreferencesDatabase _preferencesDb; private PreferencesDatabase _preferencesDb;
private Task<PreferencesDatabase> _prefsDbLoadTask;
public void Initialize() public void StartInit()
{ {
_netManager.RegisterNetMessage<MsgPreferencesAndSettings>(nameof(MsgPreferencesAndSettings)); _netManager.RegisterNetMessage<MsgPreferencesAndSettings>(nameof(MsgPreferencesAndSettings));
_netManager.RegisterNetMessage<MsgSelectCharacter>(nameof(MsgSelectCharacter), _netManager.RegisterNetMessage<MsgSelectCharacter>(nameof(MsgSelectCharacter),
@@ -68,7 +70,16 @@ namespace Content.Server.Preferences
var maxCharacterSlots = _configuration.GetCVar<int>("game.maxcharacterslots"); var maxCharacterSlots = _configuration.GetCVar<int>("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) private void HandleSelectCharacterMessage(MsgSelectCharacter message)