This is an automated email from the ASF dual-hosted git repository.
jerryshao pushed a commit to branch branch-1.3
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/branch-1.3 by this push:
new 81b3024bb9 [Cherry-pick to branch-1.3] [#12755] fix(bundles): Exclude
optional WildFly OpenSSL implementation (#13289) (#13306)
81b3024bb9 is described below
commit 81b3024bb978aa0b801ea53f5e0e15588ffaaa5c
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Fri Sep 18 16:51:00 2026 +0800
[Cherry-pick to branch-1.3] [#12755] fix(bundles): Exclude optional WildFly
OpenSSL implementation (#13289) (#13306)
**Cherry-pick Information:**
- Original commit: 3b41249d04ef9986434663236c89a87f88709272
- Target branch: `branch-1.3`
- Status: ✅ Clean cherry-pick (no conflicts)
Co-authored-by: Bharath Krishna <[email protected]>
---
bundles/aws-bundle/build.gradle.kts | 14 ++++-
.../apache/gravitino/bundles/TestAwsBundleTls.java | 61 ++++++++++++++++++++++
bundles/azure-bundle/build.gradle.kts | 13 +++++
.../gravitino/bundles/TestAzureBundleTls.java | 61 ++++++++++++++++++++++
docs/fileset-catalog-with-adls.md | 4 ++
docs/fileset-catalog-with-s3.md | 4 ++
6 files changed, 156 insertions(+), 1 deletion(-)
diff --git a/bundles/aws-bundle/build.gradle.kts
b/bundles/aws-bundle/build.gradle.kts
index b7ee492719..7056bea806 100644
--- a/bundles/aws-bundle/build.gradle.kts
+++ b/bundles/aws-bundle/build.gradle.kts
@@ -33,6 +33,10 @@ dependencies {
implementation(libs.aws.sts)
implementation(libs.hadoop3.client.api)
implementation(libs.hadoop3.client.runtime)
+
+ testImplementation(libs.junit.jupiter.api)
+ testImplementation(libs.slf4j.api)
+ testRuntimeOnly(libs.junit.jupiter.engine)
}
tasks.withType(ShadowJar::class.java) {
@@ -42,6 +46,8 @@ tasks.withType(ShadowJar::class.java) {
dependencies {
exclude(dependency("org.slf4j:slf4j-api"))
+ // The optional OpenSSL provider contains LGPL code. Hadoop's default mode
falls back to JSSE.
+ exclude(dependency("org.wildfly.openssl:wildfly-openssl"))
// Exclude Gravitino modules to prevent class duplication and "Split
Packages" issues.
// These modules (api, common, catalogs) are already provided by the
Gravitino server and gravitino-filesystem-hadoop3-runtime.
@@ -63,7 +69,6 @@ tasks.withType(ShadowJar::class.java) {
relocate("org.apache.http",
"org.apache.gravitino.aws.shaded.org.apache.http")
relocate("org.checkerframework",
"org.apache.gravitino.aws.shaded.org.checkerframework")
relocate("org.reactivestreams",
"org.apache.gravitino.aws.shaded.org.reactivestreams")
- relocate("org.wildfly.openssl",
"org.apache.gravitino.aws.shaded.org.wildfly.openssl")
mergeServiceFiles()
}
@@ -76,3 +81,10 @@ tasks.jar {
tasks.compileJava {
dependsOn(":catalogs:catalog-fileset:runtimeJars")
}
+
+tasks.test {
+ val bundle = tasks.named<ShadowJar>("shadowJar")
+ dependsOn(bundle)
+ inputs.file(bundle.flatMap { it.archiveFile })
+ doFirst { systemProperty("shadowJarPath",
bundle.get().archiveFile.get().asFile.absolutePath) }
+}
diff --git
a/bundles/aws-bundle/src/test/java/org/apache/gravitino/bundles/TestAwsBundleTls.java
b/bundles/aws-bundle/src/test/java/org/apache/gravitino/bundles/TestAwsBundleTls.java
new file mode 100644
index 0000000000..49106cb93a
--- /dev/null
+++
b/bundles/aws-bundle/src/test/java/org/apache/gravitino/bundles/TestAwsBundleTls.java
@@ -0,0 +1,61 @@
+/*
+ * 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.gravitino.bundles;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+import java.io.File;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.jar.JarFile;
+import org.junit.jupiter.api.Test;
+import org.slf4j.LoggerFactory;
+
+class TestAwsBundleTls {
+ private static final File BUNDLE = new
File(System.getProperty("shadowJarPath"));
+
+ @Test
+ void testBundleExcludesWildFlyImplementation() throws Exception {
+ try (JarFile jar = new JarFile(BUNDLE)) {
+ assertFalse(
+ jar.stream().anyMatch(entry ->
entry.getName().contains("org/wildfly/openssl/")),
+ BUNDLE.getName());
+ }
+ }
+
+ @Test
+ void testDefaultJsseModeWorksWithoutWildFly() throws Exception {
+ URL[] urls = {
+ BUNDLE.toURI().toURL(),
+ LoggerFactory.class.getProtectionDomain().getCodeSource().getLocation()
+ };
+ // The ordinary test classpath also contains unshaded Hadoop and the
optional provider.
+ try (URLClassLoader loader = new URLClassLoader(urls,
ClassLoader.getPlatformClassLoader())) {
+ Class<?> factory =
+
loader.loadClass("org.apache.hadoop.security.ssl.DelegatingSSLSocketFactory");
+ Class<?> mode = loader.loadClass(factory.getName() + "$SSLChannelMode");
+ factory
+ .getMethod("initializeDefaultFactory", mode)
+ .invoke(null, mode.getField("Default_JSSE").get(null));
+ Object instance = factory.getMethod("getDefaultFactory").invoke(null);
+ assertEquals("Default_JSSE",
factory.getMethod("getChannelMode").invoke(instance).toString());
+ }
+ }
+}
diff --git a/bundles/azure-bundle/build.gradle.kts
b/bundles/azure-bundle/build.gradle.kts
index 632cc83d53..b2574b544b 100644
--- a/bundles/azure-bundle/build.gradle.kts
+++ b/bundles/azure-bundle/build.gradle.kts
@@ -36,6 +36,10 @@ dependencies {
implementation(libs.hadoop3.abs)
implementation(libs.hadoop3.client.api)
implementation(libs.hadoop3.client.runtime)
+
+ testImplementation(libs.junit.jupiter.api)
+ testImplementation(libs.slf4j.api)
+ testRuntimeOnly(libs.junit.jupiter.engine)
}
tasks.withType(ShadowJar::class.java) {
@@ -45,6 +49,8 @@ tasks.withType(ShadowJar::class.java) {
dependencies {
exclude(dependency("org.slf4j:slf4j-api"))
+ // The optional OpenSSL provider contains LGPL code. Hadoop's default mode
falls back to JSSE.
+ exclude(dependency("org.wildfly.openssl:wildfly-openssl"))
// Exclude Gravitino modules to prevent class duplication and "Split
Packages" issues.
// These modules (api, common, catalogs) are already provided by the
Gravitino server and gravitino-filesystem-hadoop3-runtime.
@@ -87,3 +93,10 @@ tasks.jar {
tasks.compileJava {
dependsOn(":catalogs:catalog-fileset:runtimeJars")
}
+
+tasks.test {
+ val bundle = tasks.named<ShadowJar>("shadowJar")
+ dependsOn(bundle)
+ inputs.file(bundle.flatMap { it.archiveFile })
+ doFirst { systemProperty("shadowJarPath",
bundle.get().archiveFile.get().asFile.absolutePath) }
+}
diff --git
a/bundles/azure-bundle/src/test/java/org/apache/gravitino/bundles/TestAzureBundleTls.java
b/bundles/azure-bundle/src/test/java/org/apache/gravitino/bundles/TestAzureBundleTls.java
new file mode 100644
index 0000000000..fd00e0d8c5
--- /dev/null
+++
b/bundles/azure-bundle/src/test/java/org/apache/gravitino/bundles/TestAzureBundleTls.java
@@ -0,0 +1,61 @@
+/*
+ * 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.gravitino.bundles;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+import java.io.File;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.jar.JarFile;
+import org.junit.jupiter.api.Test;
+import org.slf4j.LoggerFactory;
+
+class TestAzureBundleTls {
+ private static final File BUNDLE = new
File(System.getProperty("shadowJarPath"));
+
+ @Test
+ void testBundleExcludesWildFlyImplementation() throws Exception {
+ try (JarFile jar = new JarFile(BUNDLE)) {
+ assertFalse(
+ jar.stream().anyMatch(entry ->
entry.getName().contains("org/wildfly/openssl/")),
+ BUNDLE.getName());
+ }
+ }
+
+ @Test
+ void testDefaultModeFallsBackToJsse() throws Exception {
+ URL[] urls = {
+ BUNDLE.toURI().toURL(),
+ LoggerFactory.class.getProtectionDomain().getCodeSource().getLocation()
+ };
+ // The ordinary test classpath also contains unshaded Hadoop and the
optional provider.
+ try (URLClassLoader loader = new URLClassLoader(urls,
ClassLoader.getPlatformClassLoader())) {
+ Class<?> factory =
+
loader.loadClass("org.apache.hadoop.security.ssl.DelegatingSSLSocketFactory");
+ Class<?> mode = loader.loadClass(factory.getName() + "$SSLChannelMode");
+ factory
+ .getMethod("initializeDefaultFactory", mode)
+ .invoke(null, mode.getField("Default").get(null));
+ Object instance = factory.getMethod("getDefaultFactory").invoke(null);
+ assertEquals("Default_JSSE",
factory.getMethod("getChannelMode").invoke(instance).toString());
+ }
+ }
+}
diff --git a/docs/fileset-catalog-with-adls.md
b/docs/fileset-catalog-with-adls.md
index be3fa2f83e..9c0a076300 100644
--- a/docs/fileset-catalog-with-adls.md
+++ b/docs/fileset-catalog-with-adls.md
@@ -32,6 +32,10 @@ The catalog automatically loads the Azure Data Lake Storage
filesystem provider
classpath. The deprecated `filesystem-providers` and
`default-filesystem-provider` catalog
properties do not need to be set.
+The bundle uses JSSE for TLS and does not include the optional WildFly OpenSSL
provider.
+If you explicitly set Hadoop's `fs.azure.ssl.channel.mode` to `OpenSSL`,
install a compatible
+provider separately on the catalog or client classpath. The default mode does
not require it.
+
## Azure Data Lake Storage Properties
These properties are needed in addition to the shared
diff --git a/docs/fileset-catalog-with-s3.md b/docs/fileset-catalog-with-s3.md
index bc523ce2fa..39ea40e600 100644
--- a/docs/fileset-catalog-with-s3.md
+++ b/docs/fileset-catalog-with-s3.md
@@ -32,6 +32,10 @@ The catalog automatically loads the Amazon S3 filesystem
provider once the bundl
classpath. The deprecated `filesystem-providers` and
`default-filesystem-provider` catalog
properties do not need to be set.
+The bundle uses JSSE for TLS and does not include the optional WildFly OpenSSL
provider.
+If you explicitly set Hadoop's `fs.s3a.ssl.channel.mode` to `OpenSSL`, install
a compatible
+provider separately on the catalog or client classpath. The default mode does
not require it.
+
## Amazon S3 Properties
These properties are needed in addition to the shared