public void TryMarkCheckpoint(bool isTimeCheck) { lock (_lock) { var lowest = _outstandingMessages.GetLowestPosition(); //TODO? COMPETING better to make -1? as of now we are inclusive of checkpoint. var lowestBufferedRetry = _streamBuffer.GetLowestRetry(); lowest = Math.Min(lowest, lowestBufferedRetry); if (lowest == int.MinValue) { lowest = _lastKnownMessage; } //no outstanding messages. in this case we can say that the last known //event would be our checkpoint place (we have already completed it) var difference = lowest - _lastCheckPoint; var now = DateTime.Now; var timedifference = now - _lastCheckPointTime; if (timedifference < _settings.CheckPointAfter && difference < _settings.MaxCheckPointCount) { return; } if ((difference >= _settings.MinCheckPointCount && isTimeCheck) || difference >= _settings.MaxCheckPointCount) { _lastCheckPointTime = now; _lastCheckPoint = lowest; _settings.CheckpointWriter.BeginWriteState(lowest); _statistics.SetLastCheckPoint(lowest); } } }
public void TryMarkCheckpoint(bool isTimeCheck) { lock (_lock) { var lowest = _outstandingMessages.GetLowestPosition() - 1; // Subtract 1 from retry and outstanding as those messages have not been processed yet. var lowestBufferedRetry = StreamBuffer.GetLowestRetry() - 1; lowest = Math.Min(lowest, lowestBufferedRetry); if (lowest == long.MaxValue - 1) { lowest = _lastKnownMessage; } if (lowest == -1) { return; } //no outstanding messages. in this case we can say that the last known //event would be our checkpoint place (we have already completed it) var difference = lowest - _lastCheckPoint; var now = DateTime.UtcNow; var timedifference = now - _lastCheckPointTime; if (timedifference < _settings.CheckPointAfter && difference < _settings.MaxCheckPointCount) { return; } if ((difference >= _settings.MinCheckPointCount && isTimeCheck) || difference >= _settings.MaxCheckPointCount) { _lastCheckPointTime = now; _lastCheckPoint = lowest; _settings.CheckpointWriter.BeginWriteState(lowest); _statistics.SetLastCheckPoint(lowest); } } }
public void lowest_retry_doesnt_assume_order() { var buffer = new StreamBuffer(10, 10, -1, true); buffer.AddRetry(BuildMessageAt(Guid.NewGuid(), 4)); buffer.AddRetry(BuildMessageAt(Guid.NewGuid(), 2)); buffer.AddRetry(BuildMessageAt(Guid.NewGuid(), 3)); Assert.AreEqual(2, buffer.GetLowestRetry()); }