Beispiel #1
0
        private bool ShouldRunBackupAfterTimerCallback(NextBackup backupInfo, out PeriodicBackup periodicBackup)
        {
            if (_periodicBackups.TryGetValue(backupInfo.TaskId, out periodicBackup) == false)
            {
                // periodic backup doesn't exist anymore
                return(false);
            }

            DatabaseTopology topology;

            using (_serverStore.ContextPool.AllocateOperationContext(out TransactionOperationContext context))
                using (context.OpenReadTransaction())
                    using (var rawRecord = _serverStore.Cluster.ReadRawDatabaseRecord(context, _database.Name))
                    {
                        if (rawRecord == null)
                        {
                            return(false);
                        }

                        topology = rawRecord.GetTopology();
                    }

            var taskStatus = GetTaskStatus(topology, periodicBackup.Configuration);

            return(taskStatus == TaskStatus.ActiveByCurrentNode);
        }
Beispiel #2
0
        private void UpdateTimerInternal(NextBackup nextBackup, bool discardIfDisabled)
        {
            if (Disposed)
            {
                return;
            }

            if (discardIfDisabled && _backupTimer == null)
            {
                return;
            }

            _backupTimer?.Dispose();

            if (_logger.IsOperationsEnabled)
            {
                _logger.Operations($"Next {(nextBackup.IsFull ? "full" : "incremental")} backup is in {nextBackup.TimeSpan.TotalMinutes} minutes.");
            }

            var timer = nextBackup.TimeSpan < _periodicBackupRunner.MaxTimerTimeout
                ? new Timer(_periodicBackupRunner.TimerCallback, nextBackup, nextBackup.TimeSpan, Timeout.InfiniteTimeSpan)
                : new Timer(_periodicBackupRunner.LongPeriodTimerCallback, nextBackup, _periodicBackupRunner.MaxTimerTimeout, Timeout.InfiniteTimeSpan);

            _backupTimer = new BackupTimer
            {
                Timer      = timer,
                CreatedAt  = DateTime.UtcNow,
                NextBackup = nextBackup
            };
        }
Beispiel #3
0
        private void StartBackupTaskAndRescheduleIfNeeded(PeriodicBackup periodicBackup, NextBackup currentBackup)
        {
            try
            {
                CreateBackupTask(periodicBackup, currentBackup.IsFull, currentBackup.DateTime);
            }
            catch (BackupDelayException e)
            {
                if (_logger.IsInfoEnabled)
                {
                    _logger.Info($"Backup task will be retried in {(int)e.DelayPeriod.TotalSeconds} seconds.", e);
                }

                // we'll retry in one minute
                var backupTaskDetails = new NextBackup
                {
                    IsFull   = currentBackup.IsFull,
                    TaskId   = periodicBackup.Configuration.TaskId,
                    DateTime = DateTime.UtcNow.Add(e.DelayPeriod),
                    TimeSpan = e.DelayPeriod
                };

                var timer = new Timer(TimerCallback, backupTaskDetails, backupTaskDetails.TimeSpan, Timeout.InfiniteTimeSpan);
                periodicBackup.UpdateTimer(timer);
            }
        }
Beispiel #4
0
        public void UpdateTimer(NextBackup nextBackup, bool lockTaken, bool discardIfDisabled = false)
        {
            if (nextBackup == null)
            {
                return;
            }

            if (lockTaken == false)
            {
                using (UpdateBackupTask())
                {
                    UpdateTimerInternal(nextBackup, discardIfDisabled);
                }
            }
            else
            {
                UpdateTimerInternal(nextBackup, discardIfDisabled);
            }
        }
Beispiel #5
0
        private void UpdateTimerInternal(NextBackup nextRun)
        {
            if (Configuration.Disabled)
            {
                return;
            }

            _timer?.Dispose();

            if (Logger.IsOperationsEnabled)
            {
                Logger.Operations($"OLAP ETL '{Name}' : Next run is in {nextRun.TimeSpan.TotalMinutes} minutes.");
            }

            var timer = new Timer(_ => _waitForChanges.Set(), state: nextRun, dueTime: nextRun.TimeSpan, period: Timeout.InfiniteTimeSpan);

            _timer = new PeriodicBackup.PeriodicBackup.BackupTimer
            {
                Timer      = timer,
                CreatedAt  = DateTime.UtcNow,
                NextBackup = nextRun
            };
        }