예제 #1
0
        /// <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;
            }
        }
예제 #2
0
        /// <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);
                }
            }
        }