question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

PIP 194 : Pulsar client: seek command add epoch

See original GitHub issue
  • Status: Proposal
  • Authors: Qiang Huang
  • Pull Request:
  • Mailing List discussion:
  • Release:

Motivation

Reader belongs to exclusive subscription type, and it uses nonDurable cursor. After receiving messages, Reader will ack cumulatively immediately. The flowPermits are triggered in multiple scenarios from the client side and it is isolated from seek of Consumer. Therefore, it is possibile that flowPermits will execute after seek from the client side, like the following flow chart.

image

When handleSeek processing is delay from the server side, the MarkDelete position is modified in a wrong way. The expected result is that Readercan re-consume messages from mark delete:(1,1) after seek. But it doesn’t work.

Pulsar read message and seek position is not a synchronous operation, the seek request can’t prevent an in-process entry reading operation. The client-side also has an opportunity to receive messages after the seek position.

Pulsar client make read messages operation and seek position operation synchronized so add an epoch into server and client consumer. After client reader consumer invoke seek , the epoch increase 1 and send seek command carry the epoch and then server consumer will update the epoch. When dispatcher messages to client will carry the epoch which the cursor read at the time. Client consumer will filter the send messages command which is smaller than current epoch. In this way, after the client consumer send seek command successfully, because it has passed the epoch filtering, the consumer will not receive a message with a messageID greater than the user previously seek position.

Current implementation details

CommandSeek Protocal

// Reset an existing consumer to a particular message id
message CommandSeek {
    required uint64 consumer_id = 1;
    required uint64 request_id  = 2;

    optional MessageIdData message_id = 3;
    optional uint64 message_publish_time = 4;
}

CommandMessage

message CommandMessage {
    required uint64 consumer_id       = 1;
    required MessageIdData message_id = 2;
    optional uint32 redelivery_count  = 3 [default = 0];
    repeated int64 ack_set = 4;
    optional uint64 epoch = 5 [default = 0];
}

CommandMessage already add epoch by PIP-84 , when client receive CommandMessage will compare the command epoch and local epoch to handle this command.

Goal

Add epoch into seek command.

API Changes

Protocal change: CommandSeek

// Reset an existing consumer to a particular message id
message CommandSeek {
    required uint64 consumer_id = 1;
    required uint64 request_id  = 2;

    optional MessageIdData message_id = 3;
    optional uint64 message_publish_time = 4;
    optional uint64 consumer_epoch = 5;
}

CommandSeek command add epoch field, when client send seek command to server successfully, the server will change the server consumer epoch to the command epoch. The epoch only can bigger than the old epoch in server. Now the client can filter out the message which contains less consumer epoch.

Implementation

  • stage 1: Check the current cursor status when handling flowPermits from the server side.
  • stage 2: Add epoch into seek command, and server update the consumer epoch. It can prevent an in-process entry reading operation after the seek request.

Reject Alternatives

None yet.

Note

  1. Consumer reconnect need reset epoch.

Issue Analytics

  • State:open
  • Created a year ago
  • Comments:5 (3 by maintainers)

github_iconTop GitHub Comments

1reaction
mattisonchaocommented, Jul 25, 2022

Looks like this PIP can fix the problem https://github.com/apache/pulsar/issues/13788 in the “Reader with seeking” case. Because of the problem described from that PIP, for the reader, its Ack is out of order.

0reactions
github-actions[bot]commented, Sep 11, 2022

The issue had no activity for 30 days, mark with Stale label.

Read more comments on GitHub >

github_iconTop Results From Across the Web

Re: [DISCUSS] PIP 194 : Pulsar client: seek command add epoch
Re: [DISCUSS] PIP 194 : Pulsar client: seek command add epoch ... ://github.com/apache/pulsar/wiki/PIP-84-:-Pulsar-client:-Redeliver-command-add-epoch .
Read more >
Pulsar Python client
Pulsar Python client library is a wrapper over the existing C++ client library and exposes all of the same features. You can find...
Read more >
Board Meeting Minutes - Pulsar - Apache Whimsy
... PIP-194: Pulsar client: seek command add epoch PIP-193: Sink preprocessing Function PIP-192: New Pulsar Broker Load Balancer PIP-191: ...
Read more >
Apache Pulsar 2.10.0
[PIP 79] Add lazy-loading feature to PartitionedProducer #10279; [PIP 84] Pulsar client: Redeliver command add epoch #10478; [PIP 86] Pulsar ...
Read more >
What's New in Apache Pulsar 2.10
Redeliver command add epoch #10478​. Issue: Pull and redeliver operations are asynchronous, so the client consumer may receive a new message ...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found