blankensteiner commented on a change in pull request #67:
URL: https://github.com/apache/pulsar-dotpulsar/pull/67#discussion_r552588860



##########
File path: src/DotPulsar/Internal/UnackedMessageTracker.cs
##########
@@ -0,0 +1,101 @@
+namespace DotPulsar.Internal
+{
+    using Abstractions;
+    using DotPulsar.Abstractions;
+    using System;
+    using System.Collections.Concurrent;
+    using System.Diagnostics;
+    using System.Linq;
+    using System.Collections.Generic;
+    using System.Threading;
+    using System.Threading.Tasks;
+
+    public readonly struct AwaitingAck
+    {
+        public MessageId MessageId { get; }
+        public long Timestamp { get; }
+
+        public AwaitingAck(MessageId messageId)
+        {
+            MessageId = messageId;
+            Timestamp = Stopwatch.GetTimestamp();
+        }
+
+        public TimeSpan Elapsed => TimeSpan.FromTicks(
+            (long) ((Stopwatch.GetTimestamp() - Timestamp) / 
(double)Stopwatch.Frequency * TimeSpan.TicksPerSecond));
+    }
+
+    public sealed class UnackedMessageTracker : IUnackedMessageTracker
+    {
+        private readonly TimeSpan _ackTimeout;
+        private readonly TimeSpan _pollingTimeout;
+        private readonly ConcurrentQueue<AwaitingAck> _awaitingAcks;
+        private readonly List<MessageId> _acked;
+        private readonly CancellationTokenSource _cancellationTokenSource;
+
+        
+        public UnackedMessageTracker(TimeSpan ackTimeout, TimeSpan 
pollingTimeout)
+        {
+            _ackTimeout = ackTimeout;
+            _pollingTimeout = pollingTimeout;
+            _awaitingAcks = new ConcurrentQueue<AwaitingAck>();
+            _acked = new List<MessageId>();
+            _cancellationTokenSource = new CancellationTokenSource();
+        }
+
+        public void Add(MessageId messageId)
+        {
+            _awaitingAcks.Enqueue(new AwaitingAck(messageId));
+        }
+
+        public void Ack(MessageId messageId)
+        {
+            // We only need to store the highest cumulative ack we see (if 
there is one)
+            // and the MessageIds not included by that cumulative ack.
+            _acked.Add(messageId);
+        }
+
+        public Task Start(IConsumer consumer, CancellationToken 
cancellationToken = default)
+        {
+            CancellationToken token =
+              CancellationTokenSource.CreateLinkedTokenSource(
+                  _cancellationTokenSource.Token, cancellationToken).Token;
+
+            return Task.Run(async () => {

Review comment:
       Ah, yes, sorry, meant to say that it doesn't make much sense.
   In this case, you have an async method and if people await it, it will block 
no matter if you run the task or not, since you are returning the task.




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to