use of com.datastax.oss.driver.api.core.AllNodesFailedException in project java-driver by datastax.
the class MapBasedConfigLoaderIT method should_create_policies_per_profile.
/**
* Checks that profiles that have specific policy options will get their own policy instance.
*/
@Test
public void should_create_policies_per_profile() {
// Given
// a query that throws UNAVAILABLE
String mockQuery = "mock query";
SIMULACRON_RULE.cluster().prime(when(mockQuery).then(unavailable(QUORUM, 3, 2)));
// a default profile that uses the default retry policy, and an alternate profile that uses a
// policy that ignores all errors
OptionsMap optionsMap = OptionsMap.driverDefaults();
String alternateProfile = "profile1";
optionsMap.put(alternateProfile, TypedDriverOption.RETRY_POLICY_CLASS, IgnoreAllPolicy.class.getName());
try (CqlSession session = CqlSession.builder().addContactEndPoints(SIMULACRON_RULE.getContactPoints()).withLocalDatacenter("dc1").withConfigLoader(DriverConfigLoader.fromMap(optionsMap)).build()) {
// When
// executing the query for the default profile
SimpleStatement defaultProfileStatement = SimpleStatement.newInstance(mockQuery);
assertThatThrownBy(() -> session.execute(defaultProfileStatement)).satisfies(t -> {
// Then
// the UNAVAILABLE error is surfaced
assertThat(t).isInstanceOf(AllNodesFailedException.class);
AllNodesFailedException anfe = (AllNodesFailedException) t;
assertThat(anfe.getAllErrors()).hasSize(1);
List<Throwable> nodeErrors = anfe.getAllErrors().values().iterator().next();
assertThat(nodeErrors).hasSize(1);
assertThat(nodeErrors.get(0)).isInstanceOf(UnavailableException.class);
});
// When
// executing the query for the alternate profile
SimpleStatement alternateProfileStatement = SimpleStatement.newInstance(mockQuery).setExecutionProfileName(alternateProfile);
ResultSet rs = session.execute(alternateProfileStatement);
// Then
// the error is ignored
assertThat(rs.one()).isNull();
}
}
use of com.datastax.oss.driver.api.core.AllNodesFailedException in project java-driver by datastax.
the class LifecycleListenerIT method should_not_notify_listener_when_init_fails.
@Test
public void should_not_notify_listener_when_init_fails() {
TestLifecycleListener listener = new TestLifecycleListener();
assertThat(listener.ready).isFalse();
assertThat(listener.closed).isFalse();
SIMULACRON_RULE.cluster().rejectConnections(0, RejectScope.STOP);
try (CqlSession session = newSession(listener)) {
fail("Expected AllNodesFailedException");
} catch (AllNodesFailedException ignored) {
} finally {
SIMULACRON_RULE.cluster().acceptConnections();
}
assertThat(listener.ready).isFalse();
await().atMost(1, TimeUnit.SECONDS).until(() -> listener.closed);
}
use of com.datastax.oss.driver.api.core.AllNodesFailedException in project java-driver by datastax.
the class NodeTargetingIT method should_fail_if_node_fails_query.
@Test
public void should_fail_if_node_fails_query() {
String query = "mock";
SIMULACRON_RULE.cluster().node(3).prime(when(query).then(unavailable(ConsistencyLevel.ALL, 1, 0)));
// given a statement with a node configured to fail the given query.
Node node3 = getNode(3);
Statement statement = SimpleStatement.newInstance(query).setNode(node3);
// when statement is executed an error should be raised.
try {
SESSION_RULE.session().execute(statement);
fail("Should have thrown AllNodesFailedException");
} catch (AllNodesFailedException e) {
assertThat(e.getAllErrors().size()).isEqualTo(1);
assertThat(e.getAllErrors().get(node3).get(0)).isInstanceOf(UnavailableException.class);
}
}
use of com.datastax.oss.driver.api.core.AllNodesFailedException in project java-driver by datastax.
the class CqlRequestHandlerSpeculativeExecutionTest method should_fail_if_no_more_nodes_and_initial_execution_is_last.
@Test
@UseDataProvider("idempotentConfig")
public void should_fail_if_no_more_nodes_and_initial_execution_is_last(boolean defaultIdempotence, Statement<?> statement) throws Exception {
RequestHandlerTestHarness.Builder harnessBuilder = RequestHandlerTestHarness.builder().withDefaultIdempotence(defaultIdempotence);
PoolBehavior node1Behavior = harnessBuilder.customBehavior(node1);
harnessBuilder.withResponse(node2, defaultFrameOf(new Error(ProtocolConstants.ErrorCode.IS_BOOTSTRAPPING, "mock message")));
try (RequestHandlerTestHarness harness = harnessBuilder.build()) {
SpeculativeExecutionPolicy speculativeExecutionPolicy = harness.getContext().getSpeculativeExecutionPolicy(DriverExecutionProfile.DEFAULT_NAME);
long firstExecutionDelay = 100L;
when(speculativeExecutionPolicy.nextExecution(any(Node.class), eq(null), eq(statement), eq(1))).thenReturn(firstExecutionDelay);
CompletionStage<AsyncResultSet> resultSetFuture = new CqlRequestHandler(statement, harness.getSession(), harness.getContext(), "test").handle();
node1Behavior.verifyWrite();
node1Behavior.setWriteSuccess();
// do not simulate a response from node1 yet
// Discard the timeout task
harness.nextScheduledTimeout();
// Run the next scheduled task to start the speculative execution. node2 will reply with a
// BOOTSTRAPPING error, causing a RETRY_NEXT; but the query plan is now empty so the
// speculative execution stops.
// next scheduled timeout should be the first speculative execution. Get it and run it.
CapturedTimeout speculativeExecution1 = harness.nextScheduledTimeout();
assertThat(speculativeExecution1.getDelay(TimeUnit.MILLISECONDS)).isEqualTo(firstExecutionDelay);
speculativeExecution1.task().run(speculativeExecution1);
// node1 now replies with the same response, that triggers a RETRY_NEXT
node1Behavior.setResponseSuccess(defaultFrameOf(new Error(ProtocolConstants.ErrorCode.IS_BOOTSTRAPPING, "mock message")));
// But again the query plan is empty so that should fail the request
assertThatStage(resultSetFuture).isFailed(error -> {
assertThat(error).isInstanceOf(AllNodesFailedException.class);
Map<Node, List<Throwable>> nodeErrors = ((AllNodesFailedException) error).getAllErrors();
assertThat(nodeErrors).containsOnlyKeys(node1, node2);
assertThat(nodeErrors.get(node1).get(0)).isInstanceOf(BootstrappingException.class);
assertThat(nodeErrors.get(node2).get(0)).isInstanceOf(BootstrappingException.class);
});
}
}
use of com.datastax.oss.driver.api.core.AllNodesFailedException in project java-driver by datastax.
the class CqlRequestHandlerSpeculativeExecutionTest method should_fail_if_no_more_nodes_and_speculative_execution_is_last.
@Test
@UseDataProvider("idempotentConfig")
public void should_fail_if_no_more_nodes_and_speculative_execution_is_last(boolean defaultIdempotence, Statement<?> statement) throws Exception {
RequestHandlerTestHarness.Builder harnessBuilder = RequestHandlerTestHarness.builder().withDefaultIdempotence(defaultIdempotence);
PoolBehavior node1Behavior = harnessBuilder.customBehavior(node1);
PoolBehavior node2Behavior = harnessBuilder.customBehavior(node2);
try (RequestHandlerTestHarness harness = harnessBuilder.build()) {
SpeculativeExecutionPolicy speculativeExecutionPolicy = harness.getContext().getSpeculativeExecutionPolicy(DriverExecutionProfile.DEFAULT_NAME);
long firstExecutionDelay = 100L;
when(speculativeExecutionPolicy.nextExecution(any(Node.class), eq(null), eq(statement), eq(1))).thenReturn(firstExecutionDelay);
CompletionStage<AsyncResultSet> resultSetFuture = new CqlRequestHandler(statement, harness.getSession(), harness.getContext(), "test").handle();
node1Behavior.verifyWrite();
node1Behavior.setWriteSuccess();
// do not simulate a response from node1 yet
// Discard the timeout task
harness.nextScheduledTimeout();
// next scheduled timeout should be the first speculative execution. Get it and run it.
CapturedTimeout speculativeExecution1 = harness.nextScheduledTimeout();
assertThat(speculativeExecution1.getDelay(TimeUnit.MILLISECONDS)).isEqualTo(firstExecutionDelay);
speculativeExecution1.task().run(speculativeExecution1);
// node1 now replies with a BOOTSTRAPPING error that triggers a RETRY_NEXT
// but the query plan is empty so the initial execution stops
node1Behavior.setResponseSuccess(defaultFrameOf(new Error(ProtocolConstants.ErrorCode.IS_BOOTSTRAPPING, "mock message")));
// Same thing with node2, so the speculative execution should reach the end of the query plan
// and fail the request
node2Behavior.setResponseSuccess(defaultFrameOf(new Error(ProtocolConstants.ErrorCode.IS_BOOTSTRAPPING, "mock message")));
assertThatStage(resultSetFuture).isFailed(error -> {
assertThat(error).isInstanceOf(AllNodesFailedException.class);
Map<Node, List<Throwable>> nodeErrors = ((AllNodesFailedException) error).getAllErrors();
assertThat(nodeErrors).containsOnlyKeys(node1, node2);
assertThat(nodeErrors.get(node1).get(0)).isInstanceOf(BootstrappingException.class);
assertThat(nodeErrors.get(node2).get(0)).isInstanceOf(BootstrappingException.class);
});
}
}
Aggregations