private async Task <SourceFilter> CreateIterativeFilterAsync(IterativeTransitOptions iterOpts, CancellationToken token) { var(checkpointField, offset, forcedCheckpoint) = iterOpts; if (forcedCheckpoint != null) { _logger.Information("Forced to use checkpoint {ForcedCheckpoint} for collection {Collection}", iterOpts.ForcedCheckpoint, _collectionName); return(new SourceFilter(checkpointField, iterOpts.ForcedCheckpoint)); } _logger.Debug("Fetching last checkpoint for collection {Collection}", _collectionName); var lastCheckpoint = await _destination.FindLastCheckpointAsync(checkpointField, token); if (lastCheckpoint != null) { #pragma warning disable CS8620 lastCheckpoint -= offset; #pragma warning restore CS8620 _logger.Debug("Collection {Collection} will be transferred from checkpoint {LastCheckpoint}", _collectionName, lastCheckpoint); } else { _logger.Warning("Collection {Collection} doesn't have checkpoint", _collectionName); } return(new SourceFilter(checkpointField, lastCheckpoint)); }
public async Task PrepareCollectionAsync_ShouldReturnFilterByLastCheckpointFromDestination_IterativeRestoreWithNotEmptyDestination(DateTime lastCheckpoint) { // Arrange var options = new IterativeTransitOptions("Modified", TimeSpan.Zero, null); _destinationMock.Setup(d => d.FindLastCheckpointAsync("Modified", It.IsAny <CancellationToken>())) .ReturnsAsync(lastCheckpoint); // Act var actual = await _sut.PrepareCollectionAsync(options, _statusNotifierMock.Object, CancellationToken.None); // Assert actual.Filter.Should().Be(new SourceFilter("Modified", lastCheckpoint)); }
public async Task PrepareCollectionAsync_ShouldUpdateProgressWhileCountingLag_IterativeRestore() { // Arrange var options = new IterativeTransitOptions("Modified", TimeSpan.Zero, null); _destinationMock.Setup(d => d.FindLastCheckpointAsync("Modified", It.IsAny <CancellationToken>())) .ReturnsAsync(_fixture.Create <DateTime>()); _sourceMock.Setup(s => s.CountLagAsync(It.IsAny <SourceFilter>(), It.IsAny <CancellationToken>())) .ReturnsAsync(_fixture.Create <int>()); // Act await _sut.PrepareCollectionAsync(options, _statusNotifierMock.Object, CancellationToken.None); // Assert _statusNotifierMock.VerifySet(n => n.Status = "Counting documents..."); }
public async Task PrepareCollectionAsync_ShouldNotPerformAnyDeletionsInDestination_IterativeRestore() { // Arrange var options = new IterativeTransitOptions("Modified", TimeSpan.Zero, null); _destinationMock.Setup(d => d.FindLastCheckpointAsync("Modified", It.IsAny <CancellationToken>())) .ReturnsAsync(_fixture.Create <DateTime>()); _sourceMock.Setup(s => s.CountLagAsync(It.IsAny <SourceFilter>(), It.IsAny <CancellationToken>())) .ReturnsAsync(_fixture.Create <int>()); // Act await _sut.PrepareCollectionAsync(options, _statusNotifierMock.Object, CancellationToken.None); // Assert _destinationMock.Verify(d => d.DeleteAllDocumentsAsync(It.IsAny <CancellationToken>()), Times.Never()); }
public async Task PrepareCollectionAsync_ShouldReturnLagBetweenSourceAndDestination_IterativeRestoreWithNotEmptyDestination(int lag) { // Arrange var options = new IterativeTransitOptions("Modified", TimeSpan.Zero, null); var lastCheckpoint = _fixture.Create <DateTime>(); _destinationMock.Setup(d => d.FindLastCheckpointAsync("Modified", It.IsAny <CancellationToken>())) .ReturnsAsync(lastCheckpoint); _sourceMock.Setup(s => s.CountLagAsync(new SourceFilter("Modified", lastCheckpoint), It.IsAny <CancellationToken>())) .ReturnsAsync(lag); // Act var actual = await _sut.PrepareCollectionAsync(options, _statusNotifierMock.Object, CancellationToken.None); // Assert actual.Count.Should().Be(lag); }
private async Task <CollectionPrepareResult> CheckIterativeCollectionAsync(ITextStatusNotifier progress, IterativeTransitOptions iterOpts, CancellationToken token) { _logger.Debug("Detected iterative transit for collection {Collection} with checkpoint field {Field}", _collectionName, iterOpts.Field); progress.Status = "Searching checkpoint..."; var filter = await CreateIterativeFilterAsync(iterOpts, token); _logger.Debug("Counting how many documents should be transferred"); progress.Status = "Counting documents..."; var count = await _source.CountLagAsync(filter, token); _logger.Debug("Collection {Collection} has lag {Lag:N0}", _collectionName, count); return(new CollectionPrepareResult(filter, count)); }
public record TestTransitOptions(string Database, string Collection, bool FetchKey, IterativeTransitOptions IterativeOptions);