From c152cb20c8f20f2ab477d82c4c85ebba3a89e18b Mon Sep 17 00:00:00 2001 From: Prashant Date: Wed, 28 May 2025 09:03:12 -0700 Subject: [PATCH 1/4] Fix Production readiness for Eclipselink --- .../EclipseLinkProductionReadinessChecks.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkProductionReadinessChecks.java b/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkProductionReadinessChecks.java index be0ae5b7231..8ee050057c4 100644 --- a/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkProductionReadinessChecks.java +++ b/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkProductionReadinessChecks.java @@ -26,6 +26,7 @@ import java.nio.file.Path; import org.apache.polaris.core.config.ProductionReadinessCheck; import org.apache.polaris.core.config.ProductionReadinessCheck.Error; +import org.eclipse.microprofile.config.inject.ConfigProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,7 +37,14 @@ public class EclipseLinkProductionReadinessChecks { LoggerFactory.getLogger(EclipseLinkProductionReadinessChecks.class); @Produces - public ProductionReadinessCheck checkJdbcUrl(EclipseLinkConfiguration eclipseLinkConfiguration) { + public ProductionReadinessCheck checkJdbcUrl( + EclipseLinkConfiguration eclipseLinkConfiguration, + @ConfigProperty(name = "polaris.persistence.type") String persistenceType) { + // This check should only be applicable when persistence uses EclipseLink. + if (!("eclipse-link".equalsIgnoreCase(persistenceType))) { + return ProductionReadinessCheck.OK; + } + try { var confFile = eclipseLinkConfiguration.configurationFile().map(Path::toString).orElse(null); var persistenceUnitName = From aa8c2d773f84f6977cd4aa19275e7e2d27e57dbe Mon Sep 17 00:00:00 2001 From: Prashant Date: Wed, 28 May 2025 17:10:29 -0700 Subject: [PATCH 2/4] Address review feedback --- .../EclipseLinkProductionReadinessChecks.java | 16 ++++-- .../relational-jdbc/build.gradle.kts | 1 + ...lationalJdbcProductionReadinessChecks.java | 53 +++++++++++++++++++ gradle/libs.versions.toml | 1 + quarkus/server/distribution/LICENSE | 1 + 5 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcProductionReadinessChecks.java diff --git a/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkProductionReadinessChecks.java b/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkProductionReadinessChecks.java index 8ee050057c4..982b2e2301c 100644 --- a/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkProductionReadinessChecks.java +++ b/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkProductionReadinessChecks.java @@ -20,28 +20,34 @@ import static org.eclipse.persistence.config.PersistenceUnitProperties.JDBC_URL; +import io.smallrye.common.annotation.Identifier; import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Any; +import jakarta.enterprise.inject.Instance; import jakarta.enterprise.inject.Produces; import java.io.IOException; import java.nio.file.Path; import org.apache.polaris.core.config.ProductionReadinessCheck; import org.apache.polaris.core.config.ProductionReadinessCheck.Error; +import org.apache.polaris.core.persistence.MetaStoreManagerFactory; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @ApplicationScoped public class EclipseLinkProductionReadinessChecks { - private static final Logger LOGGER = LoggerFactory.getLogger(EclipseLinkProductionReadinessChecks.class); @Produces - public ProductionReadinessCheck checkJdbcUrl( - EclipseLinkConfiguration eclipseLinkConfiguration, - @ConfigProperty(name = "polaris.persistence.type") String persistenceType) { + public ProductionReadinessCheck checkEclipseLink( + @ConfigProperty(name = "polaris.persistence.type") String persistenceType, + @Any Instance metaStoreManagerFactories, + EclipseLinkConfiguration eclipseLinkConfiguration) { // This check should only be applicable when persistence uses EclipseLink. - if (!("eclipse-link".equalsIgnoreCase(persistenceType))) { + MetaStoreManagerFactory metaStoreManagerFactory = + metaStoreManagerFactories.select(Identifier.Literal.of(persistenceType)).get(); + if (!(metaStoreManagerFactory instanceof EclipseLinkPolarisMetaStoreManagerFactory)) { return ProductionReadinessCheck.OK; } diff --git a/extension/persistence/relational-jdbc/build.gradle.kts b/extension/persistence/relational-jdbc/build.gradle.kts index a8a61f60c7e..a6d550a47f6 100644 --- a/extension/persistence/relational-jdbc/build.gradle.kts +++ b/extension/persistence/relational-jdbc/build.gradle.kts @@ -34,6 +34,7 @@ dependencies { compileOnly(libs.jakarta.inject.api) implementation(libs.smallrye.common.annotation) // @Identifier + compileOnly(libs.microprofile.config.api) // @ConfigMapping testImplementation(libs.mockito.junit.jupiter) diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcProductionReadinessChecks.java b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcProductionReadinessChecks.java new file mode 100644 index 00000000000..b298275dd34 --- /dev/null +++ b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcProductionReadinessChecks.java @@ -0,0 +1,53 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.polaris.extension.persistence.relational.jdbc; + +import io.smallrye.common.annotation.Identifier; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Any; +import jakarta.enterprise.inject.Instance; +import jakarta.enterprise.inject.Produces; +import java.util.Optional; +import org.apache.polaris.core.config.ProductionReadinessCheck; +import org.apache.polaris.core.persistence.MetaStoreManagerFactory; +import org.eclipse.microprofile.config.inject.ConfigProperty; + +@ApplicationScoped +public class RelationalJdbcProductionReadinessChecks { + @Produces + public ProductionReadinessCheck checkRelationalJdbc( + @ConfigProperty(name = "quarkus.datasource.jdbc.url") Optional jdbcUrl, + @ConfigProperty(name = "polaris.persistence.type") String persistenceType, + @Any Instance metaStoreManagerFactories) { + // This check should only be applicable when persistence uses RelationalJdbc. + if (!(metaStoreManagerFactories.select(Identifier.Literal.of(persistenceType)).get() + instanceof JdbcMetaStoreManagerFactory)) { + return ProductionReadinessCheck.OK; + } + + if (jdbcUrl.isPresent() && jdbcUrl.get().startsWith("jdbc:h2")) { + return ProductionReadinessCheck.of( + ProductionReadinessCheck.Error.of( + "The current persistence (jdbc:h2) is intended for tests only.", + "quarkus.datasource.jdbc.url")); + } + return ProductionReadinessCheck.OK; + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 274aa3c2c80..32865f80aa7 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,6 +73,7 @@ junit-bom = { module = "org.junit:junit-bom", version = "5.12.2" } logback-classic = { module = "ch.qos.logback:logback-classic", version = "1.5.18" } micrometer-bom = { module = "io.micrometer:micrometer-bom", version = "1.15.0" } microprofile-fault-tolerance-api = { module = "org.eclipse.microprofile.fault-tolerance:microprofile-fault-tolerance-api", version = "4.1.2" } +microprofile-config-api = {module = "org.eclipse.microprofile.config:microprofile-config-api", version = "3.0.3"} mockito-core = { module = "org.mockito:mockito-core", version = "5.18.0" } mockito-junit-jupiter = { module = "org.mockito:mockito-junit-jupiter", version = "5.18.0" } opentelemetry-bom = { module = "io.opentelemetry:opentelemetry-bom", version = "1.50.0" } diff --git a/quarkus/server/distribution/LICENSE b/quarkus/server/distribution/LICENSE index ce5ff26a973..f241f1433bf 100644 --- a/quarkus/server/distribution/LICENSE +++ b/quarkus/server/distribution/LICENSE @@ -1476,6 +1476,7 @@ License: Apache License 2.0 - https://www.apache.org/licenses/LICENSE-2.0.txt Group: org.eclipse.microprofile.config Name: microprofile-config-api Version: 3.1 Group: org.eclipse.microprofile.context-propagation Name: microprofile-context-propagation-api Version: 1.3 Group: org.eclipse.microprofile.fault-tolerance Name: microprofile-fault-tolerance-api Version: 4.1.1 +Group: org.eclipse.microprofile.config Name: microprofile-config-api Version: 3.0.3 Group: org.eclipse.microprofile.health Name: microprofile-health-api Version: 4.0.1 Group: org.eclipse.microprofile.jwt Name: microprofile-jwt-auth-api Version: 2.1 Group: org.eclipse.microprofile.reactive-streams-operators Name: microprofile-reactive-streams-operators-api Version: 3.0.1 From fd80dd2faea9694f173ddbf1243e9dc018ae3b52 Mon Sep 17 00:00:00 2001 From: Prashant Date: Thu, 29 May 2025 08:40:58 -0700 Subject: [PATCH 3/4] Address review feedback --- .../EclipseLinkProductionReadinessChecks.java | 9 +-------- .../jdbc/RelationalJdbcProductionReadinessChecks.java | 9 ++------- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkProductionReadinessChecks.java b/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkProductionReadinessChecks.java index 982b2e2301c..000f5ee6c18 100644 --- a/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkProductionReadinessChecks.java +++ b/extension/persistence/eclipselink/src/main/java/org/apache/polaris/extension/persistence/impl/eclipselink/EclipseLinkProductionReadinessChecks.java @@ -20,17 +20,13 @@ import static org.eclipse.persistence.config.PersistenceUnitProperties.JDBC_URL; -import io.smallrye.common.annotation.Identifier; import jakarta.enterprise.context.ApplicationScoped; -import jakarta.enterprise.inject.Any; -import jakarta.enterprise.inject.Instance; import jakarta.enterprise.inject.Produces; import java.io.IOException; import java.nio.file.Path; import org.apache.polaris.core.config.ProductionReadinessCheck; import org.apache.polaris.core.config.ProductionReadinessCheck.Error; import org.apache.polaris.core.persistence.MetaStoreManagerFactory; -import org.eclipse.microprofile.config.inject.ConfigProperty; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,12 +37,9 @@ public class EclipseLinkProductionReadinessChecks { @Produces public ProductionReadinessCheck checkEclipseLink( - @ConfigProperty(name = "polaris.persistence.type") String persistenceType, - @Any Instance metaStoreManagerFactories, + MetaStoreManagerFactory metaStoreManagerFactory, EclipseLinkConfiguration eclipseLinkConfiguration) { // This check should only be applicable when persistence uses EclipseLink. - MetaStoreManagerFactory metaStoreManagerFactory = - metaStoreManagerFactories.select(Identifier.Literal.of(persistenceType)).get(); if (!(metaStoreManagerFactory instanceof EclipseLinkPolarisMetaStoreManagerFactory)) { return ProductionReadinessCheck.OK; } diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcProductionReadinessChecks.java b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcProductionReadinessChecks.java index b298275dd34..89d48f73d81 100644 --- a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcProductionReadinessChecks.java +++ b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcProductionReadinessChecks.java @@ -19,10 +19,7 @@ package org.apache.polaris.extension.persistence.relational.jdbc; -import io.smallrye.common.annotation.Identifier; import jakarta.enterprise.context.ApplicationScoped; -import jakarta.enterprise.inject.Any; -import jakarta.enterprise.inject.Instance; import jakarta.enterprise.inject.Produces; import java.util.Optional; import org.apache.polaris.core.config.ProductionReadinessCheck; @@ -34,11 +31,9 @@ public class RelationalJdbcProductionReadinessChecks { @Produces public ProductionReadinessCheck checkRelationalJdbc( @ConfigProperty(name = "quarkus.datasource.jdbc.url") Optional jdbcUrl, - @ConfigProperty(name = "polaris.persistence.type") String persistenceType, - @Any Instance metaStoreManagerFactories) { + MetaStoreManagerFactory metaStoreManagerFactory) { // This check should only be applicable when persistence uses RelationalJdbc. - if (!(metaStoreManagerFactories.select(Identifier.Literal.of(persistenceType)).get() - instanceof JdbcMetaStoreManagerFactory)) { + if (!(metaStoreManagerFactory instanceof JdbcMetaStoreManagerFactory)) { return ProductionReadinessCheck.OK; } From e6f675ad08ed5ea6e8b32c9745eee083e8da7ee3 Mon Sep 17 00:00:00 2001 From: Prashant Date: Thu, 29 May 2025 10:28:40 -0700 Subject: [PATCH 4/4] Update production readiness check --- .../relational-jdbc/build.gradle.kts | 2 -- .../jdbc/JdbcMetaStoreManagerFactory.java | 13 ++++++++----- ...lationalJdbcProductionReadinessChecks.java | 19 ++++++++++++------- gradle/libs.versions.toml | 1 - quarkus/server/distribution/LICENSE | 1 - 5 files changed, 20 insertions(+), 16 deletions(-) diff --git a/extension/persistence/relational-jdbc/build.gradle.kts b/extension/persistence/relational-jdbc/build.gradle.kts index a6d550a47f6..b38baf9df46 100644 --- a/extension/persistence/relational-jdbc/build.gradle.kts +++ b/extension/persistence/relational-jdbc/build.gradle.kts @@ -34,10 +34,8 @@ dependencies { compileOnly(libs.jakarta.inject.api) implementation(libs.smallrye.common.annotation) // @Identifier - compileOnly(libs.microprofile.config.api) // @ConfigMapping testImplementation(libs.mockito.junit.jupiter) - testImplementation(libs.h2) testImplementation(testFixtures(project(":polaris-core"))) } diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java index f3d028eb9d2..e36395d84c1 100644 --- a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java +++ b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/JdbcMetaStoreManagerFactory.java @@ -108,16 +108,19 @@ private void initializeForRealm( metaStoreManagerMap.put(realmContext.getRealmIdentifier(), metaStoreManager); } + protected DatabaseType getDatabaseType() throws SQLException { + try (Connection connection = dataSource.get().getConnection()) { + String productName = connection.getMetaData().getDatabaseProductName(); + return DatabaseType.fromDisplayName(productName); + } + } + private DatasourceOperations getDatasourceOperations(boolean isBootstrap) { DatasourceOperations databaseOperations = new DatasourceOperations(dataSource.get(), relationalJdbcConfiguration); if (isBootstrap) { try { - DatabaseType databaseType; - try (Connection connection = dataSource.get().getConnection()) { - String productName = connection.getMetaData().getDatabaseProductName(); - databaseType = DatabaseType.fromDisplayName(productName); - } + DatabaseType databaseType = getDatabaseType(); databaseOperations.executeScript( String.format("%s/schema-v1.sql", databaseType.getDisplayName())); } catch (SQLException e) { diff --git a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcProductionReadinessChecks.java b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcProductionReadinessChecks.java index 89d48f73d81..581c0a0a6ec 100644 --- a/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcProductionReadinessChecks.java +++ b/extension/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/persistence/relational/jdbc/RelationalJdbcProductionReadinessChecks.java @@ -21,27 +21,32 @@ import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Produces; -import java.util.Optional; +import java.sql.SQLException; import org.apache.polaris.core.config.ProductionReadinessCheck; import org.apache.polaris.core.persistence.MetaStoreManagerFactory; -import org.eclipse.microprofile.config.inject.ConfigProperty; @ApplicationScoped public class RelationalJdbcProductionReadinessChecks { @Produces public ProductionReadinessCheck checkRelationalJdbc( - @ConfigProperty(name = "quarkus.datasource.jdbc.url") Optional jdbcUrl, MetaStoreManagerFactory metaStoreManagerFactory) { // This check should only be applicable when persistence uses RelationalJdbc. - if (!(metaStoreManagerFactory instanceof JdbcMetaStoreManagerFactory)) { + if (!(metaStoreManagerFactory + instanceof JdbcMetaStoreManagerFactory jdbcMetaStoreManagerFactory)) { return ProductionReadinessCheck.OK; } - if (jdbcUrl.isPresent() && jdbcUrl.get().startsWith("jdbc:h2")) { + try { + if (jdbcMetaStoreManagerFactory.getDatabaseType().equals(DatabaseType.H2)) { + return ProductionReadinessCheck.of( + ProductionReadinessCheck.Error.of( + "The current persistence (jdbc:h2) is intended for tests only.", + "quarkus.datasource.jdbc.url")); + } + } catch (SQLException e) { return ProductionReadinessCheck.of( ProductionReadinessCheck.Error.of( - "The current persistence (jdbc:h2) is intended for tests only.", - "quarkus.datasource.jdbc.url")); + "Misconfigured JDBC datasource", "quarkus.datasource.jdbc.url")); } return ProductionReadinessCheck.OK; } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 32865f80aa7..274aa3c2c80 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -73,7 +73,6 @@ junit-bom = { module = "org.junit:junit-bom", version = "5.12.2" } logback-classic = { module = "ch.qos.logback:logback-classic", version = "1.5.18" } micrometer-bom = { module = "io.micrometer:micrometer-bom", version = "1.15.0" } microprofile-fault-tolerance-api = { module = "org.eclipse.microprofile.fault-tolerance:microprofile-fault-tolerance-api", version = "4.1.2" } -microprofile-config-api = {module = "org.eclipse.microprofile.config:microprofile-config-api", version = "3.0.3"} mockito-core = { module = "org.mockito:mockito-core", version = "5.18.0" } mockito-junit-jupiter = { module = "org.mockito:mockito-junit-jupiter", version = "5.18.0" } opentelemetry-bom = { module = "io.opentelemetry:opentelemetry-bom", version = "1.50.0" } diff --git a/quarkus/server/distribution/LICENSE b/quarkus/server/distribution/LICENSE index f241f1433bf..ce5ff26a973 100644 --- a/quarkus/server/distribution/LICENSE +++ b/quarkus/server/distribution/LICENSE @@ -1476,7 +1476,6 @@ License: Apache License 2.0 - https://www.apache.org/licenses/LICENSE-2.0.txt Group: org.eclipse.microprofile.config Name: microprofile-config-api Version: 3.1 Group: org.eclipse.microprofile.context-propagation Name: microprofile-context-propagation-api Version: 1.3 Group: org.eclipse.microprofile.fault-tolerance Name: microprofile-fault-tolerance-api Version: 4.1.1 -Group: org.eclipse.microprofile.config Name: microprofile-config-api Version: 3.0.3 Group: org.eclipse.microprofile.health Name: microprofile-health-api Version: 4.0.1 Group: org.eclipse.microprofile.jwt Name: microprofile-jwt-auth-api Version: 2.1 Group: org.eclipse.microprofile.reactive-streams-operators Name: microprofile-reactive-streams-operators-api Version: 3.0.1