Пример #1
0
        private bool ShouldRunBackupAfterTimerCallback(BackupTaskDetails 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);
        }
Пример #2
0
        private Timer GetTimer(
            PeriodicBackupConfiguration configuration,
            PeriodicBackupStatus backupStatus)
        {
            var nextBackup = GetNextBackupDetails(configuration, backupStatus);

            if (nextBackup == null)
            {
                return(null);
            }

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

            var backupTaskDetails = new BackupTaskDetails
            {
                IsFullBackup = nextBackup.IsFull,
                TaskId       = configuration.TaskId,
                NextBackup   = nextBackup.TimeSpan
            };

            var isValidTimeSpanForTimer = IsValidTimeSpanForTimer(backupTaskDetails.NextBackup);
            var timer = isValidTimeSpanForTimer ?
                        new Timer(TimerCallback, backupTaskDetails, backupTaskDetails.NextBackup, Timeout.InfiniteTimeSpan) :
                        new Timer(LongPeriodTimerCallback, backupTaskDetails, MaxTimerTimeout, Timeout.InfiniteTimeSpan);

            return(timer);
        }
Пример #3
0
        private void StartBackupTaskAndRescheduleIfNeeded(PeriodicBackup periodicBackup, bool isFullBackup)
        {
            try
            {
                CreateBackupTask(periodicBackup, isFullBackup);
            }
            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 BackupTaskDetails
                {
                    IsFullBackup = isFullBackup,
                    TaskId       = periodicBackup.Configuration.TaskId,
                    NextBackup   = e.DelayPeriod
                };

                var timer = new Timer(TimerCallback, backupTaskDetails, backupTaskDetails.NextBackup, Timeout.InfiniteTimeSpan);
                periodicBackup.UpdateTimer(timer);
            }
        }
Пример #4
0
        private bool ShouldRunBackupAfterTimerCallback(BackupTaskDetails backupInfo, out PeriodicBackup periodicBackup)
        {
            if (_periodicBackups.TryGetValue(backupInfo.TaskId, out periodicBackup) == false)
            {
                // periodic backup doesn't exist anymore
                return(false);
            }

            if (periodicBackup.Disposed)
            {
                // this periodic backup was canceled
                return(false);
            }

            var databaseRecord = GetDatabaseRecord();
            var taskStatus     = GetTaskStatus(databaseRecord, periodicBackup.Configuration);

            return(taskStatus == TaskStatus.ActiveByCurrentNode);
        }
Пример #5
0
        private void CreateBackupTask(PeriodicBackup periodicBackup, BackupTaskDetails backupDetails)
        {
            periodicBackup.RunningTask = Task.Run(async() =>
            {
                periodicBackup.BackupStatus = GetBackupStatus(periodicBackup.Configuration.TaskId, periodicBackup.BackupStatus);

                try
                {
                    await RunPeriodicBackup(periodicBackup.Configuration,
                                            periodicBackup.BackupStatus, backupDetails.IsFullBackup);
                }
                finally
                {
                    if (_cancellationToken.IsCancellationRequested == false &&
                        periodicBackup.Disposed == false)
                    {
                        periodicBackup.BackupTimer.Dispose();
                        periodicBackup.BackupTimer = GetTimer(periodicBackup.Configuration, periodicBackup.BackupStatus);
                    }
                }
            }, _database.DatabaseShutdown);
        }