Skip to content

Commit e89bc38

Browse files
xstefankgsmet
authored andcommitted
Fix a race condition in ReactiveDatasourceHealthCheck data field population
(cherry picked from commit 9d9534b)
1 parent c1dd658 commit e89bc38

File tree

5 files changed

+114
-1
lines changed

5 files changed

+114
-1
lines changed

extensions/reactive-datasource/runtime/src/main/java/io/quarkus/reactive/datasource/runtime/ReactiveDatasourceHealthCheck.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ public HealthCheckResponse call() {
7676
//20 seconds is rather high, but using just 10 is often not enough on slow CI
7777
//systems, especially if the connections have to be established for the first time.
7878
databaseConnectionAttempt.get(20, TimeUnit.SECONDS);
79-
builder.withData(dataSourceName, "UP");
8079
} catch (RuntimeException | ExecutionException exception) {
8180
operationsError(dataSourceName, exception);
8281
builder.down();
@@ -105,6 +104,8 @@ private void checkFailure(AsyncResult<RowSet<Row>> ar, HealthCheckResponseBuilde
105104
operationsError(dataSourceName, ar.cause());
106105
builder.down();
107106
builder.withData(dataSourceName, "down - connection failed: " + ar.cause().getMessage());
107+
} else {
108+
builder.withData(dataSourceName, "UP");
108109
}
109110
}
110111

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.quarkus.reactive.mssql.client;
2+
3+
import org.hamcrest.CoreMatchers;
4+
import org.hamcrest.Matchers;
5+
import org.junit.jupiter.api.Test;
6+
import org.junit.jupiter.api.extension.RegisterExtension;
7+
8+
import io.quarkus.test.QuarkusUnitTest;
9+
import io.restassured.RestAssured;
10+
11+
public class DataSourceHealthCheckPayloadTest {
12+
13+
@RegisterExtension
14+
static final QuarkusUnitTest config = new QuarkusUnitTest()
15+
.withEmptyApplication()
16+
.overrideConfigKey("quarkus.datasource.health.enabled", "true")
17+
.overrideConfigKey("quarkus.devservices.enabled", "false");
18+
19+
@Test
20+
public void testDataSourceHealthCheckPayload() {
21+
RestAssured.when().get("/q/health/ready")
22+
.then()
23+
.body("status", CoreMatchers.equalTo("DOWN"))
24+
.body("checks.data", CoreMatchers
25+
.hasItem(Matchers.hasValue(CoreMatchers.containsString("down - connection failed"))));
26+
}
27+
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.quarkus.reactive.mysql.client;
2+
3+
import org.hamcrest.CoreMatchers;
4+
import org.hamcrest.Matchers;
5+
import org.junit.jupiter.api.Test;
6+
import org.junit.jupiter.api.extension.RegisterExtension;
7+
8+
import io.quarkus.test.QuarkusUnitTest;
9+
import io.restassured.RestAssured;
10+
11+
public class DataSourceHealthCheckPayloadTest {
12+
13+
@RegisterExtension
14+
static final QuarkusUnitTest config = new QuarkusUnitTest()
15+
.withEmptyApplication()
16+
.overrideConfigKey("quarkus.datasource.health.enabled", "true")
17+
.overrideConfigKey("quarkus.devservices.enabled", "false");
18+
19+
@Test
20+
public void testDataSourceHealthCheckPayload() {
21+
RestAssured.when().get("/q/health/ready")
22+
.then()
23+
.body("status", CoreMatchers.equalTo("DOWN"))
24+
.body("checks.data", CoreMatchers
25+
.hasItem(Matchers.hasValue(CoreMatchers.containsString("down - connection failed"))));
26+
}
27+
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.quarkus.reactive.oracle.client;
2+
3+
import org.hamcrest.CoreMatchers;
4+
import org.hamcrest.Matchers;
5+
import org.junit.jupiter.api.Test;
6+
import org.junit.jupiter.api.extension.RegisterExtension;
7+
8+
import io.quarkus.test.QuarkusUnitTest;
9+
import io.restassured.RestAssured;
10+
11+
public class DataSourceHealthCheckPayloadTest {
12+
13+
@RegisterExtension
14+
static final QuarkusUnitTest config = new QuarkusUnitTest()
15+
.withEmptyApplication()
16+
.overrideConfigKey("quarkus.datasource.health.enabled", "true")
17+
.overrideConfigKey("quarkus.devservices.enabled", "false");
18+
19+
@Test
20+
public void testDataSourceHealthCheckPayload() {
21+
RestAssured.when().get("/q/health/ready")
22+
.then()
23+
.body("status", CoreMatchers.equalTo("DOWN"))
24+
.body("checks.data", CoreMatchers
25+
.hasItem(Matchers.hasValue(CoreMatchers.containsString("down - connection failed"))));
26+
}
27+
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package io.quarkus.reactive.pg.client;
2+
3+
import org.hamcrest.CoreMatchers;
4+
import org.hamcrest.Matchers;
5+
import org.junit.jupiter.api.Test;
6+
import org.junit.jupiter.api.extension.RegisterExtension;
7+
8+
import io.quarkus.test.QuarkusUnitTest;
9+
import io.restassured.RestAssured;
10+
11+
public class DataSourceHealthCheckPayloadTest {
12+
13+
@RegisterExtension
14+
static final QuarkusUnitTest config = new QuarkusUnitTest()
15+
.withEmptyApplication()
16+
.overrideConfigKey("quarkus.datasource.health.enabled", "true")
17+
.overrideConfigKey("quarkus.devservices.enabled", "false");
18+
19+
@Test
20+
public void testDataSourceHealthCheckPayload() {
21+
RestAssured.when().get("/q/health/ready")
22+
.then()
23+
.body("status", CoreMatchers.equalTo("DOWN"))
24+
.body("checks.data", CoreMatchers
25+
.hasItem(Matchers.hasValue(CoreMatchers.containsString("down - connection failed"))));
26+
}
27+
28+
}

0 commit comments

Comments
 (0)