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));
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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...");
        }
Ejemplo n.º 4
0
        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());
        }
Ejemplo n.º 5
0
        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));
        }
Ejemplo n.º 7
0
 public record TestTransitOptions(string Database,
                                  string Collection,
                                  bool FetchKey,
                                  IterativeTransitOptions IterativeOptions);