From 851f631eacd1f8b453fbbf7b39f6f1533ec16434 Mon Sep 17 00:00:00 2001 From: Alexandre Dutra Date: Sat, 28 Mar 2020 15:25:30 +0100 Subject: [PATCH 1/2] Use LOCAL_ONE when querying system.local The system keyspace has a replication factor of 1 and is local to each node; it is therefore recommended to query system.local with a consistency level of ONE or LOCAL_ONE. Stronger consistency levels may result in an Unavailable error, but this does not mean that the node is down. See gh-20709 --- .../actuate/cassandra/CassandraHealthIndicator.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicator.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicator.java index bcaaae1bd86..b3fff936712 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicator.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicator.java @@ -16,9 +16,10 @@ package org.springframework.boot.actuate.cassandra; +import com.datastax.driver.core.ConsistencyLevel; import com.datastax.driver.core.ResultSet; -import com.datastax.driver.core.querybuilder.QueryBuilder; -import com.datastax.driver.core.querybuilder.Select; +import com.datastax.driver.core.SimpleStatement; +import com.datastax.driver.core.Statement; import org.springframework.boot.actuate.health.AbstractHealthIndicator; import org.springframework.boot.actuate.health.Health; @@ -35,6 +36,9 @@ import org.springframework.util.Assert; */ public class CassandraHealthIndicator extends AbstractHealthIndicator { + private static final Statement SELECT = new SimpleStatement("SELECT release_version FROM system.local") + .setConsistencyLevel(ConsistencyLevel.LOCAL_ONE); + private CassandraOperations cassandraOperations; public CassandraHealthIndicator() { @@ -53,9 +57,8 @@ public class CassandraHealthIndicator extends AbstractHealthIndicator { @Override protected void doHealthCheck(Health.Builder builder) throws Exception { - Select select = QueryBuilder.select("release_version").from("system", "local"); - ResultSet results = this.cassandraOperations.getCqlOperations().queryForResultSet(select); - if (results.isExhausted()) { + ResultSet results = this.cassandraOperations.getCqlOperations().queryForResultSet(SELECT); + if (results.isFullyFetched()) { builder.up(); return; } From 63be1678dec87541441492a59062b186e679403d Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Sat, 28 Mar 2020 16:02:04 +0100 Subject: [PATCH 2/2] Polish "Use LOCAL_ONE when querying system.local" See gh-20709 --- .../actuate/cassandra/CassandraHealthIndicator.java | 3 ++- .../cassandra/CassandraHealthIndicatorTests.java | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicator.java b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicator.java index b3fff936712..4c89c8e2665 100644 --- a/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicator.java +++ b/spring-boot-project/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicator.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -32,6 +32,7 @@ import org.springframework.util.Assert; * Cassandra data stores. * * @author Julien Dubois + * @author Alexandre Dutra * @since 2.0.0 */ public class CassandraHealthIndicator extends AbstractHealthIndicator { diff --git a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicatorTests.java b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicatorTests.java index f3077a52932..468a2339da4 100644 --- a/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicatorTests.java +++ b/spring-boot-project/spring-boot-actuator/src/test/java/org/springframework/boot/actuate/cassandra/CassandraHealthIndicatorTests.java @@ -18,7 +18,7 @@ package org.springframework.boot.actuate.cassandra; import com.datastax.driver.core.ResultSet; import com.datastax.driver.core.Row; -import com.datastax.driver.core.querybuilder.Select; +import com.datastax.driver.core.Statement; import org.junit.Test; import org.springframework.boot.actuate.health.Health; @@ -51,8 +51,8 @@ public class CassandraHealthIndicatorTests { ResultSet resultSet = mock(ResultSet.class); CassandraHealthIndicator healthIndicator = new CassandraHealthIndicator(cassandraOperations); given(cassandraOperations.getCqlOperations()).willReturn(cqlOperations); - given(cqlOperations.queryForResultSet(any(Select.class))).willReturn(resultSet); - given(resultSet.isExhausted()).willReturn(true); + given(cqlOperations.queryForResultSet(any(Statement.class))).willReturn(resultSet); + given(resultSet.isFullyFetched()).willReturn(true); Health health = healthIndicator.health(); assertThat(health.getStatus()).isEqualTo(Status.UP); } @@ -65,8 +65,8 @@ public class CassandraHealthIndicatorTests { Row row = mock(Row.class); CassandraHealthIndicator healthIndicator = new CassandraHealthIndicator(cassandraOperations); given(cassandraOperations.getCqlOperations()).willReturn(cqlOperations); - given(cqlOperations.queryForResultSet(any(Select.class))).willReturn(resultSet); - given(resultSet.isExhausted()).willReturn(false); + given(cqlOperations.queryForResultSet(any(Statement.class))).willReturn(resultSet); + given(resultSet.isFullyFetched()).willReturn(false); given(resultSet.one()).willReturn(row); String expectedVersion = "1.0.0"; given(row.getString(0)).willReturn(expectedVersion);