This is an automated email from the ASF dual-hosted git repository.
chengpan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kyuubi-shaded.git
The following commit(s) were added to refs/heads/master by this push:
new 24cf0a8 [KYUUBI-SHADED #64] New util module wraps sun.misc.Signal
24cf0a8 is described below
commit 24cf0a8648fa62a9eda8529a60100a69e9e6dd76
Author: Cheng Pan <[email protected]>
AuthorDate: Mon Jul 21 11:45:56 2025 +0800
[KYUUBI-SHADED #64] New util module wraps sun.misc.Signal
### _Why are the changes needed?_
To allow Kyuubi to compile with `-release:8` in JDK 9+, we must cut off
direct access `sun.misc.Signal`, this PR achieves it by creating wrapper
classes of `sun.misc.Signal` and `sun.misc.SignalHandler` in the Kyuubi Shaded
project.
Currently, both Kyuubi and Kyuubi Shaded use Java 8 for release. After this
change, Kyuubi can use any of Java 8+ to compile with `-release:8` while still
ensuring compatibility with Java 8.
### _How was this patch tested?_
Have done a PoC - modify Kyuubi code to use the wrapper Signal classes, and
compile with JDK 21, run on JDK 8, everything works as expected.
Closes #64 from pan3793/util.
d32ce7d [Cheng Pan] New util module wraps sun.misc.Signal
Authored-by: Cheng Pan <[email protected]>
Signed-off-by: Cheng Pan <[email protected]>
---
kyuubi-relocated-util/pom.xml | 56 +++++++
.../java/org/apache/kyuubi/shaded/util/Signal.java | 181 +++++++++++++++++++++
.../apache/kyuubi/shaded/util/SignalHandler.java | 36 ++++
pom.xml | 27 ++-
4 files changed, 284 insertions(+), 16 deletions(-)
diff --git a/kyuubi-relocated-util/pom.xml b/kyuubi-relocated-util/pom.xml
new file mode 100644
index 0000000..ba4b04d
--- /dev/null
+++ b/kyuubi-relocated-util/pom.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.kyuubi</groupId>
+ <artifactId>kyuubi-relocated-parent</artifactId>
+ <version>0.6.0-SNAPSHOT</version>
+ </parent>
+
+ <artifactId>kyuubi-relocated-util</artifactId>
+ <description>Utility classes used by Kyuubi internally.</description>
+
+ <properties>
+ <slf4j.version>1.7.36</slf4j.version>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>${slf4j.version}</version>
+ <scope>provided</scope>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <!-- Used to resolve variables in the 'version' tag -->
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>flatten-maven-plugin</artifactId>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git
a/kyuubi-relocated-util/src/main/java/org/apache/kyuubi/shaded/util/Signal.java
b/kyuubi-relocated-util/src/main/java/org/apache/kyuubi/shaded/util/Signal.java
new file mode 100644
index 0000000..7ab368c
--- /dev/null
+++
b/kyuubi-relocated-util/src/main/java/org/apache/kyuubi/shaded/util/Signal.java
@@ -0,0 +1,181 @@
+/*
+ * 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.kyuubi.shaded.util;
+
+public final class Signal {
+
+ // Delegate to sun.misc.Signal.
+ private final sun.misc.Signal iSignal;
+
+ /* Returns the signal number */
+ public int getNumber() {
+ return iSignal.getNumber();
+ }
+
+ /**
+ * Returns the signal name.
+ *
+ * @return the name of the signal.
+ * @see sun.misc.Signal#Signal(String name)
+ */
+ public String getName() {
+ return iSignal.getName();
+ }
+
+ /**
+ * Compares the equality of two <code>Signal</code> objects.
+ *
+ * @param other the object to compare with.
+ * @return whether two <code>Signal</code> objects are equal.
+ */
+ public boolean equals(Object other) {
+ if (this == other) {
+ return true;
+ }
+ if (other == null || !(other instanceof Signal)) {
+ return false;
+ }
+ Signal other1 = (Signal) other;
+ return iSignal.equals(other1.iSignal);
+ }
+
+ /**
+ * Returns a hashcode for this Signal.
+ *
+ * @return a hash code value for this object.
+ */
+ public int hashCode() {
+ return getNumber();
+ }
+
+ /**
+ * Returns a string representation of this signal. For example, "SIGINT" for
an object constructed
+ * using <code>new Signal ("INT")</code>.
+ *
+ * @return a string representation of the signal
+ */
+ public String toString() {
+ return iSignal.toString();
+ }
+
+ /**
+ * Constructs a signal from its name.
+ *
+ * @param name the name of the signal.
+ * @exception IllegalArgumentException unknown signal
+ * @see sun.misc.Signal#getName()
+ */
+ public Signal(String name) {
+ iSignal = new sun.misc.Signal(name);
+ }
+
+ /**
+ * Registers a signal handler.
+ *
+ * @param sig a signal
+ * @param handler the handler to be registered with the given signal.
+ * @return the old handler
+ * @exception IllegalArgumentException the signal is in use by the VM
+ * @see sun.misc.Signal#raise(sun.misc.Signal sig)
+ * @see sun.misc.SignalHandler
+ * @see sun.misc.SignalHandler#SIG_DFL
+ * @see sun.misc.SignalHandler#SIG_IGN
+ */
+ public static synchronized SignalHandler handle(Signal sig, SignalHandler
handler)
+ throws IllegalArgumentException {
+ sun.misc.SignalHandler oldHandler =
+ sun.misc.Signal.handle(sig.iSignal, SunMiscHandler.of(sig, handler));
+ return KyuubiSignalHandler.of(sig.iSignal, oldHandler);
+ }
+
+ /**
+ * Raises a signal in the current process.
+ *
+ * @param sig a signal
+ * @see sun.misc.Signal#handle(sun.misc.Signal sig, sun.misc.SignalHandler
handler)
+ */
+ public static void raise(Signal sig) throws IllegalArgumentException {
+ sun.misc.Signal.raise(sig.iSignal);
+ }
+
+ /*
+ * Wrapper class to proxy a SignalHandler to a sun.misc.SignalHandler.
+ */
+ static final class SunMiscHandler implements sun.misc.SignalHandler {
+ private final SignalHandler handler;
+ private final Signal signal;
+
+ static sun.misc.SignalHandler of(Signal signal, SignalHandler handler) {
+ if (handler == SignalHandler.SIG_DFL) {
+ return sun.misc.SignalHandler.SIG_DFL;
+ } else if (handler == SignalHandler.SIG_IGN) {
+ return sun.misc.SignalHandler.SIG_IGN;
+ } else if (handler instanceof KyuubiSignalHandler) {
+ return ((KyuubiSignalHandler) handler).iHandler;
+ } else {
+ return new SunMiscHandler(signal, handler);
+ }
+ }
+
+ private SunMiscHandler(Signal signal, SignalHandler handler) {
+ this.handler = handler;
+ this.signal = signal;
+ }
+
+ @Override
+ public void handle(sun.misc.Signal ignore) {
+ handler.handle(signal);
+ }
+ }
+
+ /*
+ * Wrapper class to proxy a sun.misc.SignalHandler to a SignalHandler.
+ */
+ static final class KyuubiSignalHandler implements SignalHandler {
+ private final sun.misc.Signal iSignal;
+ private final sun.misc.SignalHandler iHandler;
+
+ static SignalHandler of(sun.misc.Signal signal, sun.misc.SignalHandler
handler) {
+ if (handler == sun.misc.SignalHandler.SIG_DFL) {
+ return SignalHandler.SIG_DFL;
+ } else if (handler == sun.misc.SignalHandler.SIG_IGN) {
+ return SignalHandler.SIG_IGN;
+ } else if (handler instanceof SunMiscHandler) {
+ return ((SunMiscHandler) handler).handler;
+ } else {
+ return new KyuubiSignalHandler(signal, handler);
+ }
+ }
+
+ KyuubiSignalHandler(sun.misc.Signal iSignal, sun.misc.SignalHandler
iHandler) {
+ this.iSignal = iSignal;
+ this.iHandler = iHandler;
+ }
+
+ @Override
+ public void handle(Signal sig) {
+ iHandler.handle(iSignal);
+ }
+
+ public String toString() {
+ return iHandler.toString();
+ }
+ }
+}
diff --git
a/kyuubi-relocated-util/src/main/java/org/apache/kyuubi/shaded/util/SignalHandler.java
b/kyuubi-relocated-util/src/main/java/org/apache/kyuubi/shaded/util/SignalHandler.java
new file mode 100644
index 0000000..db8400f
--- /dev/null
+++
b/kyuubi-relocated-util/src/main/java/org/apache/kyuubi/shaded/util/SignalHandler.java
@@ -0,0 +1,36 @@
+/*
+ * 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.kyuubi.shaded.util;
+
+/** This is the signal handler interface expected in
<code>Signal.handle</code>. */
+public interface SignalHandler {
+
+ /** The default signal handler */
+ SignalHandler SIG_DFL = new Signal.KyuubiSignalHandler(null,
sun.misc.SignalHandler.SIG_DFL);
+ /** Ignore the signal */
+ SignalHandler SIG_IGN = new Signal.KyuubiSignalHandler(null,
sun.misc.SignalHandler.SIG_IGN);
+
+ /**
+ * Handle the given signal
+ *
+ * @param sig a signal object
+ */
+ void handle(Signal sig);
+}
diff --git a/pom.xml b/pom.xml
index fecc077..b06172a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -56,6 +56,7 @@
<module>kyuubi-relocated-hive-service-rpc</module>
<module>kyuubi-relocated-spark-connect-rpc</module>
<module>kyuubi-relocated-thrift</module>
+ <module>kyuubi-relocated-util</module>
<module>kyuubi-relocated-zookeeper-parent</module>
</modules>
@@ -360,12 +361,6 @@
</executions>
</plugin>
- <plugin>
- <groupId>com.googlecode.maven-download-plugin</groupId>
- <artifactId>download-maven-plugin</artifactId>
- <version>${maven.plugin.download.version}</version>
- </plugin>
-
<plugin>
<groupId>org.apache.rat</groupId>
<artifactId>apache-rat-plugin</artifactId>
@@ -469,16 +464,6 @@
</build>
<profiles>
- <profile>
- <id>java-8</id>
- <activation>
- <jdk>8</jdk>
- </activation>
- <properties>
- <java.version>8</java.version>
- </properties>
- </profile>
-
<profile>
<id>apache-release</id>
<build>
@@ -554,5 +539,15 @@
</plugins>
</build>
</profile>
+ <profile>
+ <id>jdk9+</id>
+ <activation>
+ <jdk>[9,)</jdk>
+ </activation>
+ <properties>
+ <!-- Make Java 9+ happy, release is not affected since it uses
Java 8. -->
+ <maven.compiler.release></maven.compiler.release>
+ </properties>
+ </profile>
</profiles>
</project>