blob: ee584b0ef11024d431724a9b9c1b9e5ac2339e7a [file] [log] [blame] [view]
# PIP-286: Support get position based on timestamp with topic compaction
# Background knowledge
In https://github.com/apache/pulsar/pull/11139 we support get position based on timestamp, but it doesn't work well with topic compaction enabled because the data may have been move to the compacted ledger.
In [PIP-278](https://github.com/apache/pulsar/pull/20624) we introduced the pluggable topic compaction service to extend the compaction.
# Motivation
In order for `get-message-id` to work well with topic compaction enabled we need to find the position according to publish time from topic compaction service,
but `TopicCompactionService` missing a method that find positions according to publish time or other metadata, so we should add it.
In addition, this method can also be used to find the position/offset according to offset/timestamp in the KoP.
# Goals
# High Level Design
We need to add a method to `Topic Compaction Service` that can find the matching position and other metadata information according to publishTime/index,
since the `TopicCompactionService` interface already has `@InterfaceStability.Evolving` annotation, so that we are able to add new methods directly.
# Detailed Design
Add `findEntryByPublishTime` in the `TopicCompactionService` API.
Add `findEntryByEntryIndex` in the `TopicCompactionService` API.
Implement them in the `PulsarTopicCompactionService` using binary search.
When get messageId by timestamp, find position from topicCompactionService if we can't find position in the manageLedger.
## Public-facing Changes
```java
@InterfaceAudience.Public
@InterfaceStability.Evolving
public interface TopicCompactionService extends AutoCloseable {
/**
* Find the first entry that greater or equal to target publishTime.
*
* @param publishTime the publish time of entry.
* @return the first entry that greater or equal to target publishTime, this entry can be null.
*/
CompletableFuture<Entry> findEntryByPublishTime(long publishTime);
/**
* Find the first entry that greater or equal to target entryIndex.
*
* @param entryIndex the index of entry.
* @return the first entry that greater or equal to target entryIndex, this entry can be null.
*/
CompletableFuture<Entry> findEntryByEntryIndex(long entryIndex);
}
```
# Links
* Mailing List discussion thread: https://lists.apache.org/thread/85o3sx6rhohvc370j4r7yd2nb1tx736c
* Mailing List voting thread: https://lists.apache.org/thread/q27zg49mpr8otwh29s3sncdcx8ly7ws6