1 using Microsoft.EntityFrameworkCore;
2 using Microsoft.Extensions.Logging;
6 using System.Threading.Tasks;
10 using Z.EntityFramework.Plus;
35 readonly ILogger<SessionPersistor>
logger;
54 ILogger<SessionPersistor> logger,
55 Api.Models.Instance metadata)
57 this.databaseContextFactory = databaseContextFactory ??
throw new ArgumentNullException(nameof(databaseContextFactory));
58 this.dmbFactory = dmbFactory ??
throw new ArgumentNullException(nameof(dmbFactory));
59 this.processExecutor = processExecutor ??
throw new ArgumentNullException(nameof(processExecutor));
60 this.logger = logger ??
throw new ArgumentNullException(nameof(logger));
61 this.metadata = metadata ??
throw new ArgumentNullException(nameof(metadata));
65 public Task Save(
ReattachInformation reattachInformation, CancellationToken cancellationToken) => databaseContextFactory.UseContext(async (db) =>
67 if (reattachInformation == null)
68 throw new ArgumentNullException(nameof(reattachInformation));
70 logger.LogDebug(
"Saving reattach information: {0}...", reattachInformation);
75 .Where(x => x.CompileJob.Job.Instance.Id == metadata.Id)
76 .DeleteAsync(cancellationToken)
77 .ConfigureAwait(
false);
79 var dbReattachInfo =
new Models.ReattachInformation
83 Port = reattachInformation.
Port,
84 ProcessId = reattachInformation.
ProcessId,
89 db.ReattachInformations.Add(dbReattachInfo);
90 await db.Save(cancellationToken).ConfigureAwait(
false);
94 public async Task<ReattachInformation>
Load(CancellationToken cancellationToken)
96 Models.ReattachInformation result = null;
97 TimeSpan? topicTimeout = null;
98 await databaseContextFactory.UseContext(async (db) =>
100 var dbReattachInfos = await db
101 .ReattachInformations
103 .Where(x => x.CompileJob.Job.Instance.Id == metadata.Id)
104 .Include(x => x.CompileJob)
105 .ToListAsync(cancellationToken).ConfigureAwait(
false);
106 result = dbReattachInfos.FirstOrDefault();
107 if (result ==
default)
110 var timeoutMilliseconds = await db
113 .Where(x => x.Id == metadata.Id)
114 .Select(x => x.DreamDaemonSettings.TopicRequestTimeout)
115 .FirstOrDefaultAsync(cancellationToken)
116 .ConfigureAwait(
false);
118 if (timeoutMilliseconds ==
default)
120 logger.LogCritical(
"Missing TopicRequestTimeout!");
124 topicTimeout = TimeSpan.FromMilliseconds(timeoutMilliseconds.Value);
127 foreach (var reattachInfo
in dbReattachInfos)
131 logger.LogWarning(
"Killing PID {0} associated with extra reattach information...", reattachInfo.ProcessId);
134 using var process = processExecutor.GetProcess(reattachInfo.ProcessId);
139 logger.LogWarning(
"Failed to kill process! Exception: {0}", ex);
143 db.ReattachInformations.Remove(reattachInfo);
147 await db.Save(cancellationToken).ConfigureAwait(
false);
148 }).ConfigureAwait(
false);
150 if (!topicTimeout.HasValue)
152 logger.LogDebug(
"Reattach information not found!");
158 await dmbFactory.FromCompileJob(result.CompileJob, cancellationToken).ConfigureAwait(
false),
161 logger.LogDebug(
"Reattach information loaded: {0}", info);
readonly Api.Models.Instance metadata
The Api.Models.Instance for the SessionPersistor
CompileJob CompileJob
The CompileJob of the .dmb
Handles saving and loading ReattachInformation.
async Task< ReattachInformation > Load(CancellationToken cancellationToken)
Load a saved ReattachInformation.
Use server authentication
readonly IDmbFactory dmbFactory
The IDmbFactory for the SessionPersistor
Factory for scoping usage of IDatabaseContexts. Meant for use by Components
readonly IProcessExecutor processExecutor
The IProcessExecutor for the SessionPersistor.
RebootState
Represents the action to take when /world/Reboot() is called
Factory for IDmbProviders
string AccessIdentifier
Used to identify and authenticate the DreamDaemon instance
SessionPersistor(IDatabaseContextFactory databaseContextFactory, IDmbFactory dmbFactory, IProcessExecutor processExecutor, ILogger< SessionPersistor > logger, Api.Models.Instance metadata)
Construct a SessionPersistor
readonly ILogger< SessionPersistor > logger
The ILogger for the SessionPersistor
For launching IProcess'
readonly IDatabaseContextFactory databaseContextFactory
The IDatabaseContextFactory for the SessionPersistor