@Override
public CompletableFuture<Map<Segment, Long>> getSegmentsAtTime(final Stream stream, final long timestamp) {
Exceptions.checkNotClosed(closed.get(), this);
Preconditions.checkNotNull(stream, "stream");
long traceId = LoggerHelpers.traceEnter(log, "getSegmentsAtTime", stream, timestamp);
final CompletableFuture<SegmentsAtTime> result = this.retryConfig.runAsync(() -> {
RPCAsyncCallback<SegmentsAtTime> callback = new RPCAsyncCallback<>(traceId, "getSegmentsAtTime");
StreamInfo streamInfo = ModelHelper.createStreamInfo(stream.getScope(), stream.getStreamName());
GetSegmentsRequest request = GetSegmentsRequest.newBuilder()
.setStreamInfo(streamInfo)
.setTimestamp(timestamp)
.build();
client.getSegments(request, callback);
return callback.getFuture();
}, this.executor);
return result.thenApply(segments -> {
log.debug("Received the following data from the controller {}", segments.getSegmentsList());
return segments.getSegmentsList()
.stream()
.collect(Collectors.toMap(location -> ModelHelper.encode(location.getSegmentId()),
location -> location.getOffset()));
}).whenComplete((x, e) -> {
if (e != null) {
log.warn("getSegmentsAtTime failed: ", e);
}
LoggerHelpers.traceLeave(log, "getSegmentsAtTime", traceId);
});
}