use of io.pravega.client.control.impl.Controller in project pravega by pravega.
the class EndToEndTxnWithTest method testTxnWithErrors.
@Test(timeout = 30000)
public void testTxnWithErrors() throws Exception {
String scope = "scope";
String stream = "testTxnWithErrors";
StreamConfiguration config = StreamConfiguration.builder().scalingPolicy(ScalingPolicy.fixed(1)).build();
Controller controller = PRAVEGA.getLocalController();
controller.createScope(scope).get();
controller.createStream(scope, stream, config).get();
@Cleanup ConnectionFactory connectionFactory = new SocketConnectionFactoryImpl(ClientConfig.builder().build());
@Cleanup ClientFactoryImpl clientFactory = new ClientFactoryImpl(scope, controller, connectionFactory);
@Cleanup TransactionalEventStreamWriter<String> test = clientFactory.createTransactionalEventWriter("writer", stream, new UTF8StringSerializer(), EventWriterConfig.builder().transactionTimeoutTime(10000).build());
Transaction<String> transaction = test.beginTxn();
transaction.writeEvent("0", "txntest1");
// abort the transaction to simulate a txn abort due to a missing ping request.
controller.abortTransaction(Stream.of(scope, stream), transaction.getTxnId()).join();
// check the status of the transaction.
assertEventuallyEquals(Transaction.Status.ABORTED, () -> controller.checkTransactionStatus(Stream.of(scope, stream), transaction.getTxnId()).join(), 10000);
transaction.writeEvent("0", "txntest2");
// verify that commit fails with TxnFailedException.
assertThrows("TxnFailedException should be thrown", () -> transaction.commit(), t -> t instanceof TxnFailedException);
}
use of io.pravega.client.control.impl.Controller in project pravega by pravega.
the class EndToEndTxnWithTest method testGetTxnWithScale.
@Test(timeout = 20000)
public void testGetTxnWithScale() throws Exception {
String streamName = "testGetTxnWithScale";
final StreamConfiguration config = StreamConfiguration.builder().scalingPolicy(ScalingPolicy.fixed(1)).build();
final Serializer<String> serializer = new UTF8StringSerializer();
final EventWriterConfig writerConfig = EventWriterConfig.builder().transactionTimeoutTime(10000).build();
final Controller controller = PRAVEGA.getLocalController();
controller.createScope("test").get();
controller.createStream("test", streamName, config).get();
@Cleanup ConnectionFactory connectionFactory = new SocketConnectionFactoryImpl(ClientConfig.builder().build());
@Cleanup ClientFactoryImpl clientFactory = new ClientFactoryImpl("test", controller, connectionFactory);
@Cleanup EventStreamWriter<String> streamWriter = clientFactory.createEventWriter(streamName, serializer, writerConfig);
streamWriter.writeEvent("key", "e").join();
@Cleanup TransactionalEventStreamWriter<String> txnWriter = clientFactory.createTransactionalEventWriter(streamName, serializer, writerConfig);
Transaction<String> txn = txnWriter.beginTxn();
txn.writeEvent("key", "1");
txn.flush();
// the txn is not yet committed here.
UUID txnId = txn.getTxnId();
// scale up stream
scaleUpStream(streamName);
// write event using stream writer
streamWriter.writeEvent("key", "e").join();
Transaction<String> txn1 = txnWriter.getTxn(txnId);
txn1.writeEvent("key", "2");
txn1.flush();
// commit the transaction
txn1.commit();
assertEventuallyEquals(Transaction.Status.COMMITTED, txn1::checkStatus, 5000);
String group = "testGetTxnWithScale-group";
@Cleanup ReaderGroupManager groupManager = new ReaderGroupManagerImpl("test", controller, clientFactory);
groupManager.createReaderGroup(group, ReaderGroupConfig.builder().disableAutomaticCheckpoints().groupRefreshTimeMillis(0).stream("test/" + streamName).build());
@Cleanup EventStreamReader<String> reader = clientFactory.createReader("readerId", group, new UTF8StringSerializer(), ReaderConfig.builder().build());
EventRead<String> event = reader.readNextEvent(5000);
assertEquals("e", event.getEvent());
assertNull(reader.readNextEvent(100).getEvent());
groupManager.getReaderGroup(group).initiateCheckpoint("cp1", executorService());
event = reader.readNextEvent(5000);
assertEquals("Checkpoint event expected", "cp1", event.getCheckpointName());
event = reader.readNextEvent(5000);
assertEquals("second event post scale up", "e", event.getEvent());
assertNull(reader.readNextEvent(100).getEvent());
groupManager.getReaderGroup(group).initiateCheckpoint("cp2", executorService());
event = reader.readNextEvent(5000);
assertEquals("Checkpoint event expected", "cp2", event.getCheckpointName());
event = reader.readNextEvent(5000);
assertEquals("txn events", "1", event.getEvent());
event = reader.readNextEvent(5000);
assertEquals("txn events", "2", event.getEvent());
}
use of io.pravega.client.control.impl.Controller in project pravega by pravega.
the class EndToEndTxnWithTest method testTxnConfig.
@Test(timeout = 10000)
public void testTxnConfig() throws Exception {
// create stream test
StreamConfiguration config = StreamConfiguration.builder().scalingPolicy(ScalingPolicy.byEventRate(10, 2, 1)).build();
Controller controller = PRAVEGA.getLocalController();
controller.createScope("test").get();
String streamName = "testTxnConfig";
controller.createStream("test", streamName, config).get();
@Cleanup ConnectionFactory connectionFactory = new SocketConnectionFactoryImpl(ClientConfig.builder().build());
@Cleanup ClientFactoryImpl clientFactory = new ClientFactoryImpl("test", controller, connectionFactory);
// create writers with different configs and try creating transactions against those configs
EventWriterConfig defaultConfig = EventWriterConfig.builder().build();
assertNotNull(createTxn(clientFactory, defaultConfig, streamName));
EventWriterConfig validConfig = EventWriterConfig.builder().transactionTimeoutTime(10000).build();
assertNotNull(createTxn(clientFactory, validConfig, streamName));
AssertExtensions.assertThrows("low timeout period not honoured", () -> {
EventWriterConfig lowTimeoutConfig = EventWriterConfig.builder().transactionTimeoutTime(1000).build();
createTxn(clientFactory, lowTimeoutConfig, streamName);
}, e -> Exceptions.unwrap(e) instanceof IllegalArgumentException);
EventWriterConfig highTimeoutConfig = EventWriterConfig.builder().transactionTimeoutTime(700 * 1000).build();
AssertExtensions.assertThrows("lease value too large, max value is 600000", () -> createTxn(clientFactory, highTimeoutConfig, streamName), e -> e instanceof IllegalArgumentException);
}
use of io.pravega.client.control.impl.Controller in project pravega by pravega.
the class EndToEndTxnWithTest method testTxnWithScale.
@Test(timeout = 10000)
public void testTxnWithScale() throws Exception {
StreamConfiguration config = StreamConfiguration.builder().scalingPolicy(ScalingPolicy.fixed(1)).build();
Controller controller = PRAVEGA.getLocalController();
controller.createScope("test").get();
String streamName = "testTxnWithScale";
controller.createStream("test", streamName, config).get();
@Cleanup ConnectionFactory connectionFactory = new SocketConnectionFactoryImpl(ClientConfig.builder().build());
@Cleanup ClientFactoryImpl clientFactory = new ClientFactoryImpl("test", controller, connectionFactory);
@Cleanup TransactionalEventStreamWriter<String> test = clientFactory.createTransactionalEventWriter("writer", streamName, new UTF8StringSerializer(), EventWriterConfig.builder().transactionTimeoutTime(10000).build());
Transaction<String> transaction1 = test.beginTxn();
transaction1.writeEvent("0", "txntest1");
transaction1.commit();
assertEventuallyEquals(Transaction.Status.COMMITTED, () -> transaction1.checkStatus(), 5000);
// scale
Stream stream = new StreamImpl("test", streamName);
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, executorService()).getFuture().get();
assertTrue(result);
Transaction<String> transaction2 = test.beginTxn();
transaction2.writeEvent("0", "txntest2");
transaction2.commit();
String group = "testTxnWithScale-group";
@Cleanup ReaderGroupManager groupManager = new ReaderGroupManagerImpl("test", controller, clientFactory);
groupManager.createReaderGroup(group, ReaderGroupConfig.builder().disableAutomaticCheckpoints().groupRefreshTimeMillis(0).stream("test/" + streamName).build());
@Cleanup EventStreamReader<String> reader = clientFactory.createReader("readerId", group, new UTF8StringSerializer(), ReaderConfig.builder().build());
EventRead<String> event = reader.readNextEvent(5000);
assertNotNull(event.getEvent());
assertEquals("txntest1", event.getEvent());
assertNull(reader.readNextEvent(100).getEvent());
groupManager.getReaderGroup(group).initiateCheckpoint("cp", executorService());
event = reader.readNextEvent(5000);
assertEquals("cp", event.getCheckpointName());
event = reader.readNextEvent(5000);
assertNotNull(event.getEvent());
assertEquals("txntest2", event.getEvent());
}
use of io.pravega.client.control.impl.Controller in project pravega by pravega.
the class ScaleTest method main.
public static void main(String[] args) throws Exception {
try {
@Cleanup("shutdownNow") val executor = ExecutorServiceHelpers.newScheduledThreadPool(1, "test");
@Cleanup TestingServer zkTestServer = new TestingServerStarter().start();
ServiceBuilder serviceBuilder = ServiceBuilder.newInMemoryBuilder(ServiceBuilderConfig.getDefaultConfig());
serviceBuilder.initialize();
StreamSegmentStore store = serviceBuilder.createStreamSegmentService();
TableStore tableStore = serviceBuilder.createTableStoreService();
int port = Config.SERVICE_PORT;
@Cleanup PravegaConnectionListener server = new PravegaConnectionListener(false, port, store, tableStore, serviceBuilder.getLowPriorityExecutor());
server.startListening();
// Create controller object for testing against a separate controller report.
@Cleanup ControllerWrapper controllerWrapper = new ControllerWrapper(zkTestServer.getConnectString(), port);
Controller controller = controllerWrapper.getController();
final String scope = "scope";
controllerWrapper.getControllerService().createScope(scope, 0L).get();
final String streamName = "stream1";
final StreamConfiguration config = StreamConfiguration.builder().scalingPolicy(ScalingPolicy.fixed(1)).build();
Stream stream = new StreamImpl(scope, streamName);
log.info("Creating stream {}/{}", scope, streamName);
if (!controller.createStream(scope, streamName, config).get()) {
log.error("Stream already existed, exiting");
return;
}
// Test 1: scale stream: split one segment into two
log.info("Scaling stream {}/{}, splitting one segment into two", scope, streamName);
Map<Double, Double> map = new HashMap<>();
map.put(0.0, 0.5);
map.put(0.5, 1.0);
if (!controller.scaleStream(stream, Collections.singletonList(0L), map, executor).getFuture().get()) {
log.error("Scale stream: splitting segment into two failed, exiting");
return;
}
// Test 2: scale stream: merge two segments into one
log.info("Scaling stream {}/{}, merging two segments into one", scope, streamName);
CompletableFuture<Boolean> scaleResponseFuture = controller.scaleStream(stream, Arrays.asList(1L, 2L), Collections.singletonMap(0.0, 1.0), executor).getFuture();
if (!scaleResponseFuture.get()) {
log.error("Scale stream: merging two segments into one failed, exiting");
return;
}
// Test 3: create a transaction, and try scale operation, it should fail with precondition check failure
CompletableFuture<TxnSegments> txnFuture = controller.createTransaction(stream, 5000);
TxnSegments transaction = txnFuture.get();
if (transaction == null) {
log.error("Create transaction failed, exiting");
return;
}
log.info("Scaling stream {}/{}, splitting one segment into two, while transaction is ongoing", scope, streamName);
scaleResponseFuture = controller.scaleStream(stream, Collections.singletonList(3L), map, executor).getFuture();
CompletableFuture<Boolean> future = scaleResponseFuture.whenComplete((r, e) -> {
if (e != null) {
log.error("Failed: scale with ongoing transaction.", e);
} else if (getAndHandleExceptions(controller.checkTransactionStatus(stream, transaction.getTxnId()), RuntimeException::new) != Transaction.Status.OPEN) {
log.info("Success: scale with ongoing transaction.");
} else {
log.error("Failed: scale with ongoing transaction.");
}
});
CompletableFuture<Void> statusFuture = controller.abortTransaction(stream, transaction.getTxnId());
statusFuture.get();
future.get();
log.info("All scaling test PASSED");
ExecutorServiceHelpers.shutdown(executor);
System.exit(0);
} catch (Throwable t) {
log.error("test failed with {}", t);
System.exit(-1);
}
}
Aggregations