mirror of
https://github.com/chylex/Minecraft-Phantom-Panel.git
synced 2025-05-04 09:34:05 +02:00
Fix not seeing instance statuses after restarting Server
This commit is contained in:
parent
9971855bf8
commit
dd0d9b3ddb
Agent/Phantom.Agent.Services
@ -18,12 +18,6 @@ sealed class Instance : IDisposable {
|
||||
return prefix[..prefix.IndexOf('-')] + "/" + Interlocked.Increment(ref loggerSequenceId);
|
||||
}
|
||||
|
||||
public static Instance Create(InstanceConfiguration configuration, InstanceServices services, BaseLauncher launcher) {
|
||||
var instance = new Instance(configuration, services, launcher);
|
||||
instance.SetStatus(instance.currentStatus);
|
||||
return instance;
|
||||
}
|
||||
|
||||
public InstanceConfiguration Configuration { get; private set; }
|
||||
private InstanceServices Services { get; }
|
||||
private BaseLauncher Launcher { get; set; }
|
||||
@ -41,7 +35,7 @@ sealed class Instance : IDisposable {
|
||||
|
||||
public event EventHandler? IsRunningChanged;
|
||||
|
||||
private Instance(InstanceConfiguration configuration, InstanceServices services, BaseLauncher launcher) {
|
||||
public Instance(InstanceConfiguration configuration, InstanceServices services, BaseLauncher launcher) {
|
||||
this.shortName = GetLoggerName(configuration.InstanceGuid);
|
||||
this.logger = PhantomLogger.Create<Instance>(shortName);
|
||||
|
||||
@ -53,17 +47,29 @@ sealed class Instance : IDisposable {
|
||||
this.currentStatus = InstanceStatus.NotRunning;
|
||||
}
|
||||
|
||||
private void SetStatus(IInstanceStatus status) {
|
||||
private void TryUpdateStatus(string taskName, Func<Task> getUpdateTask) {
|
||||
int myStatusUpdateCounter = Interlocked.Increment(ref statusUpdateCounter);
|
||||
|
||||
Services.TaskManager.Run("Report status of instance " + shortName + " as " + status.GetType().Name, async () => {
|
||||
Services.TaskManager.Run(taskName, async () => {
|
||||
if (myStatusUpdateCounter == statusUpdateCounter) {
|
||||
currentStatus = status;
|
||||
await ServerMessaging.Send(new ReportInstanceStatusMessage(Configuration.InstanceGuid, status));
|
||||
await getUpdateTask();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public void ReportLastStatus() {
|
||||
TryUpdateStatus("Report last status of instance " + shortName, async () => {
|
||||
await ServerMessaging.Send(new ReportInstanceStatusMessage(Configuration.InstanceGuid, currentStatus));
|
||||
});
|
||||
}
|
||||
|
||||
private void ReportAndSetStatus(IInstanceStatus status) {
|
||||
TryUpdateStatus("Report status of instance " + shortName + " as " + status.GetType().Name, async () => {
|
||||
currentStatus = status;
|
||||
await ServerMessaging.Send(new ReportInstanceStatusMessage(Configuration.InstanceGuid, status));
|
||||
});
|
||||
}
|
||||
|
||||
private void ReportEvent(IInstanceEvent instanceEvent) {
|
||||
var message = new ReportInstanceEventMessage(Guid.NewGuid(), DateTime.UtcNow, Configuration.InstanceGuid, instanceEvent);
|
||||
Services.TaskManager.Run("Report event for instance " + shortName, async () => await ServerMessaging.Send(message));
|
||||
@ -156,7 +162,7 @@ sealed class Instance : IDisposable {
|
||||
public override string ShortName => instance.shortName;
|
||||
|
||||
public override void SetStatus(IInstanceStatus newStatus) {
|
||||
instance.SetStatus(newStatus);
|
||||
instance.ReportAndSetStatus(newStatus);
|
||||
}
|
||||
|
||||
public override void ReportEvent(IInstanceEvent instanceEvent) {
|
||||
|
@ -71,7 +71,7 @@ sealed class InstanceSessionManager : IDisposable {
|
||||
});
|
||||
}
|
||||
|
||||
public async Task<InstanceActionResult<ConfigureInstanceResult>> Configure(InstanceConfiguration configuration, InstanceLaunchProperties launchProperties, bool launchNow) {
|
||||
public async Task<InstanceActionResult<ConfigureInstanceResult>> Configure(InstanceConfiguration configuration, InstanceLaunchProperties launchProperties, bool launchNow, bool alwaysReportStatus) {
|
||||
return await AcquireSemaphoreAndRun(async () => {
|
||||
var instanceGuid = configuration.InstanceGuid;
|
||||
var instanceFolder = Path.Combine(basePath, instanceGuid.ToString());
|
||||
@ -99,11 +99,17 @@ sealed class InstanceSessionManager : IDisposable {
|
||||
if (instances.TryGetValue(instanceGuid, out var instance)) {
|
||||
await instance.Reconfigure(configuration, launcher, shutdownCancellationToken);
|
||||
Logger.Information("Reconfigured instance \"{Name}\" (GUID {Guid}).", configuration.InstanceName, configuration.InstanceGuid);
|
||||
|
||||
if (alwaysReportStatus) {
|
||||
instance.ReportLastStatus();
|
||||
}
|
||||
}
|
||||
else {
|
||||
instances[instanceGuid] = instance = Instance.Create(configuration, instanceServices, launcher);
|
||||
instance.IsRunningChanged += OnInstanceIsRunningChanged;
|
||||
instances[instanceGuid] = instance = new Instance(configuration, instanceServices, launcher);
|
||||
Logger.Information("Created instance \"{Name}\" (GUID {Guid}).", configuration.InstanceName, configuration.InstanceGuid);
|
||||
|
||||
instance.ReportLastStatus();
|
||||
instance.IsRunningChanged += OnInstanceIsRunningChanged;
|
||||
}
|
||||
|
||||
if (launchNow) {
|
||||
|
@ -33,7 +33,7 @@ public sealed class MessageListener : IMessageToAgentListener {
|
||||
}
|
||||
|
||||
foreach (var configureInstanceMessage in message.InitialInstanceConfigurations) {
|
||||
var result = await HandleConfigureInstance(configureInstanceMessage);
|
||||
var result = await HandleConfigureInstance(configureInstanceMessage, alwaysReportStatus: true);
|
||||
if (!result.Is(ConfigureInstanceResult.Success)) {
|
||||
ShutdownAfterConfigurationFailed(configureInstanceMessage.Configuration);
|
||||
return NoReply.Instance;
|
||||
@ -59,8 +59,12 @@ public sealed class MessageListener : IMessageToAgentListener {
|
||||
return Task.FromResult(NoReply.Instance);
|
||||
}
|
||||
|
||||
private Task<InstanceActionResult<ConfigureInstanceResult>> HandleConfigureInstance(ConfigureInstanceMessage message, bool alwaysReportStatus) {
|
||||
return agent.InstanceSessionManager.Configure(message.Configuration, message.LaunchProperties, message.LaunchNow, alwaysReportStatus);
|
||||
}
|
||||
|
||||
public async Task<InstanceActionResult<ConfigureInstanceResult>> HandleConfigureInstance(ConfigureInstanceMessage message) {
|
||||
return await agent.InstanceSessionManager.Configure(message.Configuration, message.LaunchProperties, message.LaunchNow);
|
||||
return await HandleConfigureInstance(message, alwaysReportStatus: false);
|
||||
}
|
||||
|
||||
public async Task<InstanceActionResult<LaunchInstanceResult>> HandleLaunchInstance(LaunchInstanceMessage message) {
|
||||
|
Loading…
Reference in New Issue
Block a user