@Test(groups = "unit") public void should_expose_decision_properties() throws Throwable { RetryDecision retryAtOne = RetryDecision.retry(ONE); assertThat(retryAtOne.getType()).isEqualTo(RETRY); assertThat(retryAtOne.getRetryConsistencyLevel()).isEqualTo(ONE); assertThat(retryAtOne.isRetryCurrent()).isTrue(); assertThat(retryAtOne.toString()).isEqualTo("Retry at ONE on same host."); RetryDecision tryNextAtOne = RetryDecision.tryNextHost(ONE); assertThat(tryNextAtOne.getType()).isEqualTo(RETRY); assertThat(tryNextAtOne.getRetryConsistencyLevel()).isEqualTo(ONE); assertThat(tryNextAtOne.isRetryCurrent()).isFalse(); assertThat(tryNextAtOne.toString()).isEqualTo("Retry at ONE on next host."); RetryDecision rethrow = RetryDecision.rethrow(); assertThat(rethrow.getType()).isEqualTo(RETHROW); assertThat(rethrow.toString()).isEqualTo("Rethrow"); RetryDecision ignore = RetryDecision.ignore(); assertThat(ignore.getType()).isEqualTo(IGNORE); assertThat(ignore.toString()).isEqualTo("Ignore"); } }
@Override public RetryDecision onUnavailable( Statement statement, ConsistencyLevel cl, int requiredReplica, int aliveReplica, int nbRetry) { if (statement instanceof CustomStatement) customStatementsHandled.incrementAndGet(); return RetryDecision.ignore(); }
@Test(groups = "short") public void retriesTest() { retryDecision = RetryDecision.retry(ConsistencyLevel.ONE); // We only have one node, this will throw an unavailable exception Statement statement = new SimpleStatement("SELECT v FROM test WHERE k = 1") .setConsistencyLevel(ConsistencyLevel.TWO); session().execute(statement); Errors errors = cluster().getMetrics().getErrorMetrics(); assertEquals(errors.getUnavailables().getCount(), 1); assertEquals(errors.getRetries().getCount(), 1); assertEquals(errors.getRetriesOnUnavailable().getCount(), 1); retryDecision = RetryDecision.ignore(); session().execute(statement); assertEquals(errors.getUnavailables().getCount(), 2); assertEquals(errors.getIgnores().getCount(), 1); assertEquals(errors.getIgnoresOnUnavailable().getCount(), 1); }
private RetryDecision checkRetry(Statement query, ConsistencyLevel cl, boolean shouldRetry) { if (!shouldRetry || retryCount <= 0) { // We are out of retries. if (suppressFinalFailure) { return RetryDecision.ignore(); } else { return RetryDecision.rethrow(); } } // Ok we should retry and have some tries left. retryCount--; // Note this retry // Check if the consistency level needs to be changed if (nextConsistencyLevel != null) { return RetryDecision.retry(nextConsistencyLevel); } else { return RetryDecision.retry(cl); } } }
@Test(groups = "unit") public void should_expose_decision_properties() throws Throwable { RetryDecision retryAtOne = RetryDecision.retry(ONE); assertThat(retryAtOne.getType()).isEqualTo(RETRY); assertThat(retryAtOne.getRetryConsistencyLevel()).isEqualTo(ONE); assertThat(retryAtOne.isRetryCurrent()).isTrue(); assertThat(retryAtOne.toString()).isEqualTo("Retry at ONE on same host."); RetryDecision tryNextAtOne = RetryDecision.tryNextHost(ONE); assertThat(tryNextAtOne.getType()).isEqualTo(RETRY); assertThat(tryNextAtOne.getRetryConsistencyLevel()).isEqualTo(ONE); assertThat(tryNextAtOne.isRetryCurrent()).isFalse(); assertThat(tryNextAtOne.toString()).isEqualTo("Retry at ONE on next host."); RetryDecision rethrow = RetryDecision.rethrow(); assertThat(rethrow.getType()).isEqualTo(RETHROW); assertThat(rethrow.toString()).isEqualTo("Rethrow"); RetryDecision ignore = RetryDecision.ignore(); assertThat(ignore.getType()).isEqualTo(IGNORE); assertThat(ignore.toString()).isEqualTo("Ignore"); } }
@Test(groups = "short") public void retriesTest() { retryDecision = RetryDecision.retry(ConsistencyLevel.ONE); // We only have one node, this will throw an unavailable exception Statement statement = new SimpleStatement("SELECT v FROM test WHERE k = 1") .setConsistencyLevel(ConsistencyLevel.TWO); session().execute(statement); Errors errors = cluster().getMetrics().getErrorMetrics(); assertEquals(errors.getUnavailables().getCount(), 1); assertEquals(errors.getRetries().getCount(), 1); assertEquals(errors.getRetriesOnUnavailable().getCount(), 1); retryDecision = RetryDecision.ignore(); session().execute(statement); assertEquals(errors.getUnavailables().getCount(), 2); assertEquals(errors.getIgnores().getCount(), 1); assertEquals(errors.getIgnoresOnUnavailable().getCount(), 1); }
@Override public RetryDecision onUnavailable( Statement statement, ConsistencyLevel cl, int requiredReplica, int aliveReplica, int nbRetry) { if (statement instanceof CustomStatement) customStatementsHandled.incrementAndGet(); return RetryDecision.ignore(); }
@Override public RetryDecision onWriteTimeout( Statement statement, ConsistencyLevel cl, WriteType writeType, int requiredAcks, int receivedAcks, int nbRetry) { return RetryDecision.ignore(); }
@Test(groups = "short") public void should_log_ignored_write_timeout() throws InterruptedException { simulateError(1, write_request_timeout); retryDecision = ignore(); query(); String line = appender.waitAndGet(5000); assertThat(line.trim()) .isEqualTo(expectedMessage(IGNORING_WRITE_TIMEOUT, defaultCL, SIMPLE, 1, 0, 0)); }
@Test(groups = "short") public void should_log_ignored_read_timeout() throws InterruptedException { simulateError(1, read_request_timeout); retryDecision = ignore(); query(); String line = appender.waitAndGet(5000); assertThat(line.trim()) .isEqualTo(expectedMessage(IGNORING_READ_TIMEOUT, defaultCL, 1, 0, false, 0)); }
@Test(groups = "short") public void should_log_ignored_request_error() throws InterruptedException { simulateError(1, server_error); retryDecision = ignore(); query(); String line = appender.waitAndGet(5000); assertThat(line.trim()) .isEqualTo( expectedMessage( IGNORING_REQUEST_ERROR, defaultCL, 0, new ServerError(host1.getSocketAddress(), "Server Error").toString())); }
@Override public RetryDecision onReadTimeout( Statement statement, ConsistencyLevel cl, int requiredResponses, int receivedResponses, boolean dataRetrieved, int nbRetry) { return RetryDecision.ignore(); }
@Test(groups = "short") public void should_log_ignored_unavailable() throws InterruptedException { simulateError(1, unavailable); retryDecision = ignore(); query(); String line = appender.waitAndGet(5000); assertThat(line.trim()).isEqualTo(expectedMessage(IGNORING_UNAVAILABLE, defaultCL, 1, 0, 0)); }
case BATCH: return receivedAcks > 0 ? RetryDecision.ignore() : RetryDecision.rethrow(); case UNLOGGED_BATCH:
@Test(groups = "short") public void should_log_ignored_request_error() throws InterruptedException { simulateError(1, server_error); retryDecision = ignore(); query(); String line = appender.waitAndGet(5000); assertThat(line.trim()) .isEqualTo( expectedMessage( IGNORING_REQUEST_ERROR, defaultCL, 0, new ServerError(host1.getSocketAddress(), "Server Error").toString())); }
@Test(groups = "short") public void should_log_ignored_write_timeout() throws InterruptedException { simulateError(1, write_request_timeout); retryDecision = ignore(); query(); String line = appender.waitAndGet(5000); assertThat(line.trim()) .isEqualTo(expectedMessage(IGNORING_WRITE_TIMEOUT, defaultCL, SIMPLE, 1, 0, 0)); }
@Test(groups = "short") public void should_log_ignored_read_timeout() throws InterruptedException { simulateError(1, read_request_timeout); retryDecision = ignore(); query(); String line = appender.waitAndGet(5000); assertThat(line.trim()) .isEqualTo(expectedMessage(IGNORING_READ_TIMEOUT, defaultCL, 1, 0, false, 0)); }
@Override public RetryDecision onReadTimeout( Statement statement, ConsistencyLevel cl, int requiredResponses, int receivedResponses, boolean dataRetrieved, int nbRetry) { return RetryDecision.ignore(); }
@Test(groups = "short") public void should_log_ignored_unavailable() throws InterruptedException { simulateError(1, unavailable); retryDecision = ignore(); query(); String line = appender.waitAndGet(5000); assertThat(line.trim()).isEqualTo(expectedMessage(IGNORING_UNAVAILABLE, defaultCL, 1, 0, 0)); }
@Override public RetryDecision onWriteTimeout( Statement statement, ConsistencyLevel cl, WriteType writeType, int requiredAcks, int receivedAcks, int nbRetry) { return RetryDecision.ignore(); }