codelipenghui commented on code in PR #21945:
URL: https://github.com/apache/pulsar/pull/21945#discussion_r1469448666


##########
pulsar-client/src/main/java/org/apache/pulsar/client/impl/MultiTopicsConsumerImpl.java:
##########
@@ -775,25 +776,44 @@ public CompletableFuture<Void> seekAsync(MessageId 
messageId) {
             );
         }
 
-        final CompletableFuture<Void> seekFuture;
         if (internalConsumer == null) {
-            List<CompletableFuture<Void>> futures = new 
ArrayList<>(consumers.size());
-            consumers.values().forEach(consumerImpl -> 
futures.add(consumerImpl.seekAsync(messageId)));
-            seekFuture = FutureUtil.waitForAll(futures);
+            return seekAllAsync(consumer -> consumer.seekAsync(messageId));
         } else {
-            seekFuture = internalConsumer.seekAsync(messageId);
+            beforeSeek();
+            final CompletableFuture<Void> future = new CompletableFuture<>();
+            internalConsumer.seekAsync(messageId).whenComplete((__, e) -> 
afterSeek(future, e));
+            return future;
         }
+    }
 
+    @Override
+    public CompletableFuture<Void> seekAsync(long timestamp) {
+        return seekAllAsync(consumer -> consumer.seekAsync(timestamp));
+    }
+
+    private CompletableFuture<Void> seekAllAsync(Function<ConsumerImpl<T>, 
CompletableFuture<Void>> seekFunc) {
+        beforeSeek();
+        final CompletableFuture<Void> future = new CompletableFuture<>();
+        
FutureUtil.waitForAll(consumers.values().stream().map(seekFunc).collect(Collectors.toList()))
+                .whenComplete((__, e) -> afterSeek(future, e));
+        return future;
+    }
+
+    private void beforeSeek() {

Review Comment:
   Do we need to call `resetIncomingMessageSize();` in this method?
   I noticed we have called at 
[here](https://github.com/apache/pulsar/pull/21945/files#diff-b1cc861088865a65da05597a90794f9910e0a613fb6eb24e343cec5b5ec7da47L755)
  but it will be removed in this PR.



##########
pulsar-client/src/main/java/org/apache/pulsar/client/impl/MultiTopicsConsumerImpl.java:
##########
@@ -252,7 +258,7 @@ private void receiveMessageFromConsumer(ConsumerImpl<T> 
consumer, boolean batchR
             }
             // Process the message, add to the queue and trigger listener or 
async callback
             messages.forEach(msg -> {
-                if (isValidConsumerEpoch((MessageImpl<T>) msg)) {
+                if (isValidConsumerEpoch((MessageImpl<T>) msg) && !duringSeek) 
{

Review Comment:
   We'd better add a DEBUG level log here to know if the messages were skipped 
during the seek operation. It will help us troubleshoot some problems related 
to the message that was not received from the user's perspective.



##########
pulsar-client/src/main/java/org/apache/pulsar/client/impl/MultiTopicsConsumerImpl.java:
##########
@@ -775,25 +776,44 @@ public CompletableFuture<Void> seekAsync(MessageId 
messageId) {
             );
         }
 
-        final CompletableFuture<Void> seekFuture;
         if (internalConsumer == null) {
-            List<CompletableFuture<Void>> futures = new 
ArrayList<>(consumers.size());
-            consumers.values().forEach(consumerImpl -> 
futures.add(consumerImpl.seekAsync(messageId)));
-            seekFuture = FutureUtil.waitForAll(futures);
+            return seekAllAsync(consumer -> consumer.seekAsync(messageId));
         } else {
-            seekFuture = internalConsumer.seekAsync(messageId);
+            beforeSeek();
+            final CompletableFuture<Void> future = new CompletableFuture<>();
+            internalConsumer.seekAsync(messageId).whenComplete((__, e) -> 
afterSeek(future, e));
+            return future;

Review Comment:
   It looks like we can also use `seekAllAsync()` method by changing the method 
signature to `seekAllAsync(List<Consumer> consumers, (Function<ConsumerImpl<T>, 
CompletableFuture<Void>> seekFunc)`?



##########
pulsar-client/src/main/java/org/apache/pulsar/client/impl/MultiTopicsConsumerImpl.java:
##########
@@ -775,25 +776,44 @@ public CompletableFuture<Void> seekAsync(MessageId 
messageId) {
             );
         }
 
-        final CompletableFuture<Void> seekFuture;
         if (internalConsumer == null) {
-            List<CompletableFuture<Void>> futures = new 
ArrayList<>(consumers.size());
-            consumers.values().forEach(consumerImpl -> 
futures.add(consumerImpl.seekAsync(messageId)));
-            seekFuture = FutureUtil.waitForAll(futures);
+            return seekAllAsync(consumer -> consumer.seekAsync(messageId));
         } else {
-            seekFuture = internalConsumer.seekAsync(messageId);
+            beforeSeek();
+            final CompletableFuture<Void> future = new CompletableFuture<>();
+            internalConsumer.seekAsync(messageId).whenComplete((__, e) -> 
afterSeek(future, e));
+            return future;
         }
+    }
 
+    @Override
+    public CompletableFuture<Void> seekAsync(long timestamp) {
+        return seekAllAsync(consumer -> consumer.seekAsync(timestamp));
+    }
+
+    private CompletableFuture<Void> seekAllAsync(Function<ConsumerImpl<T>, 
CompletableFuture<Void>> seekFunc) {
+        beforeSeek();
+        final CompletableFuture<Void> future = new CompletableFuture<>();
+        
FutureUtil.waitForAll(consumers.values().stream().map(seekFunc).collect(Collectors.toList()))
+                .whenComplete((__, e) -> afterSeek(future, e));
+        return future;
+    }
+
+    private void beforeSeek() {

Review Comment:
   If we need to add it back, we'd better also add a test to cover this case.



-- 
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.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to