@Override public String getScope() { return segment.getScope(); }
/** * Decodes segment and returns an instance of SegmentId. * * @param segment The segment. * @return Instance of SegmentId. */ public static final SegmentId decode(final Segment segment) { Preconditions.checkNotNull(segment, "segment"); return createSegmentId(segment.getScope(), segment.getStreamName(), segment.getSegmentId()); }
private void triggerScaleUp(String streamSegmentName, int numOfSplits) { if (initialized.get()) { Pair<Long, Long> pair = cache.getIfPresent(streamSegmentName); long lastRequestTs = 0; if (pair != null && pair.getKey() != null) { lastRequestTs = pair.getKey(); } long timestamp = System.currentTimeMillis(); long requestId = requestIdGenerator.get(); if (timestamp - lastRequestTs > configuration.getMuteDuration().toMillis()) { log.info(requestId, "sending request for scale up for {}", streamSegmentName); Segment segment = Segment.fromScopedName(streamSegmentName); AutoScaleEvent event = new AutoScaleEvent(segment.getScope(), segment.getStreamName(), segment.getSegmentId(), AutoScaleEvent.UP, timestamp, numOfSplits, false, requestId); // Mute scale for timestamp for both scale up and down writeRequest(event).thenAccept(x -> cache.put(streamSegmentName, new ImmutablePair<>(timestamp, timestamp))); } } }
private void triggerScaleDown(String streamSegmentName, boolean silent) { if (initialized.get()) { Pair<Long, Long> pair = cache.getIfPresent(streamSegmentName); long lastRequestTs = 0; if (pair != null && pair.getValue() != null) { lastRequestTs = pair.getValue(); } long timestamp = System.currentTimeMillis(); long requestId = requestIdGenerator.get(); if (timestamp - lastRequestTs > configuration.getMuteDuration().toMillis()) { log.info(requestId, "sending request for scale down for {}", streamSegmentName); Segment segment = Segment.fromScopedName(streamSegmentName); AutoScaleEvent event = new AutoScaleEvent(segment.getScope(), segment.getStreamName(), segment.getSegmentId(), AutoScaleEvent.DOWN, timestamp, 0, silent, requestId); writeRequest(event).thenAccept(x -> { if (!silent) { // mute only scale downs cache.put(streamSegmentName, new ImmutablePair<>(0L, timestamp)); } }); } } }
@Override public CompletableFuture<Boolean> isSegmentOpen(Segment segment) { return controller.isSegmentValid(segment.getScope(), segment.getStreamName(), segment.getSegmentId()); }
public String getOrRefreshDelegationTokenFor(Segment segmentId) { return getAndHandleExceptions(controller.getOrRefreshDelegationTokenFor(segmentId.getScope(), segmentId.getStreamName()), RuntimeException::new); } }
@Override public CompletableFuture<PravegaNodeUri> getEndpointForSegment(String qualifiedSegmentName) { Segment segment = Segment.fromScopedName(qualifiedSegmentName); return controller.getURI(ModelHelper.createSegmentId(segment.getScope(), segment.getStreamName(), segment.getSegmentId())).thenApply(ModelHelper::encode); }
private ByteStreamReader createByteStreamReaders(Segment segment) { String delegationToken = Futures.getAndHandleExceptions(controller.getOrRefreshDelegationTokenFor(segment.getScope(), segment.getStream() .getStreamName()), RuntimeException::new); return new ByteStreamReaderImpl(inputStreamFactory.createInputStreamForSegment(segment, delegationToken), metaStreamFactory.createSegmentMetadataClient(segment, delegationToken)); }
@Override public CompletableFuture<Boolean> isSegmentOpen(final Segment segment) { Exceptions.checkNotClosed(closed.get(), this); long traceId = LoggerHelpers.traceEnter(log, "isSegmentOpen", segment); final CompletableFuture<SegmentValidityResponse> result = this.retryConfig.runAsync(() -> { RPCAsyncCallback<SegmentValidityResponse> callback = new RPCAsyncCallback<>(traceId, "isSegmentOpen"); client.isSegmentValid(ModelHelper.createSegmentId(segment.getScope(), segment.getStreamName(), segment.getSegmentId()), callback); return callback.getFuture(); }, this.executor); return result.thenApply(SegmentValidityResponse::getResponse) .whenComplete((x, e) -> { if (e != null) { log.warn("isSegmentOpen failed: ", e); } LoggerHelpers.traceLeave(log, "isSegmentOpen", traceId); }); }
private EventSegmentReader getEventSegmentReader(Segment segment, long endOffset, int bufferSize) { String delegationToken = Futures.getAndHandleExceptions(controller.getOrRefreshDelegationTokenFor(segment.getScope(), segment.getStream() .getStreamName()), RuntimeException::new); AsyncSegmentInputStreamImpl async = new AsyncSegmentInputStreamImpl(controller, cf, segment, delegationToken); async.getConnection(); return getEventSegmentReader(async, 0, endOffset, bufferSize); }
@Override @SuppressWarnings("deprecation") public <T> RevisionedStreamClient<T> createRevisionedStreamClient(String streamName, Serializer<T> serializer, SynchronizerConfig config) { log.info("Creating revisioned stream client for stream: {} with synchronizer configuration: {}", streamName, config); Segment segment = new Segment(scope, streamName, 0); EventSegmentReader in = inFactory.createEventReaderForSegment(segment); // Segment sealed is not expected for Revisioned Stream Client. Consumer<Segment> segmentSealedCallBack = s -> { throw new IllegalStateException("RevisionedClient: Segmentsealed exception observed for segment:" + s); }; String delegationToken = Futures.getAndHandleExceptions(controller.getOrRefreshDelegationTokenFor(segment.getScope(), segment.getStreamName()), RuntimeException::new); SegmentOutputStream out = outFactory.createOutputStreamForSegment(segment, segmentSealedCallBack, config.getEventWriterConfig(), delegationToken); ConditionalOutputStream cond = condFactory.createConditionalOutputStream(segment, delegationToken, config.getEventWriterConfig()); SegmentMetadataClient meta = metaFactory.createSegmentMetadataClient(segment, delegationToken); return new RevisionedStreamClientImpl<>(segment, in, out, cond, meta, serializer); }
@Override public CompletableFuture<PravegaNodeUri> getEndpointForSegment(final String qualifiedSegmentName) { Exceptions.checkNotClosed(closed.get(), this); Exceptions.checkNotNullOrEmpty(qualifiedSegmentName, "qualifiedSegmentName"); long traceId = LoggerHelpers.traceEnter(log, "getEndpointForSegment", qualifiedSegmentName); final CompletableFuture<NodeUri> result = this.retryConfig.runAsync(() -> { RPCAsyncCallback<NodeUri> callback = new RPCAsyncCallback<>(traceId, "getEndpointForSegment"); Segment segment = Segment.fromScopedName(qualifiedSegmentName); client.getURI(ModelHelper.createSegmentId(segment.getScope(), segment.getStreamName(), segment.getSegmentId()), callback); return callback.getFuture(); }, this.executor); return result.thenApply(ModelHelper::encode) .whenComplete((x, e) -> { if (e != null) { log.warn("getEndpointForSegment failed: ", e); } LoggerHelpers.traceLeave(log, "getEndpointForSegment", traceId); }); }
private void randomScaleUpScaleDown(final EventStreamClientFactory clientFactory, final Controller controller) { @Cleanup EventStreamWriter<AutoScaleEvent> requestStreamWriter = clientFactory.createEventWriter("_requeststream", autoScaleEventSerializer, EventWriterConfig.builder() .build()); final Collection<Segment> currentSegments = controller.getCurrentSegments(SCOPE, STREAM).join().getSegments(); Assert.assertTrue("Current Number of segments cannot be zero", currentSegments.size() > 0); // fetch a randomSegment final Segment randomSegment = currentSegments.toArray(new Segment[0])[random.nextInt(currentSegments.size())]; AutoScaleEvent scaleEvent = null; if (random.nextBoolean()) { // trigger random scale up scaleEvent = new AutoScaleEvent(randomSegment.getScope(), randomSegment.getStreamName(), randomSegment.getSegmentId(), AutoScaleEvent.UP, System.currentTimeMillis(), 2, false, random.nextInt()); } else { // trigger random scale down. scaleEvent = new AutoScaleEvent(randomSegment.getScope(), randomSegment.getStreamName(), randomSegment.getSegmentId(), AutoScaleEvent.DOWN, System.currentTimeMillis(), 2, false, random.nextInt()); // silent=false } Futures.getAndHandleExceptions(requestStreamWriter.writeEvent(scaleEvent), t -> new RuntimeException("Error while writing scale event", t)); }
@Test public void encodeSegmentId() { Segment segment = ModelHelper.encode(ModelHelper.decode(createSegmentId("stream1", 2L))); assertEquals("stream1", segment.getStreamName()); assertEquals("scope", segment.getScope()); assertEquals(2L, segment.getSegmentId()); }
@Test public void encodeSegmentRange() { Controller.SegmentRange range = createSegmentRange(0.1, 0.5); SegmentWithRange result = ModelHelper.encode(range); assertEquals(0, result.getSegment().getSegmentId()); assertEquals("testScope", result.getSegment().getScope()); assertEquals("testStream", result.getSegment().getStreamName()); final Controller.SegmentRange invalidMinSegrange = createSegmentRange(-0.1, 0.5); AssertExtensions.assertThrows("Unexpected behaviour of invalid minkey", () -> ModelHelper.encode(invalidMinSegrange), ex -> ex instanceof IllegalArgumentException); final Controller.SegmentRange invalidMinSegrange1 = createSegmentRange(1.5, 0.5); AssertExtensions.assertThrows("Unexpected behaviour of invalid minkey", () -> ModelHelper.encode(invalidMinSegrange1), ex -> ex instanceof IllegalArgumentException); final Controller.SegmentRange invalidMaxSegrange = createSegmentRange(0.1, 1.5); AssertExtensions.assertThrows("Unexpected behaviour of invalid minkey", () -> ModelHelper.encode(invalidMaxSegrange), ex -> ex instanceof IllegalArgumentException); final Controller.SegmentRange invalidMaxSegrange1 = createSegmentRange(0.1, -0.5); AssertExtensions.assertThrows("Unexpected behaviour of invalid minkey", () -> ModelHelper.encode(invalidMaxSegrange1), ex -> ex instanceof IllegalArgumentException); }