Skip to content

Commit 1a2a9ea

Browse files
authored
Upgrade quarkus to 3.15 (Apicurio#5488)
* Upgrade quarkus to 3 15 * Align operator sdk version with quarkus * Remove jitpack repository to fix jackson-coreutils * Add confluent repo * Refactor datasource to use quarkus properties instead of custom ones * Disable autocommit at the db connection level and activate the required datasource programatically
1 parent 7a88374 commit 1a2a9ea

File tree

16 files changed

+143
-82
lines changed

16 files changed

+143
-82
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package io.apicurio.registry.services;
2+
3+
import io.apicurio.registry.storage.impl.sql.RegistryDatabaseKind;
4+
import io.smallrye.config.ConfigSourceInterceptor;
5+
import io.smallrye.config.ConfigSourceInterceptorContext;
6+
import io.smallrye.config.ConfigValue;
7+
import jakarta.annotation.Priority;
8+
9+
@Priority(100)
10+
public class DatabaseConfigInterceptor implements ConfigSourceInterceptor {
11+
12+
@Override
13+
public ConfigValue getValue(ConfigSourceInterceptorContext context, String name) {
14+
ConfigValue storageKind = context.proceed("apicurio.storage.sql.kind");
15+
RegistryDatabaseKind databaseKind = RegistryDatabaseKind.valueOf(storageKind.getValue());
16+
17+
switch (name) {
18+
case "quarkus.datasource.postgresql.active" -> {
19+
if (databaseKind.equals(RegistryDatabaseKind.postgresql)) {
20+
return ConfigValue.builder().withName(name).withValue("true").build();
21+
} else {
22+
return ConfigValue.builder().withName(name).withValue("false").build();
23+
}
24+
}
25+
case "quarkus.datasource.mssql.active" -> {
26+
if (databaseKind.equals(RegistryDatabaseKind.mssql)) {
27+
return ConfigValue.builder().withName(name).withValue("true").build();
28+
} else {
29+
return ConfigValue.builder().withName(name).withValue("false").build();
30+
}
31+
}
32+
case "quarkus.datasource.mysql.active" -> {
33+
if (databaseKind.equals(RegistryDatabaseKind.mysql)) {
34+
return ConfigValue.builder().withName(name).withValue("true").build();
35+
} else {
36+
return ConfigValue.builder().withName(name).withValue("false").build();
37+
}
38+
}
39+
case "quarkus.datasource.h2.active" -> {
40+
if (databaseKind.equals(RegistryDatabaseKind.h2)) {
41+
return ConfigValue.builder().withName(name).withValue("true").build();
42+
} else {
43+
return ConfigValue.builder().withName(name).withValue("false").build();
44+
}
45+
}
46+
}
47+
48+
return context.proceed(name);
49+
}
50+
51+
}

app/src/main/java/io/apicurio/registry/services/RegistryConfigSource.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.apicurio.registry.services;
22

3-
import io.quarkus.runtime.configuration.ProfileManager;
3+
import io.quarkus.runtime.LaunchMode;
44
import org.eclipse.microprofile.config.spi.ConfigSource;
55

66
import java.util.HashMap;
@@ -21,7 +21,7 @@ public synchronized Map<String, String> getProperties() {
2121
properties = new HashMap<>();
2222
String prefix = System.getenv("REGISTRY_PROPERTIES_PREFIX");
2323
if (prefix != null) {
24-
String profile = ProfileManager.getLaunchMode().getProfileKey();
24+
String profile = LaunchMode.current().getProfileKey();
2525
String profilePrefix = "%" + profile + ".";
2626
Map<String, String> envMap = System.getenv();
2727
for (Map.Entry<String, String> entry : envMap.entrySet()) {

app/src/main/java/io/apicurio/registry/storage/impl/sql/AbstractHandleFactory.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import io.apicurio.registry.storage.impl.sql.jdb.HandleImpl;
88
import org.slf4j.Logger;
99

10+
import java.sql.Connection;
1011
import java.sql.SQLException;
1112
import java.util.HashMap;
1213
import java.util.Map;
@@ -34,7 +35,10 @@ public <R, X extends Exception> R withHandle(HandleCallback<R, X> callback) thro
3435
try {
3536
// Create a new handle if necessary. Increment the "level" if a handle already exists.
3637
if (state.handle == null) {
37-
state.handle = new HandleImpl(dataSource.getConnection());
38+
Connection connection = dataSource.getConnection();
39+
// We must disable autocommit since we're managing the transactions ourselves.
40+
connection.setAutoCommit(false);
41+
state.handle = new HandleImpl(connection);
3842
state.level = 0;
3943
} else {
4044
state.level++;

app/src/main/java/io/apicurio/registry/storage/impl/sql/AbstractSqlRegistryStorage.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@
134134
import io.quarkus.security.identity.SecurityIdentity;
135135
import jakarta.enterprise.event.Event;
136136
import jakarta.inject.Inject;
137-
import jakarta.transaction.Transactional;
138137
import jakarta.validation.ValidationException;
139138
import org.apache.commons.lang3.tuple.ImmutablePair;
140139
import org.apache.commons.lang3.tuple.Pair;
@@ -2905,7 +2904,6 @@ public GroupSearchResultsDto searchGroups(Set<SearchFilter> filters, OrderBy ord
29052904
}
29062905

29072906
@Override
2908-
@Transactional
29092907
public ContentWrapperDto getContentByReference(ArtifactReferenceDto reference) {
29102908
try {
29112909
var meta = getArtifactVersionMetaData(reference.getGroupId(), reference.getArtifactId(),
Lines changed: 29 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
package io.apicurio.registry.storage.impl.sql;
22

33
import io.agroal.api.AgroalDataSource;
4-
import io.agroal.api.configuration.AgroalConnectionFactoryConfiguration.TransactionIsolation;
5-
import io.agroal.api.configuration.AgroalConnectionPoolConfiguration.TransactionRequirement;
6-
import io.agroal.api.configuration.supplier.AgroalPropertiesReader;
74
import io.apicurio.common.apps.config.Info;
85
import jakarta.enterprise.context.ApplicationScoped;
96
import jakarta.inject.Inject;
@@ -13,8 +10,6 @@
1310
import org.slf4j.Logger;
1411

1512
import java.sql.SQLException;
16-
import java.util.HashMap;
17-
import java.util.Map;
1813

1914
public class RegistryDatasourceProducer {
2015

@@ -25,29 +20,21 @@ public class RegistryDatasourceProducer {
2520
@Info(category = "storage", description = "Application datasource database type", availableSince = "3.0.0")
2621
String databaseType;
2722

28-
@ConfigProperty(name = "apicurio.datasource.url", defaultValue = "jdbc:h2:mem:registry_db")
29-
@Info(category = "storage", description = "Application datasource jdbc url", availableSince = "3.0.0")
30-
String jdbcUrl;
31-
32-
@ConfigProperty(name = "apicurio.datasource.username", defaultValue = "sa")
33-
@Info(category = "storage", description = "Application datasource username", availableSince = "3.0.0")
34-
String username;
35-
36-
@ConfigProperty(name = "apicurio.datasource.password", defaultValue = "sa")
37-
@Info(category = "storage", description = "Application datasource password", availableSince = "3.0.0")
38-
String password;
23+
@Inject
24+
@Named("h2")
25+
AgroalDataSource h2Datasource;
3926

40-
@ConfigProperty(name = "apicurio.datasource.jdbc.initial-size", defaultValue = "20")
41-
@Info(category = "storage", description = "Application datasource pool initial size", availableSince = "3.0.0")
42-
String initialSize;
27+
@Inject
28+
@Named("postgresql")
29+
AgroalDataSource postgresqlDatasource;
4330

44-
@ConfigProperty(name = "apicurio.datasource.jdbc.min-size", defaultValue = "20")
45-
@Info(category = "storage", description = "Application datasource pool minimum size", availableSince = "3.0.0")
46-
String minSize;
31+
@Inject
32+
@Named("mysql")
33+
AgroalDataSource mysqlDatasource;
4734

48-
@ConfigProperty(name = "apicurio.datasource.jdbc.max-size", defaultValue = "100")
49-
@Info(category = "storage", description = "Application datasource pool maximum size", availableSince = "3.0.0")
50-
String maxSize;
35+
@Inject
36+
@Named("mssql")
37+
AgroalDataSource mssqlDatasource;
5138

5239
@Produces
5340
@ApplicationScoped
@@ -57,30 +44,24 @@ public AgroalDataSource produceDatasource() throws SQLException {
5744

5845
final RegistryDatabaseKind databaseKind = RegistryDatabaseKind.valueOf(databaseType);
5946

60-
Map<String, String> props = new HashMap<>();
61-
62-
props.put(AgroalPropertiesReader.MAX_SIZE, maxSize);
63-
props.put(AgroalPropertiesReader.MIN_SIZE, minSize);
64-
props.put(AgroalPropertiesReader.INITIAL_SIZE, initialSize);
65-
props.put(AgroalPropertiesReader.JDBC_URL, jdbcUrl);
66-
props.put(AgroalPropertiesReader.PRINCIPAL, username);
67-
props.put(AgroalPropertiesReader.CREDENTIAL, password);
68-
props.put(AgroalPropertiesReader.PROVIDER_CLASS_NAME, databaseKind.getDriverClassName());
69-
70-
/*
71-
* We need to disable auto-commit to have proper transaction rollback, otherwise the data may be in an
72-
* inconsistent state (e.g. partial deletes), or operations would not be rolled back on exception.
73-
*/
74-
props.put(AgroalPropertiesReader.AUTO_COMMIT, "false");
75-
props.put(AgroalPropertiesReader.TRANSACTION_ISOLATION, TransactionIsolation.READ_COMMITTED.name());
76-
props.put(AgroalPropertiesReader.TRANSACTION_REQUIREMENT, TransactionRequirement.WARN.name());
77-
props.put(AgroalPropertiesReader.FLUSH_ON_CLOSE, "true");
78-
79-
AgroalDataSource datasource = AgroalDataSource
80-
.from(new AgroalPropertiesReader().readProperties(props).get());
81-
8247
log.info("Using {} SQL storage.", databaseType);
8348

84-
return datasource;
49+
switch (databaseKind) {
50+
case h2 -> {
51+
return h2Datasource;
52+
}
53+
case postgresql -> {
54+
return postgresqlDatasource;
55+
}
56+
case mysql -> {
57+
return mysqlDatasource;
58+
}
59+
case mssql -> {
60+
return mssqlDatasource;
61+
}
62+
default -> throw new IllegalStateException(
63+
String.format("unrecognized database type: %s", databaseKind.name()));
64+
}
65+
8566
}
8667
}

app/src/main/java/io/apicurio/registry/storage/impl/sql/SqlRegistryStorage.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import io.apicurio.registry.storage.RegistryStorage;
88
import jakarta.enterprise.context.ApplicationScoped;
99
import jakarta.inject.Inject;
10-
import jakarta.transaction.Transactional;
1110

1211
/**
1312
* An in-memory SQL implementation of the {@link RegistryStorage} interface.
@@ -40,7 +39,6 @@ public void restoreFromSnapshot(String snapshotLocation) {
4039
.bind(0, snapshotLocation).execute());
4140
}
4241

43-
@Transactional
4442
public void executeSqlStatement(String sqlStatement) {
4543
handleFactory.withHandle(handle -> handle.createUpdate(sqlStatement).execute());
4644
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
io.apicurio.registry.services.DatabaseConfigInterceptor

app/src/main/resources/application.properties

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ quarkus.native.additional-build-args=--initialize-at-run-time=org.apache.kafka.c
5353
--allow-incomplete-classpath
5454

5555
# Package
56-
quarkus.package.type=legacy-jar
56+
quarkus.package.jar.type=legacy-jar
5757
quarkus.index-dependency.jaxrs.group-id=jakarta.ws.rs
5858
quarkus.index-dependency.jaxrs.artifact-id=jakarta.ws.rs-api
5959

@@ -162,13 +162,50 @@ apicurio.import.work-dir=${java.io.tmpdir}
162162

163163
## SQL Storage
164164
apicurio.storage.sql.kind=h2
165+
apicurio.sql.init=true
166+
165167
apicurio.datasource.url=jdbc:h2:mem:db_${quarkus.uuid}
166168
apicurio.datasource.username=sa
167169
apicurio.datasource.password=sa
168170
apicurio.datasource.jdbc.initial-size=20
169171
apicurio.datasource.jdbc.min-size=20
170172
apicurio.datasource.jdbc.max-size=100
171-
apicurio.sql.init=true
173+
174+
## H2
175+
quarkus.datasource.h2.db-kind=h2
176+
quarkus.datasource.h2.jdbc.url=${apicurio.datasource.url}
177+
quarkus.datasource.h2.username=${apicurio.datasource.username}
178+
quarkus.datasource.h2.password=${apicurio.datasource.password}
179+
quarkus.datasource.h2.jdbc.initial-size=${apicurio.datasource.jdbc.initial-size}
180+
quarkus.datasource.h2.jdbc.min-size=${apicurio.datasource.jdbc.min-size}
181+
quarkus.datasource.h2.jdbc.max-size=${apicurio.datasource.jdbc.max-size}
182+
183+
## Postgresql
184+
quarkus.datasource.postgresql.db-kind=postgresql
185+
quarkus.datasource.postgresql.jdbc.url=${apicurio.datasource.url}
186+
quarkus.datasource.postgresql.username=${apicurio.datasource.username}
187+
quarkus.datasource.postgresql.password=${apicurio.datasource.password}
188+
quarkus.datasource.postgresql.jdbc.initial-size=${apicurio.datasource.jdbc.initial-size}
189+
quarkus.datasource.postgresql.jdbc.min-size=${apicurio.datasource.jdbc.min-size}
190+
quarkus.datasource.postgresql.jdbc.max-size=${apicurio.datasource.jdbc.max-size}
191+
192+
## Mysql
193+
quarkus.datasource.mysql.db-kind=mysql
194+
quarkus.datasource.mysql.jdbc.url=${apicurio.datasource.url}
195+
quarkus.datasource.mysql.username=${apicurio.datasource.username}
196+
quarkus.datasource.mysql.password=${apicurio.datasource.password}
197+
quarkus.datasource.mysql.jdbc.initial-size=${apicurio.datasource.jdbc.initial-size}
198+
quarkus.datasource.mysql.jdbc.min-size=${apicurio.datasource.jdbc.min-size}
199+
quarkus.datasource.mysql.jdbc.max-size=${apicurio.datasource.jdbc.max-size}
200+
201+
## Mssql
202+
quarkus.datasource.mssql.db-kind=mssql
203+
quarkus.datasource.mssql.jdbc.url=${apicurio.datasource.url}
204+
quarkus.datasource.mssql.username=${apicurio.datasource.username}
205+
quarkus.datasource.mssql.password=${apicurio.datasource.password}
206+
quarkus.datasource.mssql.jdbc.initial-size=${apicurio.datasource.jdbc.initial-size}
207+
quarkus.datasource.mssql.jdbc.min-size=${apicurio.datasource.jdbc.min-size}
208+
quarkus.datasource.mssql.jdbc.max-size=${apicurio.datasource.jdbc.max-size}
172209

173210
## Kafka SQL storage
174211
apicurio.kafkasql.bootstrap.servers=localhost:9092

app/src/test/java/io/apicurio/registry/storage/util/MssqlTestProfile.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class MssqlTestProfile implements QuarkusTestProfile {
1111

1212
@Override
1313
public Map<String, String> getConfigOverrides() {
14-
return Collections.singletonMap("apicurio.storage.sql.kind", "mssql");
14+
return Map.of("apicurio.storage.sql.kind", "mssql");
1515
}
1616

1717
@Override

app/src/test/java/io/apicurio/registry/storage/util/MysqlTestProfile.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ public class MysqlTestProfile implements QuarkusTestProfile {
1111

1212
@Override
1313
public Map<String, String> getConfigOverrides() {
14-
return Collections.singletonMap("apicurio.storage.sql.kind", "mysql");
14+
return Map.of("apicurio.storage.sql.kind", "mysql");
1515
}
1616

1717
@Override

0 commit comments

Comments
 (0)