@@ -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