org.apache.flink.runtime.state.internal.InternalValueState Java Examples
The following examples show how to use
org.apache.flink.runtime.state.internal.InternalValueState.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: PerWindowStateDataViewStore.java From flink with Apache License 2.0 | 6 votes |
@Override public <N, UK, UV> StateMapView<N, UK, UV> getStateMapView(String stateName, MapViewTypeInfo<UK, UV> mapViewTypeInfo) throws Exception { MapStateDescriptor<UK, UV> mapStateDescriptor = new MapStateDescriptor<>( stateName, mapViewTypeInfo.getKeyType(), mapViewTypeInfo.getValueType()); MapState<UK, UV> mapState = keyedStateBackend.getOrCreateKeyedState(windowSerializer, mapStateDescriptor); // explict cast to internal state InternalMapState<?, N, UK, UV> internalMapState = (InternalMapState<?, N, UK, UV>) mapState; if (mapViewTypeInfo.isNullAware()) { ValueStateDescriptor<UV> nullStateDescriptor = new ValueStateDescriptor<>( stateName + NULL_STATE_POSTFIX, mapViewTypeInfo.getValueType()); ValueState<UV> nullState = keyedStateBackend.getOrCreateKeyedState(windowSerializer, nullStateDescriptor); // explict cast to internal state InternalValueState<?, N, UV> internalNullState = (InternalValueState<?, N, UV>) nullState; return new StateMapView.NamespacedStateMapViewWithKeysNullable<>(internalMapState, internalNullState); } else { return new StateMapView.NamespacedStateMapViewWithKeysNotNull<>(internalMapState); } }
Example #2
Source File: PerWindowStateDataViewStore.java From flink with Apache License 2.0 | 6 votes |
@Override public <N, UK, UV> StateMapView<N, UK, UV> getStateMapView(String stateName, MapViewTypeInfo<UK, UV> mapViewTypeInfo) throws Exception { MapStateDescriptor<UK, UV> mapStateDescriptor = new MapStateDescriptor<>( stateName, mapViewTypeInfo.getKeyType(), mapViewTypeInfo.getValueType()); MapState<UK, UV> mapState = keyedStateBackend.getOrCreateKeyedState(windowSerializer, mapStateDescriptor); // explict cast to internal state InternalMapState<?, N, UK, UV> internalMapState = (InternalMapState<?, N, UK, UV>) mapState; if (mapViewTypeInfo.isNullAware()) { ValueStateDescriptor<UV> nullStateDescriptor = new ValueStateDescriptor<>( stateName + NULL_STATE_POSTFIX, mapViewTypeInfo.getValueType()); ValueState<UV> nullState = keyedStateBackend.getOrCreateKeyedState(windowSerializer, nullStateDescriptor); // explict cast to internal state InternalValueState<?, N, UV> internalNullState = (InternalValueState<?, N, UV>) nullState; return new StateMapView.NamespacedStateMapViewWithKeysNullable<>(internalMapState, internalNullState); } else { return new StateMapView.NamespacedStateMapViewWithKeysNotNull<>(internalMapState); } }
Example #3
Source File: StateBackendTestBase.java From flink with Apache License 2.0 | 5 votes |
@Test public void testCheckConcurrencyProblemWhenPerformingCheckpointAsync() throws Exception { CheckpointStreamFactory streamFactory = createStreamFactory(); AbstractKeyedStateBackend<Integer> backend = createKeyedBackend(IntSerializer.INSTANCE, env); ExecutorService executorService = Executors.newScheduledThreadPool(1); try { long checkpointID = 0; List<Future> futureList = new ArrayList(); for (int i = 0; i < 10; ++i) { ValueStateDescriptor<Integer> kvId = new ValueStateDescriptor<>("id" + i, IntSerializer.INSTANCE); ValueState<Integer> state = backend.getOrCreateKeyedState(VoidNamespaceSerializer.INSTANCE, kvId); ((InternalValueState) state).setCurrentNamespace(VoidNamespace.INSTANCE); backend.setCurrentKey(i); state.update(i); futureList.add(runSnapshotAsync(executorService, backend.snapshot(checkpointID++, System.currentTimeMillis(), streamFactory, CheckpointOptions.forCheckpointWithDefaultLocation()))); } for (Future future : futureList) { future.get(20, TimeUnit.SECONDS); } } catch (Exception e) { fail(); } finally { backend.dispose(); executorService.shutdown(); } }
Example #4
Source File: StateBackendTestBase.java From Flink-CEPplus with Apache License 2.0 | 5 votes |
@Test public void testCheckConcurrencyProblemWhenPerformingCheckpointAsync() throws Exception { CheckpointStreamFactory streamFactory = createStreamFactory(); Environment env = new DummyEnvironment(); AbstractKeyedStateBackend<Integer> backend = createKeyedBackend(IntSerializer.INSTANCE, env); ExecutorService executorService = Executors.newScheduledThreadPool(1); try { long checkpointID = 0; List<Future> futureList = new ArrayList(); for (int i = 0; i < 10; ++i) { ValueStateDescriptor<Integer> kvId = new ValueStateDescriptor<>("id" + i, IntSerializer.INSTANCE); ValueState<Integer> state = backend.getOrCreateKeyedState(VoidNamespaceSerializer.INSTANCE, kvId); ((InternalValueState) state).setCurrentNamespace(VoidNamespace.INSTANCE); backend.setCurrentKey(i); state.update(i); futureList.add(runSnapshotAsync(executorService, backend.snapshot(checkpointID++, System.currentTimeMillis(), streamFactory, CheckpointOptions.forCheckpointWithDefaultLocation()))); } for (Future future : futureList) { future.get(20, TimeUnit.SECONDS); } } catch (Exception e) { fail(); } finally { backend.dispose(); executorService.shutdown(); } }
Example #5
Source File: StateBackendTestBase.java From flink with Apache License 2.0 | 5 votes |
@Test public void testCheckConcurrencyProblemWhenPerformingCheckpointAsync() throws Exception { CheckpointStreamFactory streamFactory = createStreamFactory(); Environment env = new DummyEnvironment(); AbstractKeyedStateBackend<Integer> backend = createKeyedBackend(IntSerializer.INSTANCE, env); ExecutorService executorService = Executors.newScheduledThreadPool(1); try { long checkpointID = 0; List<Future> futureList = new ArrayList(); for (int i = 0; i < 10; ++i) { ValueStateDescriptor<Integer> kvId = new ValueStateDescriptor<>("id" + i, IntSerializer.INSTANCE); ValueState<Integer> state = backend.getOrCreateKeyedState(VoidNamespaceSerializer.INSTANCE, kvId); ((InternalValueState) state).setCurrentNamespace(VoidNamespace.INSTANCE); backend.setCurrentKey(i); state.update(i); futureList.add(runSnapshotAsync(executorService, backend.snapshot(checkpointID++, System.currentTimeMillis(), streamFactory, CheckpointOptions.forCheckpointWithDefaultLocation()))); } for (Future future : futureList) { future.get(20, TimeUnit.SECONDS); } } catch (Exception e) { fail(); } finally { backend.dispose(); executorService.shutdown(); } }
Example #6
Source File: StateBackendTestBase.java From flink with Apache License 2.0 | 4 votes |
@Test public void testAsyncSnapshotCancellation() throws Exception { OneShotLatch blocker = new OneShotLatch(); OneShotLatch waiter = new OneShotLatch(); BlockerCheckpointStreamFactory streamFactory = new BlockerCheckpointStreamFactory(1024 * 1024); streamFactory.setWaiterLatch(waiter); streamFactory.setBlockerLatch(blocker); streamFactory.setAfterNumberInvocations(10); final AbstractKeyedStateBackend<Integer> backend = createKeyedBackend(IntSerializer.INSTANCE); try { if (!backend.supportsAsynchronousSnapshots()) { return; } InternalValueState<Integer, VoidNamespace, Integer> valueState = backend.createInternalState( VoidNamespaceSerializer.INSTANCE, new ValueStateDescriptor<>("test", IntSerializer.INSTANCE)); valueState.setCurrentNamespace(VoidNamespace.INSTANCE); for (int i = 0; i < 10; ++i) { backend.setCurrentKey(i); valueState.update(i); } RunnableFuture<SnapshotResult<KeyedStateHandle>> snapshot = backend.snapshot(0L, 0L, streamFactory, CheckpointOptions.forCheckpointWithDefaultLocation()); Thread runner = new Thread(snapshot); runner.start(); // wait until the code reached some stream read waiter.await(); // close the backend to see if the close is propagated to the stream IOUtils.closeQuietly(backend); //unblock the stream so that it can run into the IOException blocker.trigger(); runner.join(); try { snapshot.get(); fail("Close was not propagated."); } catch (CancellationException ex) { //ignore } } finally { backend.dispose(); } }
Example #7
Source File: StateBackendTestBase.java From flink with Apache License 2.0 | 4 votes |
@Test public void testAsyncSnapshotCancellation() throws Exception { OneShotLatch blocker = new OneShotLatch(); OneShotLatch waiter = new OneShotLatch(); BlockerCheckpointStreamFactory streamFactory = new BlockerCheckpointStreamFactory(1024 * 1024); streamFactory.setWaiterLatch(waiter); streamFactory.setBlockerLatch(blocker); streamFactory.setAfterNumberInvocations(10); final AbstractKeyedStateBackend<Integer> backend = createKeyedBackend(IntSerializer.INSTANCE); try { if (!backend.supportsAsynchronousSnapshots()) { return; } InternalValueState<Integer, VoidNamespace, Integer> valueState = backend.createInternalState( VoidNamespaceSerializer.INSTANCE, new ValueStateDescriptor<>("test", IntSerializer.INSTANCE)); valueState.setCurrentNamespace(VoidNamespace.INSTANCE); for (int i = 0; i < 10; ++i) { backend.setCurrentKey(i); valueState.update(i); } RunnableFuture<SnapshotResult<KeyedStateHandle>> snapshot = backend.snapshot(0L, 0L, streamFactory, CheckpointOptions.forCheckpointWithDefaultLocation()); Thread runner = new Thread(snapshot); runner.start(); // wait until the code reached some stream read waiter.await(); // close the backend to see if the close is propagated to the stream IOUtils.closeQuietly(backend); //unblock the stream so that it can run into the IOException blocker.trigger(); runner.join(); try { snapshot.get(); fail("Close was not propagated."); } catch (CancellationException ex) { //ignore } } finally { backend.dispose(); } }
Example #8
Source File: StateBackendTestBase.java From flink with Apache License 2.0 | 4 votes |
/** * The purpose of this test is to check that parallel snapshots are possible, and work even if a previous snapshot * is still running and blocking. */ @Test public void testParallelAsyncSnapshots() throws Exception { OneShotLatch blocker = new OneShotLatch(); OneShotLatch waiter = new OneShotLatch(); BlockerCheckpointStreamFactory streamFactory = new BlockerCheckpointStreamFactory(1024 * 1024); streamFactory.setWaiterLatch(waiter); streamFactory.setBlockerLatch(blocker); streamFactory.setAfterNumberInvocations(10); final AbstractKeyedStateBackend<Integer> backend = createKeyedBackend(IntSerializer.INSTANCE); try { if (!backend.supportsAsynchronousSnapshots()) { return; } // insert some data to the backend. InternalValueState<Integer, VoidNamespace, Integer> valueState = backend.createInternalState( VoidNamespaceSerializer.INSTANCE, new ValueStateDescriptor<>("test", IntSerializer.INSTANCE)); valueState.setCurrentNamespace(VoidNamespace.INSTANCE); for (int i = 0; i < 10; ++i) { backend.setCurrentKey(i); valueState.update(i); } RunnableFuture<SnapshotResult<KeyedStateHandle>> snapshot1 = backend.snapshot(0L, 0L, streamFactory, CheckpointOptions.forCheckpointWithDefaultLocation()); Thread runner1 = new Thread(snapshot1, "snapshot-1-runner"); runner1.start(); // after this call returns, we have a running snapshot-1 that is blocked in IO. waiter.await(); // do some updates in between the snapshots. for (int i = 5; i < 15; ++i) { backend.setCurrentKey(i); valueState.update(i + 1); } // we don't want to block the second snapshot. streamFactory.setWaiterLatch(null); streamFactory.setBlockerLatch(null); RunnableFuture<SnapshotResult<KeyedStateHandle>> snapshot2 = backend.snapshot(1L, 1L, streamFactory, CheckpointOptions.forCheckpointWithDefaultLocation()); Thread runner2 = new Thread(snapshot2,"snapshot-2-runner"); runner2.start(); // snapshot-2 should run and succeed, while snapshot-1 is still running and blocked in IO. snapshot2.get(); // we release the blocking IO so that snapshot-1 can also finish and succeed. blocker.trigger(); snapshot1.get(); } finally { backend.dispose(); } }
Example #9
Source File: TtlValueState.java From flink with Apache License 2.0 | 4 votes |
TtlValueState(TtlStateContext<InternalValueState<K, N, TtlValue<T>>, T> tTtlStateContext) { super(tTtlStateContext); }
Example #10
Source File: WindowOperator.java From flink with Apache License 2.0 | 4 votes |
@Override public void open() throws Exception { super.open(); functionsClosed = false; collector = new TimestampedCollector<>(output); collector.eraseTimestamp(); internalTimerService = getInternalTimerService("window-timers", windowSerializer, this); triggerContext = new TriggerContext(); triggerContext.open(); StateDescriptor<ValueState<RowData>, RowData> windowStateDescriptor = new ValueStateDescriptor<>( "window-aggs", new RowDataSerializer(getExecutionConfig(), accumulatorTypes)); this.windowState = (InternalValueState<K, W, RowData>) getOrCreateKeyedState(windowSerializer, windowStateDescriptor); if (produceUpdates) { LogicalType[] valueTypes = ArrayUtils.addAll(aggResultTypes, windowPropertyTypes); StateDescriptor<ValueState<RowData>, RowData> previousStateDescriptor = new ValueStateDescriptor<>( "previous-aggs", new RowDataSerializer(getExecutionConfig(), valueTypes)); this.previousState = (InternalValueState<K, W, RowData>) getOrCreateKeyedState(windowSerializer, previousStateDescriptor); } compileGeneratedCode(); WindowContext windowContext = new WindowContext(); windowAggregator.open(new PerWindowStateDataViewStore( getKeyedStateBackend(), windowSerializer, getRuntimeContext())); if (windowAssigner instanceof MergingWindowAssigner) { this.windowFunction = new MergingWindowProcessFunction<>( (MergingWindowAssigner<W>) windowAssigner, windowAggregator, windowSerializer, allowedLateness); } else if (windowAssigner instanceof PanedWindowAssigner) { this.windowFunction = new PanedWindowProcessFunction<>( (PanedWindowAssigner<W>) windowAssigner, windowAggregator, allowedLateness); } else { this.windowFunction = new GeneralWindowProcessFunction<>( windowAssigner, windowAggregator, allowedLateness); } windowFunction.open(windowContext); // metrics this.numLateRecordsDropped = metrics.counter(LATE_ELEMENTS_DROPPED_METRIC_NAME); this.lateRecordsDroppedRate = metrics.meter( LATE_ELEMENTS_DROPPED_RATE_METRIC_NAME, new MeterView(numLateRecordsDropped)); this.watermarkLatency = metrics.gauge(WATERMARK_LATENCY_METRIC_NAME, () -> { long watermark = internalTimerService.currentWatermark(); if (watermark < 0) { return 0L; } else { return internalTimerService.currentProcessingTime() - watermark; } }); }
Example #11
Source File: StateMapView.java From flink with Apache License 2.0 | 4 votes |
public NamespacedStateMapViewWithKeysNullable(InternalMapState<?, N, MK, MV> internalMapState, InternalValueState<?, N, MV> internalNullState) { this.internalMapState = internalMapState; this.internalNullState = internalNullState; }
Example #12
Source File: TtlValueState.java From Flink-CEPplus with Apache License 2.0 | 4 votes |
TtlValueState(TtlStateContext<InternalValueState<K, N, TtlValue<T>>, T> tTtlStateContext) { super(tTtlStateContext); }
Example #13
Source File: StateBackendTestBase.java From flink with Apache License 2.0 | 4 votes |
/** * The purpose of this test is to check that parallel snapshots are possible, and work even if a previous snapshot * is still running and blocking. */ @Test public void testParallelAsyncSnapshots() throws Exception { OneShotLatch blocker = new OneShotLatch(); OneShotLatch waiter = new OneShotLatch(); BlockerCheckpointStreamFactory streamFactory = new BlockerCheckpointStreamFactory(1024 * 1024); streamFactory.setWaiterLatch(waiter); streamFactory.setBlockerLatch(blocker); streamFactory.setAfterNumberInvocations(10); final AbstractKeyedStateBackend<Integer> backend = createKeyedBackend(IntSerializer.INSTANCE); try { if (!backend.supportsAsynchronousSnapshots()) { return; } // insert some data to the backend. InternalValueState<Integer, VoidNamespace, Integer> valueState = backend.createInternalState( VoidNamespaceSerializer.INSTANCE, new ValueStateDescriptor<>("test", IntSerializer.INSTANCE)); valueState.setCurrentNamespace(VoidNamespace.INSTANCE); for (int i = 0; i < 10; ++i) { backend.setCurrentKey(i); valueState.update(i); } RunnableFuture<SnapshotResult<KeyedStateHandle>> snapshot1 = backend.snapshot(0L, 0L, streamFactory, CheckpointOptions.forCheckpointWithDefaultLocation()); Thread runner1 = new Thread(snapshot1, "snapshot-1-runner"); runner1.start(); // after this call returns, we have a running snapshot-1 that is blocked in IO. waiter.await(); // do some updates in between the snapshots. for (int i = 5; i < 15; ++i) { backend.setCurrentKey(i); valueState.update(i + 1); } // we don't want to block the second snapshot. streamFactory.setWaiterLatch(null); streamFactory.setBlockerLatch(null); RunnableFuture<SnapshotResult<KeyedStateHandle>> snapshot2 = backend.snapshot(1L, 1L, streamFactory, CheckpointOptions.forCheckpointWithDefaultLocation()); Thread runner2 = new Thread(snapshot2,"snapshot-2-runner"); runner2.start(); // snapshot-2 should run and succeed, while snapshot-1 is still running and blocked in IO. snapshot2.get(); // we release the blocking IO so that snapshot-1 can also finish and succeed. blocker.trigger(); snapshot1.get(); } finally { backend.dispose(); } }
Example #14
Source File: TtlValueState.java From flink with Apache License 2.0 | 4 votes |
TtlValueState(TtlStateContext<InternalValueState<K, N, TtlValue<T>>, T> tTtlStateContext) { super(tTtlStateContext); }
Example #15
Source File: WindowOperator.java From flink with Apache License 2.0 | 4 votes |
@Override public void open() throws Exception { super.open(); collector = new TimestampedCollector<>(output); collector.eraseTimestamp(); internalTimerService = getInternalTimerService("window-timers", windowSerializer, this); triggerContext = new TriggerContext(); triggerContext.open(); StateDescriptor<ValueState<BaseRow>, BaseRow> windowStateDescriptor = new ValueStateDescriptor<>( "window-aggs", new BaseRowSerializer(getExecutionConfig(), accumulatorTypes)); this.windowState = (InternalValueState<K, W, BaseRow>) getOrCreateKeyedState(windowSerializer, windowStateDescriptor); if (sendRetraction) { LogicalType[] valueTypes = ArrayUtils.addAll(aggResultTypes, windowPropertyTypes); StateDescriptor<ValueState<BaseRow>, BaseRow> previousStateDescriptor = new ValueStateDescriptor<>( "previous-aggs", new BaseRowSerializer(getExecutionConfig(), valueTypes)); this.previousState = (InternalValueState<K, W, BaseRow>) getOrCreateKeyedState(windowSerializer, previousStateDescriptor); } compileGeneratedCode(); WindowContext windowContext = new WindowContext(); windowAggregator.open(new PerWindowStateDataViewStore( getKeyedStateBackend(), windowSerializer, getRuntimeContext())); if (windowAssigner instanceof MergingWindowAssigner) { this.windowFunction = new MergingWindowProcessFunction<>( (MergingWindowAssigner<W>) windowAssigner, windowAggregator, windowSerializer, allowedLateness); } else if (windowAssigner instanceof PanedWindowAssigner) { this.windowFunction = new PanedWindowProcessFunction<>( (PanedWindowAssigner<W>) windowAssigner, windowAggregator, allowedLateness); } else { this.windowFunction = new GeneralWindowProcessFunction<>( windowAssigner, windowAggregator, allowedLateness); } windowFunction.open(windowContext); // metrics this.numLateRecordsDropped = metrics.counter(LATE_ELEMENTS_DROPPED_METRIC_NAME); this.lateRecordsDroppedRate = metrics.meter( LATE_ELEMENTS_DROPPED_RATE_METRIC_NAME, new MeterView(numLateRecordsDropped, 60)); this.watermarkLatency = metrics.gauge(WATERMARK_LATENCY_METRIC_NAME, () -> { long watermark = internalTimerService.currentWatermark(); if (watermark < 0) { return 0L; } else { return internalTimerService.currentProcessingTime() - watermark; } }); }
Example #16
Source File: StateMapView.java From flink with Apache License 2.0 | 4 votes |
public NamespacedStateMapViewWithKeysNullable(InternalMapState<?, N, MK, MV> internalMapState, InternalValueState<?, N, MV> internalNullState) { this.internalMapState = internalMapState; this.internalNullState = internalNullState; }
Example #17
Source File: StateBackendTestBase.java From Flink-CEPplus with Apache License 2.0 | 4 votes |
@Test public void testAsyncSnapshotCancellation() throws Exception { OneShotLatch blocker = new OneShotLatch(); OneShotLatch waiter = new OneShotLatch(); BlockerCheckpointStreamFactory streamFactory = new BlockerCheckpointStreamFactory(1024 * 1024); streamFactory.setWaiterLatch(waiter); streamFactory.setBlockerLatch(blocker); streamFactory.setAfterNumberInvocations(10); final AbstractKeyedStateBackend<Integer> backend = createKeyedBackend(IntSerializer.INSTANCE); try { if (!backend.supportsAsynchronousSnapshots()) { return; } InternalValueState<Integer, VoidNamespace, Integer> valueState = backend.createInternalState( VoidNamespaceSerializer.INSTANCE, new ValueStateDescriptor<>("test", IntSerializer.INSTANCE)); valueState.setCurrentNamespace(VoidNamespace.INSTANCE); for (int i = 0; i < 10; ++i) { backend.setCurrentKey(i); valueState.update(i); } RunnableFuture<SnapshotResult<KeyedStateHandle>> snapshot = backend.snapshot(0L, 0L, streamFactory, CheckpointOptions.forCheckpointWithDefaultLocation()); Thread runner = new Thread(snapshot); runner.start(); // wait until the code reached some stream read waiter.await(); // close the backend to see if the close is propagated to the stream IOUtils.closeQuietly(backend); //unblock the stream so that it can run into the IOException blocker.trigger(); runner.join(); try { snapshot.get(); fail("Close was not propagated."); } catch (CancellationException ex) { //ignore } } finally { backend.dispose(); } }
Example #18
Source File: StateBackendTestBase.java From Flink-CEPplus with Apache License 2.0 | 4 votes |
/** * The purpose of this test is to check that parallel snapshots are possible, and work even if a previous snapshot * is still running and blocking. */ @Test public void testParallelAsyncSnapshots() throws Exception { OneShotLatch blocker = new OneShotLatch(); OneShotLatch waiter = new OneShotLatch(); BlockerCheckpointStreamFactory streamFactory = new BlockerCheckpointStreamFactory(1024 * 1024); streamFactory.setWaiterLatch(waiter); streamFactory.setBlockerLatch(blocker); streamFactory.setAfterNumberInvocations(10); final AbstractKeyedStateBackend<Integer> backend = createKeyedBackend(IntSerializer.INSTANCE); try { if (!backend.supportsAsynchronousSnapshots()) { return; } // insert some data to the backend. InternalValueState<Integer, VoidNamespace, Integer> valueState = backend.createInternalState( VoidNamespaceSerializer.INSTANCE, new ValueStateDescriptor<>("test", IntSerializer.INSTANCE)); valueState.setCurrentNamespace(VoidNamespace.INSTANCE); for (int i = 0; i < 10; ++i) { backend.setCurrentKey(i); valueState.update(i); } RunnableFuture<SnapshotResult<KeyedStateHandle>> snapshot1 = backend.snapshot(0L, 0L, streamFactory, CheckpointOptions.forCheckpointWithDefaultLocation()); Thread runner1 = new Thread(snapshot1, "snapshot-1-runner"); runner1.start(); // after this call returns, we have a running snapshot-1 that is blocked in IO. waiter.await(); // do some updates in between the snapshots. for (int i = 5; i < 15; ++i) { backend.setCurrentKey(i); valueState.update(i + 1); } // we don't want to block the second snapshot. streamFactory.setWaiterLatch(null); streamFactory.setBlockerLatch(null); RunnableFuture<SnapshotResult<KeyedStateHandle>> snapshot2 = backend.snapshot(1L, 1L, streamFactory, CheckpointOptions.forCheckpointWithDefaultLocation()); Thread runner2 = new Thread(snapshot2,"snapshot-2-runner"); runner2.start(); // snapshot-2 should run and succeed, while snapshot-1 is still running and blocked in IO. snapshot2.get(); // we release the blocking IO so that snapshot-1 can also finish and succeed. blocker.trigger(); snapshot1.get(); } finally { backend.dispose(); } }