/// <inheritdoc /> public async Task MaintenanceAsync(CancellationToken token) { lock (_taskLock) { // are we still running the start? if (!_runningTask?.IsCompleted ?? true) { return; } } var factory = await _persister.BeginWrite(token).ConfigureAwait(false); try { const string configParse = "maintenance.parse"; var lastParse = await _persister.Config.GetConfigValueAsync(configParse, DateTime.MinValue, factory, token).ConfigureAwait(false); // between 3 and 5 hours to prevent running at the same time as others. var randomHours = (new Random(DateTime.UtcNow.Millisecond)).Next(3, 5); if ((DateTime.UtcNow - lastParse).TotalHours > randomHours) { // // Do maintenance work // _logger.Information("Maintenance files/folders parser"); // save the date and commit ... because the parser needs its own factory. await _persister.Config.SetConfigValueAsync(configParse, DateTime.UtcNow, factory, token).ConfigureAwait(false); } _persister.Commit(factory); } catch (Exception e) { _persister.Rollback(factory); _logger.Exception("There was an exception re-parsing the directories.", e); throw; } }
/// <inheritdoc /> public async Task <long> WorkAsync(CancellationToken token) { using (_counter.Start()) { try { // get a factory item var factory = await _persister.BeginWrite(_eventsTimeOutInMs, token).ConfigureAwait(false); return(await WorkAsync(factory, token).ConfigureAwait(false)); } catch (TimeoutException) { // swallow timeout exceptions... return(0); } } }