diff --git a/build/Version.props b/build/Version.props index 7c296967f1..014fb98062 100644 --- a/build/Version.props +++ b/build/Version.props @@ -4,7 +4,7 @@ 4.15.6 - 4.0.0 + 4.1.0 9.3.0 9.3.1 10.4.1 diff --git a/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs b/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs index f7c04fb5f7..64750b859e 100644 --- a/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs +++ b/src/Tgstation.Server.Host/Components/Deployment/DreamMaker.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Tgstation.Server.Api.Models; using Tgstation.Server.Api.Models.Internal; @@ -16,6 +17,7 @@ using Tgstation.Server.Host.Components.Deployment.Remote; using Tgstation.Server.Host.Components.Events; using Tgstation.Server.Host.Components.Repository; using Tgstation.Server.Host.Components.Session; +using Tgstation.Server.Host.Configuration; using Tgstation.Server.Host.Database; using Tgstation.Server.Host.Extensions; using Tgstation.Server.Host.IO; @@ -93,6 +95,11 @@ namespace Tgstation.Server.Host.Components.Deployment /// readonly ILogger logger; + /// + /// The for . + /// + readonly SessionConfiguration sessionConfiguration; + /// /// The belongs to. /// @@ -147,6 +154,7 @@ namespace Tgstation.Server.Host.Components.Deployment /// The value of . /// The value of . /// The value of . + /// The containing the value of . /// The value of . public DreamMaker( IByondManager byond, @@ -160,6 +168,7 @@ namespace Tgstation.Server.Host.Components.Deployment IRepositoryManager repositoryManager, IRemoteDeploymentManagerFactory remoteDeploymentManagerFactory, ILogger logger, + IOptions sessionConfigurationOptions, Api.Models.Instance metadata) { this.byond = byond ?? throw new ArgumentNullException(nameof(byond)); @@ -173,6 +182,7 @@ namespace Tgstation.Server.Host.Components.Deployment this.repositoryManager = repositoryManager ?? throw new ArgumentNullException(nameof(repositoryManager)); this.remoteDeploymentManagerFactory = remoteDeploymentManagerFactory ?? throw new ArgumentNullException(nameof(remoteDeploymentManagerFactory)); this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); + sessionConfiguration = sessionConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(sessionConfigurationOptions)); this.metadata = metadata ?? throw new ArgumentNullException(nameof(metadata)); deploymentLock = new object(); @@ -825,6 +835,10 @@ namespace Tgstation.Server.Host.Components.Deployment true, true, true); + + if (sessionConfiguration.LowPriorityDeploymentProcesses) + dm.AdjustPriority(false); + int exitCode; using (cancellationToken.Register(() => dm.Terminate())) exitCode = await dm.Lifetime.ConfigureAwait(false); diff --git a/src/Tgstation.Server.Host/Components/Session/SessionControllerFactory.cs b/src/Tgstation.Server.Host/Components/Session/SessionControllerFactory.cs index 7c5f331a04..733bcdb704 100644 --- a/src/Tgstation.Server.Host/Components/Session/SessionControllerFactory.cs +++ b/src/Tgstation.Server.Host/Components/Session/SessionControllerFactory.cs @@ -7,6 +7,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Tgstation.Server.Api; using Tgstation.Server.Api.Models; @@ -17,6 +18,7 @@ using Tgstation.Server.Host.Components.Deployment; using Tgstation.Server.Host.Components.Events; using Tgstation.Server.Host.Components.Interop; using Tgstation.Server.Host.Components.Interop.Bridge; +using Tgstation.Server.Host.Configuration; using Tgstation.Server.Host.Core; using Tgstation.Server.Host.Extensions; using Tgstation.Server.Host.IO; @@ -99,6 +101,11 @@ namespace Tgstation.Server.Host.Components.Session /// readonly ILogger logger; + /// + /// The for the . + /// + readonly SessionConfiguration sessionConfiguration; + /// /// The for the . /// @@ -170,7 +177,8 @@ namespace Tgstation.Server.Host.Components.Session /// The value of . /// The value of . /// The value of . - /// The value of . + /// The containing the value of . + /// The value of . public SessionControllerFactory( IProcessExecutor processExecutor, IByondManager byond, @@ -183,9 +191,10 @@ namespace Tgstation.Server.Host.Components.Session IPlatformIdentifier platformIdentifier, IBridgeRegistrar bridgeRegistrar, IServerPortProvider serverPortProvider, - EventConsumer eventConsumer, + IEventConsumer eventConsumer, ILoggerFactory loggerFactory, ILogger logger, + IOptions sessionConfigurationOptions, Api.Models.Instance instance) { this.processExecutor = processExecutor ?? throw new ArgumentNullException(nameof(processExecutor)); @@ -193,7 +202,6 @@ namespace Tgstation.Server.Host.Components.Session this.topicClientFactory = topicClientFactory ?? throw new ArgumentNullException(nameof(topicClientFactory)); this.cryptographySuite = cryptographySuite ?? throw new ArgumentNullException(nameof(cryptographySuite)); this.assemblyInformationProvider = assemblyInformationProvider ?? throw new ArgumentNullException(nameof(assemblyInformationProvider)); - this.instance = instance ?? throw new ArgumentNullException(nameof(instance)); this.ioManager = ioManager ?? throw new ArgumentNullException(nameof(ioManager)); this.chat = chat ?? throw new ArgumentNullException(nameof(chat)); this.networkPromptReaper = networkPromptReaper ?? throw new ArgumentNullException(nameof(networkPromptReaper)); @@ -203,6 +211,8 @@ namespace Tgstation.Server.Host.Components.Session this.eventConsumer = eventConsumer ?? throw new ArgumentNullException(nameof(eventConsumer)); this.loggerFactory = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory)); this.logger = logger ?? throw new ArgumentNullException(nameof(logger)); + sessionConfiguration = sessionConfigurationOptions?.Value ?? throw new ArgumentNullException(nameof(sessionConfigurationOptions)); + this.instance = instance ?? throw new ArgumentNullException(nameof(instance)); } /// @@ -380,6 +390,14 @@ namespace Tgstation.Server.Host.Components.Session false, apiValidate); + if (apiValidate) + { + if (sessionConfiguration.HighPriorityLiveDreamDaemon) + process.AdjustPriority(true); + } + else if (sessionConfiguration.LowPriorityDeploymentProcesses) + process.AdjustPriority(false); + // If this isnt a staging DD (From a Deployment), fire off an event if (!apiValidate) await eventConsumer.HandleEvent( diff --git a/src/Tgstation.Server.Host/Configuration/ControlPanelConfiguration.cs b/src/Tgstation.Server.Host/Configuration/ControlPanelConfiguration.cs index b58747f24b..e3a5d3a031 100644 --- a/src/Tgstation.Server.Host/Configuration/ControlPanelConfiguration.cs +++ b/src/Tgstation.Server.Host/Configuration/ControlPanelConfiguration.cs @@ -1,6 +1,4 @@ -using System.Collections.Generic; - -namespace Tgstation.Server.Host.Configuration +namespace Tgstation.Server.Host.Configuration { /// /// Configuration options for the web control panel. diff --git a/src/Tgstation.Server.Host/Configuration/SessionConfiguration.cs b/src/Tgstation.Server.Host/Configuration/SessionConfiguration.cs new file mode 100644 index 0000000000..a65090f773 --- /dev/null +++ b/src/Tgstation.Server.Host/Configuration/SessionConfiguration.cs @@ -0,0 +1,23 @@ +namespace Tgstation.Server.Host.Configuration +{ + /// + /// Configuration options for the game sessions. + /// + sealed class SessionConfiguration + { + /// + /// The key for the the resides in. + /// + public const string Section = "Session"; + + /// + /// If the public DreamDaemon instances are set to be above normal priority processes. + /// + public bool HighPriorityLiveDreamDaemon { get; set; } + + /// + /// If the deployment DreamMaker and DreamDaemon instances are set to be below normal priority processes. + /// + public bool LowPriorityDeploymentProcesses { get; set; } + } +} diff --git a/src/Tgstation.Server.Host/Core/Application.cs b/src/Tgstation.Server.Host/Core/Application.cs index f79766ff24..30764018f4 100644 --- a/src/Tgstation.Server.Host/Core/Application.cs +++ b/src/Tgstation.Server.Host/Core/Application.cs @@ -120,6 +120,7 @@ namespace Tgstation.Server.Host.Core services.UseStandardConfig(Configuration); services.UseStandardConfig(Configuration); services.UseStandardConfig(Configuration); + services.UseStandardConfig(Configuration); // enable options which give us config reloading services.AddOptions(); diff --git a/src/Tgstation.Server.Host/appsettings.yml b/src/Tgstation.Server.Host/appsettings.yml index 61040477a7..ebab1c2470 100644 --- a/src/Tgstation.Server.Host/appsettings.yml +++ b/src/Tgstation.Server.Host/appsettings.yml @@ -11,6 +11,9 @@ General: InstanceLimit: 10 ValidInstancePaths: HostApiDocumentation: false +Session: + HighPriorityLiveDreamDaemon: false + LowPriorityDeploymentProcesses: true FileLogging: Directory: Disable: false