/// <summary> /// Adds committable offset to existing ones /// </summary> private ICommittableOffsetBatch UpdateWithOffset(ICommittableOffset committableOffset) { var partitionOffset = committableOffset.Offset; var metadata = (committableOffset is ICommittableOffsetMetadata withMetadata) ? withMetadata.Metadata : string.Empty; var newOffsets = OffsetsAndMetadata.SetItem(partitionOffset.GroupTopicPartition, new OffsetAndMetadata(partitionOffset.Offset, metadata)); var committer = committableOffset is CommittableOffset c ? c.Committer : throw new ArgumentException($"Unknown committable offset, got {committableOffset.GetType().Name}, expected {nameof(committableOffset)}"); IImmutableDictionary <string, IInternalCommitter> newCommitters = ImmutableDictionary <string, IInternalCommitter> .Empty; if (Committers.TryGetValue(partitionOffset.GroupId, out var groupCommitter)) { if (!groupCommitter.Equals(committer)) { throw new ArgumentException($"CommittableOffset {committableOffset} committer for groupId {partitionOffset.GroupId} " + $"must be same as the other with this groupId."); } newCommitters = Committers; } else { newCommitters = Committers.SetItem(partitionOffset.GroupId, committer); } return(new CommittableOffsetBatch(newOffsets, newCommitters, BatchSize + 1)); }
/// <inheritdoc /> public async Task Commit() { if (Offsets.IsEmpty() || Committers.IsEmpty()) { return; } await Committers.First().Value.Commit(this); }