Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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;
            }
        }