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