private void scale(long start, List<Long> segmentsToSeal, Map<Double, Double> keyRanges) throws InterruptedException, java.util.concurrent.ExecutionException { Controller.ScaleResponse scaleStatus = consumer.scale(SCOPE, STREAM, segmentsToSeal, keyRanges, start) .get(); AtomicBoolean done = new AtomicBoolean(false); Futures.loop(() -> !done.get(), () -> Futures.delayedFuture(() -> consumer.checkScale(SCOPE, STREAM, scaleStatus.getEpoch()), 1000, executor) .thenAccept(x -> done.set(x.getStatus().equals(Controller.ScaleStatusResponse.ScaleStatus.SUCCESS))), executor).get(); } }
@Test public void eventWriterInitializationTest() throws Exception { final ScalingPolicy policy = ScalingPolicy.fixed(1); final StreamConfiguration configuration = StreamConfiguration.builder().scalingPolicy(policy).build(); streamStorePartialMock.createStream(SCOPE, "test", configuration, System.currentTimeMillis(), null, executor).get(); streamStorePartialMock.setState(SCOPE, "test", State.ACTIVE, null, executor).get(); AssertExtensions.assertThrows("", () -> streamMetadataTasks.manualScale(SCOPE, "test", Collections.singletonList(0L), Arrays.asList(), 30, null).get(), e -> e instanceof TaskExceptions.ProcessingDisabledException); streamMetadataTasks.setRequestEventWriter(new ControllerEventStreamWriterMock(streamRequestHandler, executor)); List<AbstractMap.SimpleEntry<Double, Double>> newRanges = new ArrayList<>(); newRanges.add(new AbstractMap.SimpleEntry<>(0.0, 0.5)); newRanges.add(new AbstractMap.SimpleEntry<>(0.5, 1.0)); ScaleResponse scaleOpResult = streamMetadataTasks.manualScale(SCOPE, "test", Collections.singletonList(0L), newRanges, 30, null).get(); assertEquals(ScaleStreamStatus.STARTED, scaleOpResult.getStatus()); Controller.ScaleStatusResponse scaleStatusResult = streamMetadataTasks.checkScale(SCOPE, "UNKNOWN", 0, null).get(); assertEquals(Controller.ScaleStatusResponse.ScaleStatus.INVALID_INPUT, scaleStatusResult.getStatus()); scaleStatusResult = streamMetadataTasks.checkScale("UNKNOWN", "test", 0, null).get(); assertEquals(Controller.ScaleStatusResponse.ScaleStatus.INVALID_INPUT, scaleStatusResult.getStatus()); scaleStatusResult = streamMetadataTasks.checkScale(SCOPE, "test", 5, null).get(); assertEquals(Controller.ScaleStatusResponse.ScaleStatus.INVALID_INPUT, scaleStatusResult.getStatus()); }
}, this.executor); return result.thenApply(response -> { switch (response.getStatus()) { case IN_PROGRESS: return false;
done = scalestatusResponse.getStatus().equals(Controller.ScaleStatusResponse.ScaleStatus.SUCCESS);
keyRanges.put(0.75, 1.0); assertFalse(consumer.checkScale(SCOPE, STREAM, 0).get().getStatus().equals(Controller.ScaleStatusResponse.ScaleStatus.SUCCESS)); Controller.ScaleResponse scaleStatus = consumer.scale(SCOPE, STREAM, Arrays.asList(1L), keyRanges, start + 20) .get(); AtomicBoolean done = new AtomicBoolean(false); Futures.loop(() -> !done.get(), () -> consumer.checkScale(SCOPE, STREAM, scaleStatus.getEpoch()) .thenAccept(x -> done.set(x.getStatus().equals(Controller.ScaleStatusResponse.ScaleStatus.SUCCESS))), executor).get();
@Override public CompletableFuture<Boolean> checkScaleStatus(final Stream stream, final int epoch) { return this.controller.checkScale(stream.getScope(), stream.getStreamName(), epoch) .thenApply(response -> { switch (response.getStatus()) { case IN_PROGRESS: return false; case SUCCESS: return true; case INVALID_INPUT: throw new ControllerFailureException("invalid input"); case INTERNAL_ERROR: default: throw new ControllerFailureException("unknown error"); } }); }