use of io.pravega.client.connection.impl.ConnectionPoolImpl in project pravega by pravega.
the class WriteBatchTest method readWriteTest.
@Test(timeout = 60000)
public void readWriteTest() throws InterruptedException, ExecutionException {
String scope = "testBatchWrite";
String readerGroupName = "testBatchWriteRG";
// 20 readers -> 20 stream segments ( to have max read parallelism)
ScalingPolicy scalingPolicy = ScalingPolicy.fixed(20);
StreamConfiguration config = StreamConfiguration.builder().scalingPolicy(scalingPolicy).build();
ConcurrentLinkedQueue<Long> eventsReadFromPravega = new ConcurrentLinkedQueue<>();
AtomicLong eventData = new AtomicLong();
AtomicLong eventReadCount = new AtomicLong();
AtomicBoolean stopReadFlag = new AtomicBoolean(false);
ClientConfig clientConfig = ClientConfig.builder().build();
try (ConnectionPool cp = new ConnectionPoolImpl(clientConfig, new SocketConnectionFactoryImpl(clientConfig));
StreamManager streamManager = new StreamManagerImpl(controller, cp)) {
// create a scope
Boolean createScopeStatus = streamManager.createScope(scope);
log.info("Create scope status {}", createScopeStatus);
// create a stream
Boolean createStreamStatus = streamManager.createStream(scope, STREAM_NAME, config);
log.info("Create stream status {}", createStreamStatus);
}
try (ConnectionFactory connectionFactory = new SocketConnectionFactoryImpl(ClientConfig.builder().build());
ClientFactoryImpl clientFactory = new ClientFactoryImpl(scope, controller, connectionFactory);
ReaderGroupManager readerGroupManager = new ReaderGroupManagerImpl(scope, controller, clientFactory)) {
// start writing events to the stream
log.info("Creating {} writers", NUM_WRITERS);
List<CompletableFuture<Void>> writerList = new ArrayList<>();
for (int i = 0; i < NUM_WRITERS; i++) {
log.info("Starting writer{}", i);
writerList.add(startNewWriter(eventData, clientFactory));
}
// create a reader group
log.info("Creating Reader group : {}", readerGroupName);
readerGroupManager.createReaderGroup(readerGroupName, ReaderGroupConfig.builder().stream(Stream.of(scope, STREAM_NAME)).build());
log.info("Reader group name {} ", readerGroupManager.getReaderGroup(readerGroupName).getGroupName());
log.info("Reader group scope {}", readerGroupManager.getReaderGroup(readerGroupName).getScope());
// create readers
log.info("Creating {} readers", NUM_READERS);
List<CompletableFuture<Void>> readerList = new ArrayList<>();
String readerName = "reader" + RandomFactory.create().nextInt(Integer.MAX_VALUE);
// start reading events
for (int i = 0; i < NUM_READERS; i++) {
log.info("Starting reader{}", i);
readerList.add(startNewReader(readerName + i, clientFactory, readerGroupName, eventsReadFromPravega, eventData, eventReadCount, stopReadFlag));
}
// wait for writers completion
Futures.allOf(writerList).get();
// set stop read flag to true
stopReadFlag.set(true);
// wait for readers completion
Futures.allOf(readerList).get();
ExecutorServiceHelpers.shutdown(writerPool);
ExecutorServiceHelpers.shutdown(readerPool);
// delete readergroup
log.info("Deleting readergroup {}", readerGroupName);
readerGroupManager.deleteReaderGroup(readerGroupName);
}
log.info("All writers have stopped. Setting Stop_Read_Flag. Event Written Count:{}, Event Read " + "Count: {}", eventData.get(), eventsReadFromPravega.size());
assertEquals(totalNumberOfEvents.get(), eventsReadFromPravega.size());
// check unique events.
assertEquals(totalNumberOfEvents.get(), new TreeSet<>(eventsReadFromPravega).size());
// seal the stream
CompletableFuture<Boolean> sealStreamStatus = controller.sealStream(scope, STREAM_NAME);
log.info("Sealing stream {}", STREAM_NAME);
assertTrue(sealStreamStatus.get());
// delete the stream
CompletableFuture<Boolean> deleteStreamStatus = controller.deleteStream(scope, STREAM_NAME);
log.info("Deleting stream {}", STREAM_NAME);
assertTrue(deleteStreamStatus.get());
// delete the scope
CompletableFuture<Boolean> deleteScopeStatus = controller.deleteScope(scope);
log.info("Deleting scope {}", scope);
assertTrue(deleteScopeStatus.get());
log.info("Read write test succeeds");
}
use of io.pravega.client.connection.impl.ConnectionPoolImpl in project pravega by pravega.
the class EndToEndChannelLeakTest method testDetectChannelLeakSegmentSealedPooled.
@Test(timeout = 30000)
public void testDetectChannelLeakSegmentSealedPooled() throws Exception {
StreamConfiguration config = StreamConfiguration.builder().scalingPolicy(ScalingPolicy.fixed(1)).build();
Controller controller = controllerWrapper.getController();
controllerWrapper.getControllerService().createScope(SCOPE, 0L).get();
controller.createStream(SCOPE, STREAM_NAME, config).get();
// Set the max number connections to verify channel creation behaviour
final ClientConfig clientConfig = ClientConfig.builder().maxConnectionsPerSegmentStore(5).build();
@Cleanup SocketConnectionFactoryImpl connectionFactory = new SocketConnectionFactoryImpl(clientConfig, new InlineExecutor());
@Cleanup ConnectionPoolImpl connectionPool = new ConnectionPoolImpl(clientConfig, connectionFactory);
@Cleanup ClientFactoryImpl clientFactory = new ClientFactoryImpl(SCOPE, controller, connectionPool);
// Create a writer.
@Cleanup EventStreamWriter<String> writer = clientFactory.createEventWriter(SCOPE, serializer, writerConfig);
// Write an event.
writer.writeEvent("0", "zero").get();
assertChannelCount(1, connectionPool, connectionFactory);
@Cleanup ReaderGroupManager groupManager = new ReaderGroupManagerImpl(SCOPE, controller, clientFactory);
groupManager.createReaderGroup(READER_GROUP, ReaderGroupConfig.builder().disableAutomaticCheckpoints().groupRefreshTimeMillis(0).stream(Stream.of(SCOPE, STREAM_NAME)).build());
@Cleanup EventStreamReader<String> reader1 = clientFactory.createReader("readerId1", READER_GROUP, serializer, ReaderConfig.builder().disableTimeWindows(true).build());
// Read an event.
EventRead<String> event = reader1.readNextEvent(10000);
assertEquals("zero", event.getEvent());
// scale
Stream stream = new StreamImpl(SCOPE, SCOPE);
Map<Double, Double> map = new HashMap<>();
map.put(0.0, 0.33);
map.put(0.33, 0.66);
map.put(0.66, 1.0);
Boolean result = controller.scaleStream(stream, Collections.singletonList(0L), map, executor).getFuture().get();
assertTrue(result);
event = reader1.readNextEvent(0);
assertNull(event.getEvent());
@Cleanup ReaderGroup readerGroup = groupManager.getReaderGroup(READER_GROUP);
readerGroup.initiateCheckpoint("cp", executor);
event = reader1.readNextEvent(5000);
assertEquals("cp", event.getCheckpointName());
// Write more events.
writer.writeEvent("0", "one").get();
writer.writeEvent("0", "two").get();
writer.writeEvent("1", "three").get();
event = reader1.readNextEvent(10000);
assertNotNull(event.getEvent());
assertChannelCount(5, connectionPool, connectionFactory);
event = reader1.readNextEvent(10000);
assertNotNull(event.getEvent());
assertChannelCount(5, connectionPool, connectionFactory);
event = reader1.readNextEvent(10000);
assertNotNull(event.getEvent());
assertChannelCount(5, connectionPool, connectionFactory);
}
use of io.pravega.client.connection.impl.ConnectionPoolImpl in project pravega by pravega.
the class EndToEndChannelLeakTest method testDetectChannelLeakSegmentSealed.
@Test(timeout = 30000)
public void testDetectChannelLeakSegmentSealed() throws Exception {
StreamConfiguration config = StreamConfiguration.builder().scalingPolicy(ScalingPolicy.fixed(1)).build();
Controller controller = controllerWrapper.getController();
controllerWrapper.getControllerService().createScope(SCOPE, 0L).get();
controller.createStream(SCOPE, STREAM_NAME, config).get();
// Set the max number connections to verify channel creation behaviour
final ClientConfig clientConfig = ClientConfig.builder().maxConnectionsPerSegmentStore(500).build();
@Cleanup SocketConnectionFactoryImpl connectionFactory = new SocketConnectionFactoryImpl(clientConfig, executor);
@Cleanup ConnectionPoolImpl connectionPool = new ConnectionPoolImpl(clientConfig, connectionFactory);
@Cleanup ClientFactoryImpl clientFactory = new ClientFactoryImpl(SCOPE, controller, connectionPool);
int channelCount = 0;
assertChannelCount(channelCount, connectionPool, connectionFactory);
@Cleanup ReaderGroupManager groupManager = new ReaderGroupManagerImpl(SCOPE, controller, clientFactory);
groupManager.createReaderGroup(READER_GROUP, ReaderGroupConfig.builder().disableAutomaticCheckpoints().groupRefreshTimeMillis(0).stream(Stream.of(SCOPE, STREAM_NAME)).build());
// Should not add any connections
assertChannelCount(channelCount, connectionPool, connectionFactory);
// Create a writer.
@Cleanup EventStreamWriter<String> writer = clientFactory.createEventWriter(SCOPE, serializer, writerConfig);
// Write an event.
writer.writeEvent("0", "zero").get();
channelCount += 1;
assertChannelCount(channelCount, connectionPool, connectionFactory);
@Cleanup EventStreamReader<String> reader1 = clientFactory.createReader("readerId1", READER_GROUP, serializer, ReaderConfig.builder().disableTimeWindows(true).build());
// One for segment 3 for state synchronizer
channelCount += 4;
assertChannelCount(channelCount, connectionPool, connectionFactory);
// Read an event.
EventRead<String> event = reader1.readNextEvent(10000);
assertEquals("zero", event.getEvent());
channelCount += 1;
assertChannelCount(channelCount, connectionPool, connectionFactory);
// scale
Stream stream = new StreamImpl(SCOPE, SCOPE);
Map<Double, Double> map = new HashMap<>();
map.put(0.0, 0.33);
map.put(0.33, 0.66);
map.put(0.66, 1.0);
Boolean result = controller.scaleStream(stream, Collections.singletonList(0L), map, executor).getFuture().get();
assertTrue(result);
event = reader1.readNextEvent(0);
assertNull(event.getEvent());
// Reader should see EOS
channelCount -= 1;
assertChannelCount(channelCount, connectionPool, connectionFactory);
// should detect end of segment
writer.writeEvent("1", "one").get();
// Close one segment open 3.
channelCount += 2;
assertChannelCount(channelCount, connectionPool, connectionFactory);
ReaderGroup readerGroup = groupManager.getReaderGroup(READER_GROUP);
readerGroup.getMetrics().unreadBytes();
CompletableFuture<Checkpoint> future = readerGroup.initiateCheckpoint("cp1", executor);
// 3 more from the state synchronizer
channelCount += 4;
assertChannelCount(channelCount, connectionPool, connectionFactory);
event = reader1.readNextEvent(5000);
assertEquals("cp1", event.getCheckpointName());
event = reader1.readNextEvent(10000);
assertEquals("one", event.getEvent());
// From new segments on reader
channelCount += 3;
assertChannelCount(channelCount, connectionPool, connectionFactory);
future.join();
// Checkpoint should close connections back down
readerGroup.close();
channelCount -= 4;
assertChannelCount(channelCount, connectionPool, connectionFactory);
// Write more events.
writer.writeEvent("2", "two").get();
writer.writeEvent("3", "three").get();
writer.writeEvent("4", "four").get();
// no changes to socket count.
assertChannelCount(channelCount, connectionPool, connectionFactory);
event = reader1.readNextEvent(10000);
assertNotNull(event.getEvent());
// no changes to socket count.
assertChannelCount(channelCount, connectionPool, connectionFactory);
reader1.close();
// 3 from segments 4 from group state.
channelCount -= 7;
assertChannelCount(channelCount, connectionPool, connectionFactory);
groupManager.close();
writer.close();
assertChannelCount(0, connectionPool, connectionFactory);
}
use of io.pravega.client.connection.impl.ConnectionPoolImpl in project pravega by pravega.
the class EndToEndChannelLeakTest method testDetectChannelLeakMultiReaderPooled.
@Test(timeout = 30000)
public void testDetectChannelLeakMultiReaderPooled() throws Exception {
StreamConfiguration config = StreamConfiguration.builder().scalingPolicy(ScalingPolicy.byEventRate(10, 2, 1)).build();
// Set the max number connections to verify channel creation behaviour
final ClientConfig clientConfig = ClientConfig.builder().maxConnectionsPerSegmentStore(5).build();
Controller controller = controllerWrapper.getController();
controllerWrapper.getControllerService().createScope(SCOPE, 0L).get();
controller.createStream(SCOPE, STREAM_NAME, config).get();
@Cleanup SocketConnectionFactoryImpl connectionFactory = new SocketConnectionFactoryImpl(clientConfig, executor);
@Cleanup ConnectionPoolImpl connectionPool = new ConnectionPoolImpl(clientConfig, connectionFactory);
@Cleanup ClientFactoryImpl clientFactory = new ClientFactoryImpl(SCOPE, controller, connectionPool);
// open socket count.
int expectedChannelCount = 0;
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
// Create a writer and write an event.
@Cleanup EventStreamWriter<String> writer = clientFactory.createEventWriter(STREAM_NAME, serializer, writerConfig);
writer.writeEvent("0", "zero").get();
// connection to segment 0.
expectedChannelCount += 1;
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
@Cleanup ReaderGroupManager groupManager = new ReaderGroupManagerImpl(SCOPE, controller, clientFactory);
// no changes expected.
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
groupManager.createReaderGroup(READER_GROUP, ReaderGroupConfig.builder().disableAutomaticCheckpoints().groupRefreshTimeMillis(0).stream(Stream.of(SCOPE, STREAM_NAME)).build());
// create a reader and read an event.
@Cleanup EventStreamReader<String> reader1 = clientFactory.createReader("readerId1", READER_GROUP, serializer, ReaderConfig.builder().disableTimeWindows(true).build());
// Creating a reader spawns a revisioned stream client which opens 4 sockets ( read, write, metadataClient and conditionalUpdates).
EventRead<String> event = reader1.readNextEvent(10000);
// reader creates a new connection to the segment 0;
assertEquals("zero", event.getEvent());
// Connection to segment 0 does not cause an increase in number of open connections since we have reached the maxConnection count.
assertChannelCount(5, connectionPool, connectionFactory);
// scale
Stream stream = new StreamImpl(SCOPE, STREAM_NAME);
Map<Double, Double> map = new HashMap<>();
map.put(0.0, 0.33);
map.put(0.33, 0.66);
map.put(0.66, 1.0);
Boolean result = controller.scaleStream(stream, Collections.singletonList(0L), map, executor).getFuture().get();
assertTrue(result);
// No changes to the channel count.
assertChannelCount(5, connectionPool, connectionFactory);
// Reaches EOS
event = reader1.readNextEvent(1000);
assertNull(event.getEvent());
// Write more events.
writer.writeEvent("1", "one").get();
writer.writeEvent("2", "two").get();
writer.writeEvent("3", "three").get();
writer.writeEvent("4", "four").get();
writer.writeEvent("5", "five").get();
writer.writeEvent("6", "six").get();
// 2 new flows are opened.(+3 connections to the segments 1,2,3 after scale by the writer,
// -1 flow to segment 0 which is sealed.)
assertChannelCount(5, connectionPool, connectionFactory);
ReaderGroup readerGroup = groupManager.getReaderGroup(READER_GROUP);
CompletableFuture<Checkpoint> future = readerGroup.initiateCheckpoint("cp1", executor);
// 4 more from the state synchronizer
assertChannelCount(5, connectionPool, connectionFactory);
event = reader1.readNextEvent(5000);
assertEquals("cp1", event.getCheckpointName());
event = reader1.readNextEvent(5000);
assertNotNull(event.getEvent());
future.join();
// Checkpoint should close connections back down
readerGroup.close();
assertChannelCount(5, connectionPool, connectionFactory);
event = reader1.readNextEvent(10000);
assertNotNull(event.getEvent());
assertChannelCount(5, connectionPool, connectionFactory);
}
use of io.pravega.client.connection.impl.ConnectionPoolImpl in project pravega by pravega.
the class EndToEndChannelLeakTest method testDetectChannelLeakMultiReader.
@Test(timeout = 30000)
public void testDetectChannelLeakMultiReader() throws Exception {
StreamConfiguration config = StreamConfiguration.builder().scalingPolicy(ScalingPolicy.byEventRate(10, 2, 1)).build();
// Set the max number connections to verify channel creation behaviour
final ClientConfig clientConfig = ClientConfig.builder().maxConnectionsPerSegmentStore(500).build();
Controller controller = controllerWrapper.getController();
controllerWrapper.getControllerService().createScope(SCOPE, 0L).get();
controller.createStream(SCOPE, STREAM_NAME, config).get();
@Cleanup SocketConnectionFactoryImpl connectionFactory = new SocketConnectionFactoryImpl(clientConfig, new InlineExecutor());
@Cleanup ConnectionPoolImpl connectionPool = new ConnectionPoolImpl(clientConfig, connectionFactory);
@Cleanup ClientFactoryImpl clientFactory = new ClientFactoryImpl(SCOPE, controller, connectionPool);
// open socket count.
int expectedChannelCount = 0;
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
// Create a writer and write an event.
@Cleanup EventStreamWriter<String> writer = clientFactory.createEventWriter(STREAM_NAME, serializer, writerConfig);
writer.writeEvent("0", "zero").get();
// connection to segment 0.
expectedChannelCount += 1;
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
@Cleanup ReaderGroupManager groupManager = new ReaderGroupManagerImpl(SCOPE, controller, clientFactory);
// no changes expected.
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
groupManager.createReaderGroup(READER_GROUP, ReaderGroupConfig.builder().disableAutomaticCheckpoints().groupRefreshTimeMillis(0).stream(Stream.of(SCOPE, STREAM_NAME)).build());
// create a reader and read an event.
@Cleanup EventStreamReader<String> reader1 = clientFactory.createReader("readerId1", READER_GROUP, serializer, ReaderConfig.builder().disableTimeWindows(true).build());
// Creating a reader spawns a revisioned stream client which opens 4 sockets ( read, write, metadataClient and conditionalUpdates).
expectedChannelCount += 4;
EventRead<String> event = reader1.readNextEvent(10000);
// reader creates a new connection to the segment 0;
expectedChannelCount += 1;
assertEquals("zero", event.getEvent());
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
// scale
Stream stream = new StreamImpl(SCOPE, STREAM_NAME);
Map<Double, Double> map = new HashMap<>();
map.put(0.0, 0.33);
map.put(0.33, 0.66);
map.put(0.66, 1.0);
Boolean result = controller.scaleStream(stream, Collections.singletonList(0L), map, executor).getFuture().get();
assertTrue(result);
// No changes to the channel count.
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
event = reader1.readNextEvent(0);
assertNull(event.getEvent());
event = reader1.readNextEvent(0);
assertNull(event.getEvent());
// should decrease channel count from close connection
expectedChannelCount -= 1;
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
// Write more events.
writer.writeEvent("1", "one").get();
writer.writeEvent("2", "two").get();
writer.writeEvent("3", "three").get();
writer.writeEvent("4", "four").get();
writer.writeEvent("5", "five").get();
writer.writeEvent("6", "six").get();
// Open 3 new segments close one old one.
expectedChannelCount += 2;
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
ReaderGroup readerGroup = groupManager.getReaderGroup(READER_GROUP);
CompletableFuture<Checkpoint> future = readerGroup.initiateCheckpoint("cp1", executor);
// 4 more from the state synchronizer
expectedChannelCount += 4;
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
event = reader1.readNextEvent(5000);
assertEquals("cp1", event.getCheckpointName());
// Add a new reader
@Cleanup EventStreamReader<String> reader2 = clientFactory.createReader("readerId2", READER_GROUP, serializer, ReaderConfig.builder().disableTimeWindows(true).build());
// Creating a reader spawns a revisioned stream client which opens 4 sockets ( read, write, metadataClient and conditionalUpdates).
expectedChannelCount += 4;
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
event = reader1.readNextEvent(5000);
assertNotNull(event.getEvent());
event = reader2.readNextEvent(5000);
assertNotNull(event.getEvent());
// 3 more from the new segments
expectedChannelCount += 3;
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
future.join();
// Checkpoint should close connections back down
readerGroup.close();
expectedChannelCount -= 4;
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
reader1.close();
reader2.close();
expectedChannelCount -= 8 + 3;
assertChannelCount(expectedChannelCount, connectionPool, connectionFactory);
}
Aggregations