use of com.datastax.dse.driver.api.core.graph.AsyncGraphResultSet in project java-driver by datastax.
the class ContinuousGraphRequestHandlerSpeculativeExecutionTest method should_fail_if_no_nodes.
@Test
@UseDataProvider(location = DseTestDataProviders.class, value = "idempotentGraphConfig")
public void should_fail_if_no_nodes(boolean defaultIdempotence, GraphStatement<?> statement) {
GraphRequestHandlerTestHarness.Builder harnessBuilder = GraphRequestHandlerTestHarness.builder().withDefaultIdempotence(defaultIdempotence);
try (GraphRequestHandlerTestHarness 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);
GraphBinaryModule module = createGraphBinaryModule(harness.getContext());
CompletionStage<AsyncGraphResultSet> resultSetFuture = new ContinuousGraphRequestHandler(statement, harness.getSession(), harness.getContext(), "test", module, graphSupportChecker).handle();
assertThatStage(resultSetFuture).isFailed(error -> assertThat(error).isInstanceOf(NoNodeAvailableException.class));
}
}
use of com.datastax.dse.driver.api.core.graph.AsyncGraphResultSet in project java-driver by datastax.
the class ContinuousGraphRequestHandlerSpeculativeExecutionTest method should_not_start_execution_if_result_complete.
@Test
@UseDataProvider(location = DseTestDataProviders.class, value = "idempotentGraphConfig")
public void should_not_start_execution_if_result_complete(boolean defaultIdempotence, GraphStatement<?> statement) throws Exception {
GraphRequestHandlerTestHarness.Builder harnessBuilder = GraphRequestHandlerTestHarness.builder().withGraphTimeout(Duration.ofSeconds(10)).withDefaultIdempotence(defaultIdempotence);
PoolBehavior node1Behavior = harnessBuilder.customBehavior(node1);
PoolBehavior node2Behavior = harnessBuilder.customBehavior(node2);
try (GraphRequestHandlerTestHarness 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);
GraphBinaryModule module = createGraphBinaryModule(harness.getContext());
ContinuousGraphRequestHandler requestHandler = new ContinuousGraphRequestHandler(statement, harness.getSession(), harness.getContext(), "test", module, graphSupportChecker);
CompletionStage<AsyncGraphResultSet> resultSetFuture = requestHandler.handle();
node1Behavior.verifyWrite();
node1Behavior.setWriteSuccess();
// The first timeout scheduled should be the global timeout
CapturedTimeout globalTimeout = harness.nextScheduledTimeout();
assertThat(globalTimeout.getDelay(TimeUnit.SECONDS)).isEqualTo(10);
// Check that the first execution was scheduled but don't run it yet
CapturedTimeout speculativeExecution1 = harness.nextScheduledTimeout();
assertThat(speculativeExecution1.getDelay(TimeUnit.MILLISECONDS)).isEqualTo(firstExecutionDelay);
// Complete the request from the initial execution
node1Behavior.setResponseSuccess(defaultDseFrameOf(singleGraphRow(GraphProtocol.GRAPH_BINARY_1_0, module)));
assertThatStage(resultSetFuture).isSuccess();
// Pending speculative executions should have been cancelled. However we don't check
// firstExecutionTask directly because the request handler's onResponse can sometimes be
// invoked before operationComplete (this is very unlikely in practice, but happens in our
// Travis CI build). When that happens, the speculative execution is not recorded yet when
// cancelScheduledTasks runs.
// The fact that we missed the speculative execution is not a problem; even if it starts, it
// will eventually find out that the result is already complete and cancel itself:
speculativeExecution1.task().run(speculativeExecution1);
node2Behavior.verifyNoWrite();
verify(nodeMetricUpdater1).updateTimer(eq(DseNodeMetric.GRAPH_MESSAGES), eq(DriverExecutionProfile.DEFAULT_NAME), anyLong(), eq(TimeUnit.NANOSECONDS));
verifyNoMoreInteractions(nodeMetricUpdater1);
}
}
use of com.datastax.dse.driver.api.core.graph.AsyncGraphResultSet in project java-driver by datastax.
the class ContinuousGraphRequestHandlerSpeculativeExecutionTest method should_retry_in_speculative_executions.
@Test
@UseDataProvider(location = DseTestDataProviders.class, value = "idempotentGraphConfig")
public void should_retry_in_speculative_executions(boolean defaultIdempotence, GraphStatement<?> statement) throws Exception {
GraphRequestHandlerTestHarness.Builder harnessBuilder = GraphRequestHandlerTestHarness.builder().withDefaultIdempotence(defaultIdempotence);
PoolBehavior node1Behavior = harnessBuilder.customBehavior(node1);
PoolBehavior node2Behavior = harnessBuilder.customBehavior(node2);
PoolBehavior node3Behavior = harnessBuilder.customBehavior(node3);
try (GraphRequestHandlerTestHarness 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);
GraphBinaryModule module = createGraphBinaryModule(harness.getContext());
CompletionStage<AsyncGraphResultSet> resultSetFuture = new ContinuousGraphRequestHandler(statement, harness.getSession(), harness.getContext(), "test", module, graphSupportChecker).handle();
node1Behavior.verifyWrite();
node1Behavior.setWriteSuccess();
// do not simulate a response from node1. The request will stay hanging for the rest of this
// test
// 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);
node2Behavior.verifyWrite();
node2Behavior.setWriteSuccess();
// node2 replies with a response that triggers a RETRY_NEXT
node2Behavior.setResponseSuccess(defaultDseFrameOf(new Error(ProtocolConstants.ErrorCode.IS_BOOTSTRAPPING, "mock message")));
node3Behavior.setResponseSuccess(defaultDseFrameOf(singleGraphRow(GraphProtocol.GRAPH_BINARY_1_0, module)));
// The second execution should move to node3 and complete the request
assertThatStage(resultSetFuture).isSuccess();
// The request to node1 was still in flight, it should have been cancelled
node1Behavior.verifyCancellation();
}
}
use of com.datastax.dse.driver.api.core.graph.AsyncGraphResultSet in project java-driver by datastax.
the class GraphResultSetsTest method should_create_result_set_from_multiple_pages.
@Test
public void should_create_result_set_from_multiple_pages() {
// Given
AsyncGraphResultSet page1 = mockPage(true, 0, 1, 2);
AsyncGraphResultSet page2 = mockPage(true, 3, 4, 5);
AsyncGraphResultSet page3 = mockPage(false, 6, 7, 8);
complete(page1.fetchNextPage(), page2);
complete(page2.fetchNextPage(), page3);
// When
GraphResultSet resultSet = GraphResultSets.toSync(page1);
// Then
assertThat(resultSet.iterator().hasNext()).isTrue();
assertThat(resultSet.getRequestExecutionInfo()).isSameAs(page1.getRequestExecutionInfo());
assertThat(((MultiPageGraphResultSet) resultSet).getRequestExecutionInfos()).containsExactly(page1.getRequestExecutionInfo());
Iterator<GraphNode> iterator = resultSet.iterator();
assertNextRow(iterator, 0);
assertNextRow(iterator, 1);
assertNextRow(iterator, 2);
assertThat(iterator.hasNext()).isTrue();
// This should have triggered the fetch of page2
assertThat(resultSet.getRequestExecutionInfo()).isEqualTo(page2.getRequestExecutionInfo());
assertThat(((MultiPageGraphResultSet) resultSet).getRequestExecutionInfos()).containsExactly(page1.getRequestExecutionInfo(), page2.getRequestExecutionInfo());
assertNextRow(iterator, 3);
assertNextRow(iterator, 4);
assertNextRow(iterator, 5);
assertThat(iterator.hasNext()).isTrue();
// This should have triggered the fetch of page3
assertThat(resultSet.getRequestExecutionInfo()).isEqualTo(page3.getRequestExecutionInfo());
assertThat(((MultiPageGraphResultSet) resultSet).getRequestExecutionInfos()).containsExactly(page1.getRequestExecutionInfo(), page2.getRequestExecutionInfo(), page3.getRequestExecutionInfo());
assertNextRow(iterator, 6);
assertNextRow(iterator, 7);
assertNextRow(iterator, 8);
}
use of com.datastax.dse.driver.api.core.graph.AsyncGraphResultSet in project java-driver by datastax.
the class ContinuousGraphRequestHandlerTest method should_honor_statement_timeout.
@Test
public void should_honor_statement_timeout() throws Exception {
// given
GraphBinaryModule binaryModule = createGraphBinaryModule(mockContext);
Duration defaultTimeout = Duration.ofSeconds(1);
Duration statementTimeout = Duration.ofSeconds(2);
RequestHandlerTestHarness.Builder builder = GraphRequestHandlerTestHarness.builder().withGraphTimeout(defaultTimeout);
PoolBehavior node1Behavior = builder.customBehavior(node);
try (RequestHandlerTestHarness harness = builder.build()) {
DriverExecutionProfile profile = harness.getContext().getConfig().getDefaultProfile();
when(profile.isDefined(DseDriverOption.GRAPH_SUB_PROTOCOL)).thenReturn(true);
when(profile.getString(DseDriverOption.GRAPH_SUB_PROTOCOL)).thenReturn(GraphProtocol.GRAPH_BINARY_1_0.toInternalCode());
GraphStatement<?> graphStatement = ScriptGraphStatement.newInstance("mockQuery").setTimeout(statementTimeout);
// when
ContinuousGraphRequestHandler handler = new ContinuousGraphRequestHandler(graphStatement, harness.getSession(), harness.getContext(), "test", binaryModule, new GraphSupportChecker());
// send the initial request
CompletionStage<AsyncGraphResultSet> page1Future = handler.handle();
// acknowledge the write, will set the global timeout
node1Behavior.verifyWrite();
node1Behavior.setWriteSuccess();
CapturedTimeout globalTimeout = harness.nextScheduledTimeout();
assertThat(globalTimeout.getDelay(TimeUnit.NANOSECONDS)).isEqualTo(statementTimeout.toNanos());
// will trigger the global timeout and complete it exceptionally
globalTimeout.task().run(globalTimeout);
assertThat(page1Future.toCompletableFuture()).isCompletedExceptionally();
assertThatThrownBy(() -> page1Future.toCompletableFuture().get()).hasRootCauseExactlyInstanceOf(DriverTimeoutException.class).hasMessageContaining("Query timed out after " + statementTimeout);
}
}
Aggregations