From 1b1dde1ae2ba88fae1668f96e552671d5128f547 Mon Sep 17 00:00:00 2001 From: yanmin Date: Tue, 5 Nov 2024 11:59:48 +0800 Subject: [PATCH] HADOOP-19318. Remove usage of sun.misc.Signal --- LICENSE-binary | 5 +++ .../hadoop-client-minicluster/pom.xml | 1 + .../hadoop-client-runtime/pom.xml | 1 + hadoop-common-project/hadoop-common/pom.xml | 5 +++ .../service/launcher/InterruptEscalator.java | 3 +- .../hadoop/service/launcher/IrqHandler.java | 42 +++++++++---------- .../org/apache/hadoop/util/SignalLogger.java | 33 +++++++++------ .../TestServiceInterruptHandling.java | 11 ++--- .../org/apache/hadoop/hdfs/DFSClient.java | 2 +- hadoop-project/pom.xml | 6 +++ .../hadoop-yarn-server-nodemanager/pom.xml | 10 +++++ 11 files changed, 76 insertions(+), 43 deletions(-) diff --git a/LICENSE-binary b/LICENSE-binary index 1999e9494bff0..31ae702481ccc 100644 --- a/LICENSE-binary +++ b/LICENSE-binary @@ -521,6 +521,11 @@ junit:junit:4.13.2 org.jacoco:org.jacoco.agent:0.8.5 +Eclipse Public License 2.0 +-------------------------- + +com.github.jnr:jnr-posix:3.1.20 + HSQL License ------------ diff --git a/hadoop-client-modules/hadoop-client-minicluster/pom.xml b/hadoop-client-modules/hadoop-client-minicluster/pom.xml index b4a4948ef9215..b1b10249775db 100644 --- a/hadoop-client-modules/hadoop-client-minicluster/pom.xml +++ b/hadoop-client-modules/hadoop-client-minicluster/pom.xml @@ -709,6 +709,7 @@ org.bouncycastle:* org.xerial.snappy:* + com.github.jnr:* diff --git a/hadoop-client-modules/hadoop-client-runtime/pom.xml b/hadoop-client-modules/hadoop-client-runtime/pom.xml index ed410d255465a..c83c9a0466c61 100644 --- a/hadoop-client-modules/hadoop-client-runtime/pom.xml +++ b/hadoop-client-modules/hadoop-client-runtime/pom.xml @@ -159,6 +159,7 @@ org.xerial.snappy:* org.jetbrains.kotlin:* + com.github.jnr:* diff --git a/hadoop-common-project/hadoop-common/pom.xml b/hadoop-common-project/hadoop-common/pom.xml index 76ef1e1ccab40..6ceda0bc5d122 100644 --- a/hadoop-common-project/hadoop-common/pom.xml +++ b/hadoop-common-project/hadoop-common/pom.xml @@ -416,6 +416,11 @@ lz4-java provided + + com.github.jnr + jnr-posix + + diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/InterruptEscalator.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/InterruptEscalator.java index 4d43c3a106f5e..cd0688a12f8c4 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/InterruptEscalator.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/InterruptEscalator.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; +import jnr.constants.platform.Signal; import org.apache.hadoop.util.Preconditions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -140,7 +141,7 @@ public void interrupted(IrqHandler.InterruptData interruptData) { * @throws IllegalArgumentException if the registration failed */ public synchronized void register(String signalName) { - IrqHandler handler = new IrqHandler(signalName, this); + IrqHandler handler = new IrqHandler(Signal.valueOf(signalName), this); handler.bind(); interruptHandlers.add(handler); } diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java index d423e59aa9759..12bc8d7d10121 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java @@ -20,11 +20,13 @@ import java.util.concurrent.atomic.AtomicInteger; +import jnr.constants.platform.Signal; +import jnr.posix.POSIX; +import jnr.posix.POSIXFactory; +import jnr.posix.SignalHandler; import org.apache.hadoop.util.Preconditions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sun.misc.Signal; -import sun.misc.SignalHandler; import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; @@ -45,22 +47,18 @@ public final class IrqHandler implements SignalHandler { /** * Definition of the Control-C handler name: {@value}. */ - public static final String CONTROL_C = "INT"; + public static final String CONTROL_C = "SIGINT"; /** * Definition of default kill signal: {@value}. */ - public static final String SIGTERM = "TERM"; - - /** - * Signal name. - */ - private final String name; + public static final String SIGTERM = "SIGTERM"; /** * Handler to relay to. */ private final Interrupted handler; + private static final POSIX POSIX_IMPL = POSIXFactory.getNativePOSIX(); /** Count of how many times a signal has been raised. */ private final AtomicInteger signalCount = new AtomicInteger(0); @@ -72,14 +70,14 @@ public final class IrqHandler implements SignalHandler { /** * Create an IRQ handler bound to the specific interrupt. - * @param name signal name + * @param signal signal * @param handler handler */ - public IrqHandler(String name, Interrupted handler) { - Preconditions.checkArgument(name != null, "Null \"name\""); + public IrqHandler(Signal signal, Interrupted handler) { + Preconditions.checkArgument(signal != null, "Null \"signal\""); Preconditions.checkArgument(handler != null, "Null \"handler\""); this.handler = handler; - this.name = name; + this.signal = signal; } /** @@ -87,13 +85,11 @@ public IrqHandler(String name, Interrupted handler) { * @throws IllegalArgumentException if the exception could not be set */ public void bind() { - Preconditions.checkState(signal == null, "Handler already bound"); try { - signal = new Signal(name); - Signal.handle(signal, this); + POSIX_IMPL.signal(signal, this); } catch (IllegalArgumentException e) { throw new IllegalArgumentException( - "Could not set handler for signal \"" + name + "\"." + "Could not set handler for signal \"" + signal + "\"." + "This can happen if the JVM has the -Xrs set.", e); } @@ -103,29 +99,29 @@ public void bind() { * @return the signal name. */ public String getName() { - return name; + return signal.name(); } /** * Raise the signal. */ public void raise() { - Signal.raise(signal); + POSIX_IMPL.kill(POSIX_IMPL.getpid(), signal.intValue()); } @Override public String toString() { - return "IrqHandler for signal " + name; + return "IrqHandler for signal " + signal.name(); } /** * Handler for the JVM API for signal handling. - * @param s signal raised + * @param signalNumber signal raised */ @Override - public void handle(Signal s) { + public void handle(int signalNumber) { signalCount.incrementAndGet(); - InterruptData data = new InterruptData(s.getName(), s.getNumber()); + InterruptData data = new InterruptData(signal.name(), signalNumber); LOG.info("Interrupted: {}", data); handler.interrupted(data); } diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalLogger.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalLogger.java index 9f112906b2ee6..79638b96c9b2d 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalLogger.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalLogger.java @@ -18,13 +18,17 @@ package org.apache.hadoop.util; +import jnr.constants.platform.Signal; +import jnr.posix.POSIX; +import jnr.posix.POSIXFactory; +import jnr.posix.SignalHandler; import org.slf4j.Logger; -import sun.misc.Signal; -import sun.misc.SignalHandler; - import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; +import java.util.EnumSet; +import java.util.Set; + /** * This class logs a message whenever we're about to exit on a UNIX signal. * This is helpful for determining the root cause of a process' exit. @@ -35,6 +39,10 @@ @InterfaceStability.Unstable public enum SignalLogger { INSTANCE; + private static final Set SIGNALS = + EnumSet.of(Signal.SIGHUP, Signal.SIGINT, Signal.SIGTERM); + private static final POSIX POSIX_IMPL = POSIXFactory.getJavaPOSIX(); + private static final SignalHandler DEFAULT_HANDLER = System::exit; private boolean registered = false; @@ -45,9 +53,10 @@ private static class Handler implements SignalHandler { final private Logger log; final private SignalHandler prevHandler; - Handler(String name, Logger log) { + Handler(Signal signal, Logger log) { this.log = log; - prevHandler = Signal.handle(new Signal(name), this); + SignalHandler handler = POSIX_IMPL.signal(signal, this); + prevHandler = handler != null ? handler : DEFAULT_HANDLER; } /** @@ -56,9 +65,8 @@ private static class Handler implements SignalHandler { * @param signal The incoming signal */ @Override - public void handle(Signal signal) { - log.error("RECEIVED SIGNAL " + signal.getNumber() + - ": SIG" + signal.getName()); + public void handle(int signal) { + log.error("RECEIVED SIGNAL {}: {}", signal, Signal.valueOf(signal)); prevHandler.handle(signal); } } @@ -75,16 +83,15 @@ public void register(final Logger log) { registered = true; StringBuilder bld = new StringBuilder(); bld.append("registered UNIX signal handlers for ["); - final String SIGNALS[] = { "TERM", "HUP", "INT" }; String separator = ""; - for (String signalName : SIGNALS) { + for (Signal signal : SIGNALS) { try { - new Handler(signalName, log); + new Handler(signal, log); bld.append(separator) - .append(signalName); + .append(signal.name()); separator = ", "; } catch (Exception e) { - log.debug("Error: ", e); + log.info("Error installing UNIX signal handler for {}", signal, e); } } bld.append("]"); diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/TestServiceInterruptHandling.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/TestServiceInterruptHandling.java index 8181e07fae01f..37ba0d4c48d9f 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/TestServiceInterruptHandling.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/service/launcher/TestServiceInterruptHandling.java @@ -18,6 +18,7 @@ package org.apache.hadoop.service.launcher; +import jnr.constants.platform.Signal; import org.apache.hadoop.service.BreakableService; import org.apache.hadoop.service.launcher.testservices.FailureTestService; import org.apache.hadoop.test.GenericTestUtils; @@ -38,8 +39,8 @@ public class TestServiceInterruptHandling @Test public void testRegisterAndRaise() throws Throwable { InterruptCatcher catcher = new InterruptCatcher(); - String name = "USR2"; - IrqHandler irqHandler = new IrqHandler(name, catcher); + String name = "SIGINT"; + IrqHandler irqHandler = new IrqHandler(Signal.valueOf(name), catcher); irqHandler.bind(); assertEquals(0, irqHandler.getSignalCount()); irqHandler.raise(); @@ -61,7 +62,7 @@ public void testInterruptEscalationShutdown() throws Throwable { // call the interrupt operation directly try { - escalator.interrupted(new IrqHandler.InterruptData("INT", 3)); + escalator.interrupted(new IrqHandler.InterruptData("SIGINT", 3)); fail("Expected an exception to be raised in " + escalator); } catch (ExitUtil.ExitException e) { assertExceptionDetails(EXIT_INTERRUPTED, "", e); @@ -75,7 +76,7 @@ public void testInterruptEscalationShutdown() throws Throwable { // now interrupt it a second time and expect it to escalate to a halt try { - escalator.interrupted(new IrqHandler.InterruptData("INT", 3)); + escalator.interrupted(new IrqHandler.InterruptData("SIGINT", 3)); fail("Expected an exception to be raised in " + escalator); } catch (ExitUtil.HaltException e) { assertExceptionDetails(EXIT_INTERRUPTED, "", e); @@ -93,7 +94,7 @@ public void testBlockingShutdownTimeouts() throws Throwable { InterruptEscalator escalator = new InterruptEscalator(launcher, 500); // call the interrupt operation directly try { - escalator.interrupted(new IrqHandler.InterruptData("INT", 3)); + escalator.interrupted(new IrqHandler.InterruptData("SIGINT", 3)); fail("Expected an exception to be raised from " + escalator); } catch (ExitUtil.ExitException e) { assertExceptionDetails(EXIT_INTERRUPTED, "", e); diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java index cbe7516b0ede0..cc0e0aef75b13 100755 --- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java +++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java @@ -222,7 +222,7 @@ public class DFSClient implements java.io.Closeable, RemotePeerFactory, final ClientProtocol namenode; /* The service used for delegation tokens */ private Text dtService; - + final UserGroupInformation ugi; volatile boolean clientRunning = true; volatile long lastLeaseRenewal; diff --git a/hadoop-project/pom.xml b/hadoop-project/pom.xml index e28ddff1921dc..2550f5b7376b8 100644 --- a/hadoop-project/pom.xml +++ b/hadoop-project/pom.xml @@ -238,6 +238,7 @@ v1.22.5 1.10.13 1.20 + 3.1.20 @@ -2147,6 +2148,11 @@ cache-api ${cache.api.version} + + com.github.jnr + jnr-posix + ${jnr.posix.version} + diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/pom.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/pom.xml index 2f4148d1849df..60137f38ec972 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/pom.xml +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-nodemanager/pom.xml @@ -86,6 +86,16 @@ org.eclipse.jetty.websocket javax-websocket-server-impl + + + asm-commons + org.ow2.asm + + + asm-tree + org.ow2.asm + + org.apache.hadoop.thirdparty