use of io.pravega.client.ClientFactory in project pravega by pravega.
the class ReaderGroupStateManagerTest method testAddReader.
@Test(timeout = 10000)
public void testAddReader() throws ReinitializationRequiredException {
String scope = "scope";
String stream = "stream";
PravegaNodeUri endpoint = new PravegaNodeUri("localhost", SERVICE_PORT);
MockConnectionFactoryImpl connectionFactory = new MockConnectionFactoryImpl();
MockController controller = new MockController(endpoint.getEndpoint(), endpoint.getPort(), connectionFactory);
MockSegmentStreamFactory streamFactory = new MockSegmentStreamFactory();
@Cleanup ClientFactory clientFactory = new ClientFactoryImpl(scope, controller, connectionFactory, streamFactory, streamFactory, streamFactory);
SynchronizerConfig config = SynchronizerConfig.builder().build();
@Cleanup StateSynchronizer<ReaderGroupState> stateSynchronizer = createState(stream, clientFactory, config);
Map<Segment, Long> segments = new HashMap<>();
segments.put(new Segment(scope, stream, 0), 1L);
ReaderGroupStateManager.initializeReaderGroup(stateSynchronizer, ReaderGroupConfig.builder().stream(Stream.of(scope, stream)).build(), segments);
ReaderGroupStateManager readerState = new ReaderGroupStateManager("testReader", stateSynchronizer, controller, null);
readerState.initializeReader(0);
Segment toRelease = readerState.findSegmentToReleaseIfRequired();
assertNull(toRelease);
Map<Segment, Long> newSegments = readerState.acquireNewSegmentsIfNeeded(0);
assertFalse(newSegments.isEmpty());
assertEquals(1, newSegments.size());
assertTrue(newSegments.containsKey(new Segment(scope, stream, 0)));
assertEquals(1, newSegments.get(new Segment(scope, stream, 0)).longValue());
}
use of io.pravega.client.ClientFactory in project pravega by pravega.
the class ReaderGroupStateManagerTest method testCheckpoint.
@Test(timeout = 10000)
public void testCheckpoint() throws ReinitializationRequiredException {
String scope = "scope";
String stream = "stream";
PravegaNodeUri endpoint = new PravegaNodeUri("localhost", SERVICE_PORT);
MockConnectionFactoryImpl connectionFactory = new MockConnectionFactoryImpl();
Segment initialSegment = new Segment(scope, stream, 0);
Segment successorA = new Segment(scope, stream, 1);
Segment successorB = new Segment(scope, stream, 2);
MockController controller = new MockControllerWithSuccessors(endpoint.getEndpoint(), endpoint.getPort(), connectionFactory, new StreamSegmentsWithPredecessors(ImmutableMap.of(new SegmentWithRange(successorA, 0.0, 0.5), singletonList(0), new SegmentWithRange(successorB, 0.5, 1.0), singletonList(0)), ""));
MockSegmentStreamFactory streamFactory = new MockSegmentStreamFactory();
@Cleanup ClientFactory clientFactory = new ClientFactoryImpl(scope, controller, connectionFactory, streamFactory, streamFactory, streamFactory);
SynchronizerConfig config = SynchronizerConfig.builder().build();
@Cleanup StateSynchronizer<ReaderGroupState> stateSynchronizer = createState(stream, clientFactory, config);
Map<Segment, Long> segments = new HashMap<>();
segments.put(initialSegment, 1L);
ReaderGroupStateManager.initializeReaderGroup(stateSynchronizer, ReaderGroupConfig.builder().stream(Stream.of(scope, stream)).build(), segments);
val readerState = new ReaderGroupStateManager("testReader", stateSynchronizer, controller, null);
readerState.initializeReader(0);
assertNull(readerState.getCheckpoint());
stateSynchronizer.updateStateUnconditionally(new CreateCheckpoint("CP1"));
stateSynchronizer.fetchUpdates();
assertEquals("CP1", readerState.getCheckpoint());
assertEquals("CP1", readerState.getCheckpoint());
readerState.checkpoint("CP1", new PositionImpl(Collections.emptyMap()));
assertNull(readerState.getCheckpoint());
stateSynchronizer.updateStateUnconditionally(new CreateCheckpoint("CP2"));
stateSynchronizer.updateStateUnconditionally(new CreateCheckpoint("CP3"));
stateSynchronizer.fetchUpdates();
assertEquals("CP2", readerState.getCheckpoint());
readerState.checkpoint("CP2", new PositionImpl(Collections.emptyMap()));
assertEquals("CP3", readerState.getCheckpoint());
readerState.checkpoint("CP3", new PositionImpl(Collections.emptyMap()));
assertNull(readerState.getCheckpoint());
}
use of io.pravega.client.ClientFactory in project pravega by pravega.
the class ReaderGroupStateManagerTest method testRemoveReader.
@Test(timeout = 10000)
public void testRemoveReader() throws ReinitializationRequiredException {
String scope = "scope";
String stream = "stream";
PravegaNodeUri endpoint = new PravegaNodeUri("localhost", SERVICE_PORT);
MockConnectionFactoryImpl connectionFactory = new MockConnectionFactoryImpl();
MockController controller = new MockController(endpoint.getEndpoint(), endpoint.getPort(), connectionFactory);
MockSegmentStreamFactory streamFactory = new MockSegmentStreamFactory();
@Cleanup ClientFactory clientFactory = new ClientFactoryImpl(scope, controller, connectionFactory, streamFactory, streamFactory, streamFactory);
SynchronizerConfig config = SynchronizerConfig.builder().build();
@Cleanup StateSynchronizer<ReaderGroupState> stateSynchronizer = createState(stream, clientFactory, config);
AtomicLong clock = new AtomicLong();
Map<Segment, Long> segments = new HashMap<>();
segments.put(new Segment(scope, stream, 0), 123L);
segments.put(new Segment(scope, stream, 1), 456L);
ReaderGroupStateManager.initializeReaderGroup(stateSynchronizer, ReaderGroupConfig.builder().stream(Stream.of(scope, stream)).build(), segments);
ReaderGroupStateManager readerState1 = new ReaderGroupStateManager("testReader", stateSynchronizer, controller, clock::get);
readerState1.initializeReader(0);
Segment toRelease = readerState1.findSegmentToReleaseIfRequired();
assertNull(toRelease);
Map<Segment, Long> newSegments = readerState1.acquireNewSegmentsIfNeeded(0);
assertFalse(newSegments.isEmpty());
assertEquals(2, newSegments.size());
ReaderGroupStateManager readerState2 = new ReaderGroupStateManager("testReader2", stateSynchronizer, controller, clock::get);
readerState2.initializeReader(0);
clock.addAndGet(ReaderGroupStateManager.UPDATE_WINDOW.toNanos());
assertNotNull(readerState1.findSegmentToReleaseIfRequired());
boolean released = readerState1.releaseSegment(new Segment(scope, stream, 0), 789L, 0L);
assertTrue(released);
newSegments = readerState2.acquireNewSegmentsIfNeeded(0);
assertEquals(1, newSegments.size());
assertEquals(Long.valueOf(789L), newSegments.get(new Segment(scope, stream, 0)));
ReaderGroupStateManager.readerShutdown("testReader2", null, stateSynchronizer);
AssertExtensions.assertThrows(ReinitializationRequiredException.class, () -> readerState2.releaseSegment(new Segment(scope, stream, 0), 711L, 0L));
clock.addAndGet(ReaderGroupStateManager.UPDATE_WINDOW.toNanos());
newSegments = readerState1.acquireNewSegmentsIfNeeded(0);
assertEquals(1, newSegments.size());
assertEquals(Long.valueOf(789L), newSegments.get(new Segment(scope, stream, 0)));
AssertExtensions.assertThrows(ReinitializationRequiredException.class, () -> readerState2.acquireNewSegmentsIfNeeded(0L));
}
use of io.pravega.client.ClientFactory in project pravega by pravega.
the class ReaderGroupStateManagerTest method testSegmentSplit.
@Test(timeout = 20000)
public void testSegmentSplit() throws ReinitializationRequiredException {
String scope = "scope";
String stream = "stream";
PravegaNodeUri endpoint = new PravegaNodeUri("localhost", SERVICE_PORT);
MockConnectionFactoryImpl connectionFactory = new MockConnectionFactoryImpl();
Segment initialSegment = new Segment(scope, stream, 0);
Segment successorA = new Segment(scope, stream, 1);
Segment successorB = new Segment(scope, stream, 2);
MockController controller = new MockControllerWithSuccessors(endpoint.getEndpoint(), endpoint.getPort(), connectionFactory, new StreamSegmentsWithPredecessors(ImmutableMap.of(new SegmentWithRange(successorA, 0.0, 0.5), singletonList(0), new SegmentWithRange(successorB, 0.5, 1.0), singletonList(0)), ""));
MockSegmentStreamFactory streamFactory = new MockSegmentStreamFactory();
@Cleanup ClientFactory clientFactory = new ClientFactoryImpl(scope, controller, connectionFactory, streamFactory, streamFactory, streamFactory);
SynchronizerConfig config = SynchronizerConfig.builder().build();
@Cleanup StateSynchronizer<ReaderGroupState> stateSynchronizer = createState(stream, clientFactory, config);
Map<Segment, Long> segments = new HashMap<>();
segments.put(initialSegment, 1L);
ReaderGroupStateManager.initializeReaderGroup(stateSynchronizer, ReaderGroupConfig.builder().stream(Stream.of(scope, stream)).build(), segments);
val readerState = new ReaderGroupStateManager("testReader", stateSynchronizer, controller, null);
readerState.initializeReader(0);
Map<Segment, Long> newSegments = readerState.acquireNewSegmentsIfNeeded(0);
assertEquals(1, newSegments.size());
assertEquals(Long.valueOf(1), newSegments.get(initialSegment));
readerState.handleEndOfSegment(initialSegment);
newSegments = readerState.acquireNewSegmentsIfNeeded(0);
assertEquals(2, newSegments.size());
assertEquals(Long.valueOf(0), newSegments.get(successorA));
assertEquals(Long.valueOf(0), newSegments.get(successorB));
newSegments = readerState.acquireNewSegmentsIfNeeded(0);
assertTrue(newSegments.isEmpty());
}
use of io.pravega.client.ClientFactory in project pravega by pravega.
the class AutoScaleTest method scaleUpTxnTest.
/**
* Invoke the scale up Test with transactional writes. Produce traffic from multiple writers in parallel.
* Each writer writes using transactions.
* Transactions are committed quickly to give
* The test will periodically check if a scale event has occured by talking to controller via
* controller client.
*
* @throws InterruptedException if interrupted
* @throws URISyntaxException If URI is invalid
*/
private CompletableFuture<Void> scaleUpTxnTest() {
ControllerImpl controller = getController();
final AtomicBoolean exit = new AtomicBoolean(false);
ClientFactory clientFactory = getClientFactory();
startNewTxnWriter(clientFactory, exit);
// overall wait for test to complete in 260 seconds (4.2 minutes) or scale up, whichever happens first.
return Retry.withExpBackoff(10, 10, 30, Duration.ofSeconds(10).toMillis()).retryingOn(ScaleOperationNotDoneException.class).throwingOn(RuntimeException.class).runAsync(() -> controller.getCurrentSegments(SCOPE, SCALE_UP_TXN_STREAM_NAME).thenAccept(x -> {
if (x.getSegments().size() == 1) {
throw new ScaleOperationNotDoneException();
} else {
log.info("txn test scale up done successfully");
exit.set(true);
}
}), EXECUTOR_SERVICE);
}
Aggregations