コード例 #1
0
 public void ExecutePostActions(TransferResults xferResults)
 {
     try
     {
         bool actionSuccess = Plan.Config.OnAfterPlanFinishes(new Models.PlanEventArgs {
             Plan = Plan, OperationResult = xferResults.OverallStatus
         });
         if (!actionSuccess)
         {
             string message = "Post-action did not succeed.";
             throw new FailedToExecuteUserDefinedAction(message);
         }
     }
     catch (Exception)
     {
         throw;
     }
 }
コード例 #2
0
        public async Task WriteAsync_ShouldReturnSumOfWorkersResults_InsertionAndRetryWorkersAreStarted(int insertionWorkers, int retryWorkers)
        {
            // Arrange
            var result = new WorkerResult(3L, 1L);

            _workerFactoryMock.Setup(f => f.RunWorker(It.IsAny <ChannelWriter <ReplaceOneModel <BsonDocument> > >(),
                                                      It.IsAny <ILogger>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(result);
            _workerFactoryMock.Setup(f => f.RunRetryWorker(It.IsAny <ChannelReader <ReplaceOneModel <BsonDocument> > >(),
                                                           It.IsAny <ILogger>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(result);

            var writer = new DocumentsWriter(insertionWorkers, retryWorkers, _fixture.Create <string>(),
                                             _workerFactoryMock.Object, _loggerMock.Object);

            // Act
            var actual = await writer.WriteAsync(CancellationToken.None);

            // Assert
            var expected = new TransferResults(result.Successful * insertionWorkers, result.Successful * retryWorkers,
                                               result.Failed * (insertionWorkers + retryWorkers));

            actual.Should().Be(expected);
        }
コード例 #3
0
        protected void RegisterResultsEventHandlers(Models.Restore restore, TransferResults results)
        {
            RestoredFileRepository daoRestoredFile = new RestoredFileRepository();
            BackupedFileRepository daoBackupedFile = new BackupedFileRepository();

            results.Failed += (object sender, TransferFileProgressArgs args) =>
            {
                Models.RestoredFile restoredFile = daoRestoredFile.GetByRestoreAndPath(restore, args.FilePath);
                restoredFile.TransferStatus = TransferStatus.FAILED;
                restoredFile.UpdatedAt      = DateTime.UtcNow;
                daoRestoredFile.Update(restoredFile);

                var message = string.Format("Failed {0} - {1}", args.FilePath, args.Exception != null ? args.Exception.Message : "Unknown reason");
                Warn(message);
                //StatusInfo.Update(BackupStatusLevel.ERROR, message);
                OnUpdate(new RestoreOperationEvent {
                    Status = RestoreOperationStatus.Updated, Message = message, TransferStatus = TransferStatus.FAILED
                });
            };
            results.Canceled += (object sender, TransferFileProgressArgs args) =>
            {
                Models.RestoredFile restoredFile = daoRestoredFile.GetByRestoreAndPath(restore, args.FilePath);
                restoredFile.TransferStatus = TransferStatus.CANCELED;
                restoredFile.UpdatedAt      = DateTime.UtcNow;
                daoRestoredFile.Update(restoredFile);

                var message = string.Format("Canceled {0} - {1}", args.FilePath, args.Exception != null ? args.Exception.Message : "Unknown reason");
                Warn(message);
                //StatusInfo.Update(BackupStatusLevel.ERROR, message);
                OnUpdate(new RestoreOperationEvent {
                    Status = RestoreOperationStatus.Updated, Message = message, TransferStatus = TransferStatus.CANCELED
                });
            };
            results.Completed += (object sender, TransferFileProgressArgs args) =>
            {
                Models.RestoredFile restoredFile = daoRestoredFile.GetByRestoreAndPath(restore, args.FilePath);
                restoredFile.TransferStatus = TransferStatus.COMPLETED;
                restoredFile.UpdatedAt      = DateTime.UtcNow;
                daoRestoredFile.Update(restoredFile);

                // Only set original modified date if the restored file is the latest version whose transfer is completed,
                // otherwise, keep the date the OS/filesystem gave it.
                bool isLatestVersion = daoBackupedFile.IsLatestVersion(restoredFile.BackupedFile);
                if (isLatestVersion)
                {
                    // Set original LastWriteTime so this file won't be erroneously included in the next Backup.
                    FileManager.SafeSetFileLastWriteTimeUtc(restoredFile.File.Path, restoredFile.BackupedFile.FileLastWrittenAt);
                }
                else
                {
                    // Keep the original LastWriteTime so this file will be included in the next backup.
                }

                var message = string.Format("Completed {0}", args.FilePath);
                Info(message);
                OnUpdate(new RestoreOperationEvent {
                    Status = RestoreOperationStatus.Updated, Message = message, TransferStatus = TransferStatus.COMPLETED
                });
            };
            results.Started += (object sender, TransferFileProgressArgs args) =>
            {
                Models.RestoredFile restoredFile = daoRestoredFile.GetByRestoreAndPath(restore, args.FilePath);
                restoredFile.TransferStatus = TransferStatus.RUNNING;
                restoredFile.UpdatedAt      = DateTime.UtcNow;
                daoRestoredFile.Update(restoredFile);

                var message = string.Format("Started {0}", args.FilePath);
                Info(message);
                OnUpdate(new RestoreOperationEvent {
                    Status = RestoreOperationStatus.Updated, Message = message
                });
            };
            results.Progress += (object sender, TransferFileProgressArgs args) =>
            {
#if DEBUG
                var message = string.Format("Progress {0}% {1} ({2}/{3} bytes)",
                                            args.PercentDone, args.FilePath, args.TransferredBytes, args.TotalBytes);
                //Info(message);
#endif
                OnUpdate(new RestoreOperationEvent {
                    Status = RestoreOperationStatus.Updated, Message = null
                });
            };
        }
コード例 #4
0
        protected void RegisterResultsEventHandlers(Models.Backup backup, TransferResults results)
        {
            BackupedFileRepository daoBackupedFile = new BackupedFileRepository();

            results.DeleteCompleted += (object sender, DeletionArgs e) =>
            {
                Int64?backupedFileId = (Int64?)e.UserData;
                // TODO(jweyrich): We could get rid of the SELECT and perform just the UPDATE.
                Models.BackupedFile backupedFile = daoBackupedFile.Get(backupedFileId.Value);
                backupedFile.TransferStatus = TransferStatus.PURGED;
                backupedFile.UpdatedAt      = DateTime.UtcNow;
                daoBackupedFile.Update(backupedFile);

                //var message = string.Format("Purged {0}", e.FilePath);
                //Info(message);
                //OnUpdate(new BackupOperationEvent { Status = BackupOperationStatus.Updated, Message = message });
            };
            results.Failed += (object sender, TransferFileProgressArgs args) =>
            {
                Models.BackupedFile backupedFile = daoBackupedFile.GetByBackupAndPath(backup, args.FilePath);
                backupedFile.TransferStatus = TransferStatus.FAILED;
                backupedFile.UpdatedAt      = DateTime.UtcNow;
                daoBackupedFile.Update(backupedFile);

                var message = string.Format("Failed {0} - {1}", args.FilePath, args.Exception != null ? args.Exception.Message : "Unknown reason");
                Warn(message);
                //StatusInfo.Update(BackupStatusLevel.ERROR, message);
                OnUpdate(new BackupOperationEvent {
                    Status = BackupOperationStatus.Updated, Message = message, TransferStatus = TransferStatus.FAILED
                });
            };
            results.Canceled += (object sender, TransferFileProgressArgs args) =>
            {
                Models.BackupedFile backupedFile = daoBackupedFile.GetByBackupAndPath(backup, args.FilePath);
                backupedFile.TransferStatus = TransferStatus.CANCELED;
                backupedFile.UpdatedAt      = DateTime.UtcNow;
                daoBackupedFile.Update(backupedFile);

                var message = string.Format("Canceled {0} - {1}", args.FilePath, args.Exception != null ? args.Exception.Message : "Unknown reason");
                Warn(message);
                //StatusInfo.Update(BackupStatusLevel.ERROR, message);
                OnUpdate(new BackupOperationEvent {
                    Status = BackupOperationStatus.Updated, Message = message, TransferStatus = TransferStatus.CANCELED
                });
            };
            results.Completed += (object sender, TransferFileProgressArgs args) =>
            {
                Models.BackupedFile backupedFile = daoBackupedFile.GetByBackupAndPath(backup, args.FilePath);
                backupedFile.TransferStatus = TransferStatus.COMPLETED;
                backupedFile.UpdatedAt      = DateTime.UtcNow;
                daoBackupedFile.Update(backupedFile);

                var message = string.Format("Completed {0}", args.FilePath);
                Info(message);
                OnUpdate(new BackupOperationEvent {
                    Status = BackupOperationStatus.Updated, Message = message, TransferStatus = TransferStatus.COMPLETED
                });

                Models.BackupPlan plan = Backup.BackupPlan;                 //backupedFile.Backup.BackupPlan;

                if (plan.PurgeOptions != null && plan.PurgeOptions.IsTypeCustom && plan.PurgeOptions.EnabledKeepNumberOfVersions)
                {
                    // Purge the oldest versioned files if the count of versions exceeds the maximum specified for the Backup Plan.
                    IList <Models.BackupedFile> previousVersions = daoBackupedFile.GetCompleteByPlanAndPath(plan, args.FilePath);
                    int found = previousVersions.Count;
                    int keep  = plan.PurgeOptions.NumberOfVersionsToKeep;
                    int diff  = found - keep;
                    if (diff > 0)
                    {
                        // Delete the oldest Count-N versions.
                        List <Models.BackupedFile> versionsToPurge = previousVersions.Skip(keep).ToList();
                        foreach (var vp in versionsToPurge)
                        {
                            DeleteVersionedFile(vp.File.Path, new FileVersion {
                                Version = vp.Version
                            }, vp.Id);
                        }
                    }
                }
            };
            results.Started += (object sender, TransferFileProgressArgs args) =>
            {
                Models.BackupedFile backupedFile = daoBackupedFile.GetByBackupAndPath(backup, args.FilePath);
                backupedFile.TransferStatus = TransferStatus.RUNNING;
                backupedFile.UpdatedAt      = DateTime.UtcNow;
                daoBackupedFile.Update(backupedFile);

                var message = string.Format("Started {0}", args.FilePath);
                Info(message);
                OnUpdate(new BackupOperationEvent {
                    Status = BackupOperationStatus.Updated, Message = message
                });
            };
            results.Progress += (object sender, TransferFileProgressArgs args) =>
            {
#if DEBUG
                var message = string.Format("Progress {0}% {1} ({2}/{3} bytes)",
                                            args.PercentDone, args.FilePath, args.TransferredBytes, args.TotalBytes);
                //Info(message);
#endif
                OnUpdate(new BackupOperationEvent {
                    Status = BackupOperationStatus.Updated, Message = null
                });
            };
        }
コード例 #5
0
        public async Task TransitAsync_ShouldReturnResultFromWriterAndCompleteWithAllStepsOfRestore_CollectionHasLag(TransferResults expectedResults)
        {
            // Arrange
            _collectionPrepareMock.Setup(handler => handler.PrepareCollectionAsync(It.IsAny <IterativeTransitOptions?>(),
                                                                                   It.IsAny <TextStatusNotifier>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(new CollectionPrepareResult(SourceFilter.Empty, 100));
            _workerPoolMock.Setup(pool => pool.WriteAsync(It.IsAny <CancellationToken>())).ReturnsAsync(expectedResults);

            // Act
            var actual = await _handler.TransitAsync(false, default);

            // Assert
            actual.Should().Be(expectedResults);
            _sourceMock.Verify(repository => repository.ReadDocumentsAsync(SourceFilter.Empty,
                                                                           It.IsAny <ChannelWriter <List <ReplaceOneModel <BsonDocument> > > >(), It.IsAny <int>(),
                                                                           It.IsAny <string[]>(), It.IsAny <bool>(), It.IsAny <IDestinationDocumentFinder>(), It.IsAny <CancellationToken>()));
            _workerPoolMock.Verify(pool => pool.WriteAsync(It.IsAny <CancellationToken>()));
        }