Skip to content

Commit ad79d65

Browse files
committed
RE1-T36 Fixing worker crash
1 parent 6e7f714 commit ad79d65

1 file changed

Lines changed: 47 additions & 14 deletions

File tree

Workers/Resgrid.Workers.Console/Program.cs

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -71,17 +71,16 @@ static async Task Main(string[] args)
7171
services.AddOptions();
7272

7373
var upgradeDatabase = Environment.GetEnvironmentVariable("RESGRID__DODBUPGRADE");
74-
var runDatabaseUpgrade = !String.IsNullOrWhiteSpace(upgradeDatabase) && upgradeDatabase.ToLower() == "true";
74+
var runDatabaseUpgrade = string.Equals(upgradeDatabase, "true", StringComparison.OrdinalIgnoreCase);
75+
services.AddSingleton(new DatabaseUpgradeState(runDatabaseUpgrade));
7576

7677
if (runDatabaseUpgrade)
7778
{
7879
services.AddSingleton<IHostedService, DatabaseUpgradeService>();
7980
}
80-
else
81-
{
82-
services.AddSingleton<IHostedService, QueuesProcessingService>();
83-
services.AddSingleton<IHostedService, ScheduledJobsService>();
84-
}
81+
82+
services.AddSingleton<IHostedService, QueuesProcessingService>();
83+
services.AddSingleton<IHostedService, ScheduledJobsService>();
8584

8685
})
8786
.ConfigureLogging((hostingContext, logging) => {
@@ -197,17 +196,46 @@ private static void SetConnectionString()
197196
}
198197
}
199198

199+
public sealed class DatabaseUpgradeState
200+
{
201+
private readonly TaskCompletionSource<bool> _completionSource = new(TaskCreationOptions.RunContinuationsAsynchronously);
202+
203+
public DatabaseUpgradeState(bool upgradeRequired)
204+
{
205+
if (!upgradeRequired)
206+
_completionSource.TrySetResult(true);
207+
}
208+
209+
public Task WaitForCompletionAsync(CancellationToken cancellationToken)
210+
{
211+
return _completionSource.Task.WaitAsync(cancellationToken);
212+
}
213+
214+
public void MarkCompleted()
215+
{
216+
_completionSource.TrySetResult(true);
217+
}
218+
219+
public void MarkFailed(Exception ex)
220+
{
221+
_completionSource.TrySetException(ex);
222+
}
223+
}
224+
200225
public class QueuesProcessingService : BackgroundService
201226
{
202227
private ILogger _logger;
228+
private readonly DatabaseUpgradeState _databaseUpgradeState;
203229

204-
public QueuesProcessingService(ILogger<QueuesProcessingService> logger)
230+
public QueuesProcessingService(ILogger<QueuesProcessingService> logger, DatabaseUpgradeState databaseUpgradeState)
205231
{
206232
_logger = logger;
233+
_databaseUpgradeState = databaseUpgradeState;
207234
}
208235

209-
protected override Task ExecuteAsync(CancellationToken stoppingToken)
236+
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
210237
{
238+
await _databaseUpgradeState.WaitForCompletionAsync(stoppingToken);
211239
_logger.Log(LogLevel.Information, "Starting Queues Event Watcher");
212240

213241
Task.Run(async () =>
@@ -216,23 +244,27 @@ protected override Task ExecuteAsync(CancellationToken stoppingToken)
216244
await queuesTask.ProcessAsync(new QueuesProcessorCommand(4), null, stoppingToken);
217245
}, stoppingToken);
218246

219-
return Task.CompletedTask;
247+
return;
220248
}
221249
}
222250

223251
public class ScheduledJobsService : BackgroundService
224252
{
225253
private ILogger _logger;
254+
private readonly DatabaseUpgradeState _databaseUpgradeState;
226255
private IQuidjiboClient Client { get; set; }
227256
private QuidjiboBuilder Builder { get; set; }
228257

229-
public ScheduledJobsService(ILogger<ScheduledJobsService> logger)
258+
public ScheduledJobsService(ILogger<ScheduledJobsService> logger, DatabaseUpgradeState databaseUpgradeState)
230259
{
231260
_logger = logger;
261+
_databaseUpgradeState = databaseUpgradeState;
232262
}
233263

234264
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
235265
{
266+
await _databaseUpgradeState.WaitForCompletionAsync(stoppingToken);
267+
236268
var aes = Aes.Create();
237269
var key = string.Join(",", aes.Key);
238270
//System.Console.CancelKeyPress += (s, e) => { cancellationToken..Cancel(); };
@@ -414,12 +446,12 @@ await Client.ScheduleAsync("Weather Alert Import",
414446
public class DatabaseUpgradeService : BackgroundService
415447
{
416448
private ILogger _logger;
417-
private readonly IHostApplicationLifetime _hostApplicationLifetime;
449+
private readonly DatabaseUpgradeState _databaseUpgradeState;
418450

419-
public DatabaseUpgradeService(ILogger<ScheduledJobsService> logger, IHostApplicationLifetime hostApplicationLifetime)
451+
public DatabaseUpgradeService(ILogger<DatabaseUpgradeService> logger, DatabaseUpgradeState databaseUpgradeState)
420452
{
421453
_logger = logger;
422-
_hostApplicationLifetime = hostApplicationLifetime;
454+
_databaseUpgradeState = databaseUpgradeState;
423455
}
424456

425457
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
@@ -442,11 +474,12 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
442474
await UpdateDocumentDatabaseAsync(logger, scope.ServiceProvider);
443475
}
444476

477+
_databaseUpgradeState.MarkCompleted();
445478
_logger.Log(LogLevel.Information, "Completed updating the Resgrid Database!");
446-
_hostApplicationLifetime.StopApplication();
447479
}
448480
catch (Exception ex)
449481
{
482+
_databaseUpgradeState.MarkFailed(ex);
450483
_logger.Log(LogLevel.Error, ex, "There was an error trying to update the Resgrid Database.");
451484
Environment.Exit(1);
452485
}

0 commit comments

Comments
 (0)