protected internal async Task <List <BackupRestoreView.RestorePoint> > GetBackupEnumerationsTask(string applicationName, string serviceName, string partitionId, DateTime startDateTime, DateTime endDateTime, bool isLatestRequested, CancellationToken cancellationToken, BRSContinuationToken continuationToken = null, int maxResults = 0) { var storeManager = RecoveryPointManagerFactory.GetRecoveryPointManager(this); if (continuationToken == null) { continuationToken = new BRSContinuationToken(); } var files = storeManager.EnumerateRecoveryPointMetadataFiles(GetRelativeStorePath(applicationName, serviceName, partitionId), startDateTime, endDateTime, isLatestRequested, continuationToken, maxResults); if ((files != null) && (files.Count > 0)) { return(await storeManager.GetRecoveryPointDetailsAsync(files, cancellationToken)); } return(null); }
private async Task DeleteFilesForPartition(string partitionId, DateTime endDateFilter, int minimumNumberOfBackups, BackupStorage storage, string backupPolicyName, bool isCleanupTask = false) { // Design: /** * Need out Two API's from Azure share and file share * 1. List of all backups before a certain date for the partition * 2. Start deleting the files one by one.(one file at a time with some random wait time.) * **/ BackupRestoreTrace.TraceSource.WriteInfo(TraceType, " In DeleteFilesForPartition for partitionId : {0} with endDateFilter {1}", partitionId, endDateFilter); string applicationName = null; string serviceName = null; string partitionID = null; string fabricUri = await UtilityHelper.GetFabricUriFromPartitionId(partitionId, this.timeout, this.tokenSource.Token); var FabricBackupResourceType = UtilityHelper.GetApplicationAndServicePartitionName(fabricUri, out applicationName, out serviceName, out partitionID); Debug.Assert(partitionId == partitionID); var storeManager = RecoveryPointManagerFactory.GetRecoveryPointManager(storage); this.tokenSource.Token.ThrowIfCancellationRequested(); BRSContinuationToken bRSContinuationToken = new BRSContinuationToken(); List <string> allBackupFiles = storeManager.EnumerateRecoveryPointMetadataFiles(storage.GetRelativeStorePath(applicationName, serviceName, partitionId), DateTime.MinValue, DateTime.MaxValue, false, bRSContinuationToken, 0); List <RestorePoint> restorePoints = new List <RestorePoint>(); if ((allBackupFiles != null) && (allBackupFiles.Count > 0)) { restorePoints = await storeManager.GetRecoveryPointDetailsAsync(allBackupFiles, this.tokenSource.Token); } this.tokenSource.Token.ThrowIfCancellationRequested(); int backupCount = allBackupFiles.Count; if (backupCount <= minimumNumberOfBackups) { return; } restorePoints = restorePoints.OrderBy(restorePoint => restorePoint.CreationTimeUtc).ToList(); restorePoints = restorePoints.Where(restorePoint => restorePoint.CreationTimeUtc < endDateFilter).ToList(); restorePoints.Reverse(); bool lastFullBackupFound = false; RetentionMetadata retentionMetadata = await this.RetentionStore.GetValueAsync(backupPolicyName, this.timeout, this.tokenSource.Token); if (isCleanupTask) { lastFullBackupFound = true; } if (!isCleanupTask && retentionMetadata.OnGoingRetentionFile.ContainsKey(partitionId) && retentionMetadata.OnGoingRetentionFile[partitionId] != null) { storeManager.DeleteBackupFiles(retentionMetadata.OnGoingRetentionFile[partitionId]); } foreach (var restorePoint in restorePoints) { this.tokenSource.Token.ThrowIfCancellationRequested(); BackupRestoreTrace.TraceSource.WriteInfo(TraceType, " Trying to Delete Restore point with backupLocation: {0}", restorePoint.BackupLocation); if (!isCleanupTask) { BackupRestoreTrace.TraceSource.WriteInfo(TraceType, " Updating OnGoing RetentionFile in the metadata for backupPolicy : {0} with partitionId : {1} and BackupLocation {2}" , backupPolicyName, partitionId, restorePoint.BackupLocation); retentionMetadata.UpdateOnGoingRetentionFile(partitionId, restorePoint.BackupLocation); await this.RetentionStore.UpdateValueAsync(backupPolicyName, retentionMetadata, this.timeout, this.tokenSource.Token, null); } if (!lastFullBackupFound) { BackupRestoreTrace.TraceSource.WriteInfo(TraceType, " Skipping RestorePoint with location : {0} as full backup is not found", restorePoint.BackupLocation); if (restorePoint.BackupType == BackupOptionType.Full) { BackupRestoreTrace.TraceSource.WriteInfo(TraceType, " Full Backup found so, after restore points after :{0} will be deleted. ", restorePoint.BackupLocation); lastFullBackupFound = true; } } else { if (backupCount <= minimumNumberOfBackups) { break; } if (storeManager.DeleteBackupFiles(restorePoint.BackupLocation)) { BackupRestoreTrace.TraceSource.WriteInfo(TraceType, " Deleted Restore point with backupLocation: {0}", restorePoint.BackupLocation); backupCount--; } else { BackupRestoreTrace.TraceSource.WriteWarning(TraceType, " Not able to delete Restore point with backupLocation: {0}", restorePoint.BackupLocation); } } await IntroduceRandomDelay(); } // Deletion for a partition is completed. if (!isCleanupTask) { BackupRestoreTrace.TraceSource.WriteInfo(TraceType, " Updating OnGoing RetentionFile in the metadata for backupPolicy : {0}", backupPolicyName); retentionMetadata.UpdateOnGoingRetentionFile(partitionId); await this.RetentionStore.UpdateValueAsync(backupPolicyName, retentionMetadata, this.timeout, this.tokenSource.Token, null); } }
internal async Task <List <BackupRestoreView.RestorePoint> > StartGetBackupEnumerationsTask(string applicationName, string serviceName, string partitionId, bool isLatestRequested, CancellationToken cancellationToken, BRSContinuationToken continuationToken, DateTime?startDateTime = null, DateTime?endDateTime = null, int maxResults = 0) { try { if (!startDateTime.HasValue) { startDateTime = DateTime.MinValue; } if (!endDateTime.HasValue) { endDateTime = DateTime.MaxValue; } return(await this.GetBackupEnumerationsTask(applicationName, serviceName, partitionId, startDateTime.Value, endDateTime.Value, isLatestRequested, cancellationToken, continuationToken, maxResults)); } catch (Exception) { throw; } }