private CompletableFuture<ScaleResponse> startScaleInternal(final Stream stream, final List<Long> sealedSegments,
final Map<Double, Double> newKeyRanges, String method,
long requestId) {
Preconditions.checkNotNull(stream, "stream");
Preconditions.checkNotNull(sealedSegments, "sealedSegments");
Preconditions.checkNotNull(newKeyRanges, "newKeyRanges");
final CompletableFuture<ScaleResponse> result = this.retryConfig.runAsync(() -> {
RPCAsyncCallback<ScaleResponse> callback = new RPCAsyncCallback<>(requestId, method);
long scaleTimestamp = System.currentTimeMillis();
new ControllerClientTagger(client)
.withTag(requestId, method, stream.getScope(), stream.getStreamName(), String.valueOf(scaleTimestamp))
.scale(ScaleRequest.newBuilder()
.setStreamInfo(ModelHelper.createStreamInfo(stream.getScope(), stream.getStreamName()))
.addAllSealedSegments(sealedSegments)
.addAllNewKeyRanges(newKeyRanges.entrySet().stream()
.map(x -> ScaleRequest.KeyRangeEntry.newBuilder()
.setStart(x.getKey()).setEnd(x.getValue()).build())
.collect(Collectors.toList()))
.setScaleTimestamp(scaleTimestamp)
.build(),
callback);
return callback.getFuture();
}, this.executor);
return result;
}