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); }
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); }
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); } }
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); }
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); }