[ https://issues.apache.org/jira/browse/HADOOP-19329?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17985817#comment-17985817 ]
ASF GitHub Bot commented on HADOOP-19329: ----------------------------------------- pan3793 commented on code in PR #7759: URL: https://github.com/apache/hadoop/pull/7759#discussion_r2163419558 ########## hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalUtil.java: ########## @@ -0,0 +1,161 @@ +/* + * 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.hadoop.util; + +import org.apache.hadoop.classification.InterfaceAudience; + +import org.apache.hadoop.util.dynamic.BindingUtils; +import org.apache.hadoop.util.dynamic.DynConstructors; +import org.apache.hadoop.util.dynamic.DynMethods; + +import java.lang.reflect.Proxy; + +@InterfaceAudience.Private +public class SignalUtil { + + static final Class<?> jdkSignalClazz = + BindingUtils.loadClassSafely("sun.misc.Signal"); + static final Class<?> jdkSignalHandlerClazz = + BindingUtils.loadClassSafely("sun.misc.SignalHandler"); + + static DynConstructors.Ctor<?> jdkSignalCtor = + new DynConstructors.Builder() + .impl(jdkSignalClazz, String.class) + .build(); + + static DynMethods.StaticMethod jdkSignalHandleStaticMethod = + new DynMethods.Builder("handle") + .impl(jdkSignalClazz, jdkSignalClazz, jdkSignalHandlerClazz) + .buildStatic(); + + static DynMethods.StaticMethod jdkSignalRaiseStaticMethod = + new DynMethods.Builder("raise") + .impl(jdkSignalClazz, jdkSignalClazz) + .buildStatic(); + + static DynMethods.UnboundMethod jdkSignalHandlerHandleUnboundMethod = + new DynMethods.Builder("handle") + .impl(jdkSignalHandlerClazz, jdkSignalClazz) + .build(); + + @InterfaceAudience.Private + public static class Signal { + private final DynMethods.UnboundMethod getNumberUnboundMethod = + new DynMethods.Builder("getNumber").impl(jdkSignalClazz).build(); + + private final DynMethods.UnboundMethod getNameUnboundMethod = + new DynMethods.Builder("getName").impl(jdkSignalClazz).build(); + + private final Object delegate; + private final DynMethods.BoundMethod getNumberMethod; + private final DynMethods.BoundMethod getNameMethod; + + public Signal(String name) { + Preconditions.checkNotNull(name); + this.delegate = jdkSignalCtor.newInstance(name); + this.getNumberMethod = getNumberUnboundMethod.bind(delegate); + this.getNameMethod = getNameUnboundMethod.bind(delegate); + } + + public Signal(Object delegate) { + Preconditions.checkArgument(jdkSignalClazz.isInstance(delegate), + String.format("Expected class is '%s', but actual class is '%s'", + jdkSignalClazz.getName(), delegate.getClass().getName())); + this.delegate = delegate; + this.getNumberMethod = getNumberUnboundMethod.bind(delegate); + this.getNameMethod = getNameUnboundMethod.bind(delegate); + } + + public int getNumber() { + return getNumberMethod.invoke(); + } + + public String getName() { + return getNameMethod.invoke(); + } + + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof Signal) { + return delegate.equals(((Signal)obj).delegate); + } + return false; + } + + public int hashCode() { + return delegate.hashCode(); + } + + public String toString() { + return delegate.toString(); + } + } + + @InterfaceAudience.Private + public interface Handler { + void handle(Signal sig); + } + + static class JdkSignalHandlerImpl implements Handler { + + private final Object delegate; + private final DynMethods.BoundMethod jdkSignalHandlerHandleMethod; + + JdkSignalHandlerImpl(Handler handler) { + this.delegate = Proxy.newProxyInstance( + getClass().getClassLoader(), + new Class<?>[] { jdkSignalHandlerClazz }, + (proxyObj, method, args) -> { + if ("handle".equals(method.getName()) && args.length == 1 && jdkSignalClazz.isInstance(args[0])) { + handler.handle(new Signal(args[0])); + return null; + } else { + return method.invoke(proxyObj, args); Review Comment: you are right, I should forward other methods to the proxied object, updated. ########## hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalUtil.java: ########## @@ -0,0 +1,161 @@ +/* + * 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.hadoop.util; + +import org.apache.hadoop.classification.InterfaceAudience; + +import org.apache.hadoop.util.dynamic.BindingUtils; +import org.apache.hadoop.util.dynamic.DynConstructors; +import org.apache.hadoop.util.dynamic.DynMethods; + +import java.lang.reflect.Proxy; + +@InterfaceAudience.Private +public class SignalUtil { + + static final Class<?> jdkSignalClazz = + BindingUtils.loadClassSafely("sun.misc.Signal"); + static final Class<?> jdkSignalHandlerClazz = + BindingUtils.loadClassSafely("sun.misc.SignalHandler"); + + static DynConstructors.Ctor<?> jdkSignalCtor = + new DynConstructors.Builder() + .impl(jdkSignalClazz, String.class) + .build(); + + static DynMethods.StaticMethod jdkSignalHandleStaticMethod = + new DynMethods.Builder("handle") + .impl(jdkSignalClazz, jdkSignalClazz, jdkSignalHandlerClazz) + .buildStatic(); + + static DynMethods.StaticMethod jdkSignalRaiseStaticMethod = + new DynMethods.Builder("raise") + .impl(jdkSignalClazz, jdkSignalClazz) + .buildStatic(); + + static DynMethods.UnboundMethod jdkSignalHandlerHandleUnboundMethod = + new DynMethods.Builder("handle") + .impl(jdkSignalHandlerClazz, jdkSignalClazz) + .build(); + + @InterfaceAudience.Private + public static class Signal { + private final DynMethods.UnboundMethod getNumberUnboundMethod = + new DynMethods.Builder("getNumber").impl(jdkSignalClazz).build(); + + private final DynMethods.UnboundMethod getNameUnboundMethod = + new DynMethods.Builder("getName").impl(jdkSignalClazz).build(); + + private final Object delegate; + private final DynMethods.BoundMethod getNumberMethod; + private final DynMethods.BoundMethod getNameMethod; + + public Signal(String name) { + Preconditions.checkNotNull(name); + this.delegate = jdkSignalCtor.newInstance(name); + this.getNumberMethod = getNumberUnboundMethod.bind(delegate); + this.getNameMethod = getNameUnboundMethod.bind(delegate); + } + + public Signal(Object delegate) { + Preconditions.checkArgument(jdkSignalClazz.isInstance(delegate), + String.format("Expected class is '%s', but actual class is '%s'", + jdkSignalClazz.getName(), delegate.getClass().getName())); + this.delegate = delegate; + this.getNumberMethod = getNumberUnboundMethod.bind(delegate); + this.getNameMethod = getNameUnboundMethod.bind(delegate); + } + + public int getNumber() { + return getNumberMethod.invoke(); + } + + public String getName() { + return getNameMethod.invoke(); + } + + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj instanceof Signal) { + return delegate.equals(((Signal)obj).delegate); + } + return false; + } + + public int hashCode() { + return delegate.hashCode(); + } + + public String toString() { + return delegate.toString(); + } + } + + @InterfaceAudience.Private + public interface Handler { + void handle(Signal sig); + } + + static class JdkSignalHandlerImpl implements Handler { + + private final Object delegate; + private final DynMethods.BoundMethod jdkSignalHandlerHandleMethod; + + JdkSignalHandlerImpl(Handler handler) { + this.delegate = Proxy.newProxyInstance( + getClass().getClassLoader(), + new Class<?>[] { jdkSignalHandlerClazz }, + (proxyObj, method, args) -> { + if ("handle".equals(method.getName()) && args.length == 1 && jdkSignalClazz.isInstance(args[0])) { + handler.handle(new Signal(args[0])); + return null; + } else { + return method.invoke(proxyObj, args); Review Comment: you are right, I should forward other methods invocation to the proxied object, updated. > [JDK17] Remove usage of sun.misc.Signal > --------------------------------------- > > Key: HADOOP-19329 > URL: https://issues.apache.org/jira/browse/HADOOP-19329 > Project: Hadoop Common > Issue Type: Sub-task > Components: build > Reporter: yanmin > Assignee: yanmin > Priority: Major > Labels: pull-request-available > > when we build hadoop in JDK11 runtime based on > [https://github.com/apache/hadoop/pull/7085|https://github.com/apache/hadoop/pull/7085,] > JDK11 build is failing as flowing due to: {{package sun.misc does not > exist}} in. > > This is because that package sun.misc is not supported after jdk11. > {code:java} > [ERROR] Failed to execute goal > org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile > (default-compile) on project hadoop-common: Compilation failure: Compilation > failure: > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalLogger.java:[22,16] > package sun.misc does not exist > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalLogger.java:[23,16] > package sun.misc does not exist > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalLogger.java:[44,43] > cannot find symbol > [ERROR] symbol: class SignalHandler > [ERROR] location: class org.apache.hadoop.util.SignalLogger > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalLogger.java:[46,19] > cannot find symbol > [ERROR] symbol: class SignalHandler > [ERROR] location: class org.apache.hadoop.util.SignalLogger.Handler > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalLogger.java:[59,24] > cannot find symbol > [ERROR] symbol: class Signal > [ERROR] location: class org.apache.hadoop.util.SignalLogger.Handler > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java:[26,16] > package sun.misc does not exist > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java:[27,16] > package sun.misc does not exist > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java:[42,42] > cannot find symbol > [ERROR] symbol: class SignalHandler > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java:[71,11] > cannot find symbol > [ERROR] symbol: class Signal > [ERROR] location: class org.apache.hadoop.service.launcher.IrqHandler > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java:[126,22] > cannot find symbol > [ERROR] symbol: class Signal > [ERROR] location: class org.apache.hadoop.service.launcher.IrqHandler > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/NativeIO.java:[48,16] > package sun.misc does not exist > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/FastByteComparisons.java:[27,16] > package sun.misc does not exist > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/FastByteComparisons.java:[134,20] > cannot find symbol > [ERROR] symbol: class Unsafe > [ERROR] location: class > org.apache.hadoop.io.FastByteComparisons.LexicographicalComparerHolder.UnsafeComparer > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalLogger.java:[50,39] > cannot find symbol > [ERROR] symbol: class Signal > [ERROR] location: class org.apache.hadoop.util.SignalLogger.Handler > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalLogger.java:[50,21] > cannot find symbol > [ERROR] symbol: variable Signal > [ERROR] location: class org.apache.hadoop.util.SignalLogger.Handler > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/util/SignalLogger.java:[58,5] > method does not override or implement a method from a supertype > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java:[92,20] > cannot find symbol > [ERROR] symbol: class Signal > [ERROR] location: class org.apache.hadoop.service.launcher.IrqHandler > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java:[93,7] > cannot find symbol > [ERROR] symbol: variable Signal > [ERROR] location: class org.apache.hadoop.service.launcher.IrqHandler > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java:[113,5] > cannot find symbol > [ERROR] symbol: variable Signal > [ERROR] location: class org.apache.hadoop.service.launcher.IrqHandler > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/service/launcher/IrqHandler.java:[125,3] > method does not override or implement a method from a supertype > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/NativeIO.java:[901,17] > cannot find symbol > [ERROR] symbol: class Unsafe > [ERROR] location: class org.apache.hadoop.io.nativeio.NativeIO > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/NativeIO.java:[903,7] > cannot find symbol > [ERROR] symbol: class Unsafe > [ERROR] location: class org.apache.hadoop.io.nativeio.NativeIO > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/nativeio/NativeIO.java:[903,24] > cannot find symbol > [ERROR] symbol: class Unsafe > [ERROR] location: class org.apache.hadoop.io.nativeio.NativeIO > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/FastByteComparisons.java:[140,22] > cannot find symbol > [ERROR] symbol: class Unsafe > [ERROR] location: class > org.apache.hadoop.io.FastByteComparisons.LexicographicalComparerHolder.UnsafeComparer > [ERROR] > /hadoop/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/FastByteComparisons.java:[145,29] > cannot find symbol > [ERROR] symbol: class Unsafe > [ERROR] -> [Help 1] > [ERROR] > [ERROR] To see the full stack trace of the errors, re-run Maven with the -e > switch. > [ERROR] Re-run Maven using the -X switch to enable full debug logging. > [ERROR] > [ERROR] For more information about the errors and possible solutions, please > read the following articles: > [ERROR] [Help 1] > http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException > [ERROR] > [ERROR] After correcting the problems, you can resume the build with the > command > [ERROR] mvn <args> -rf :hadoop-common > {code} > related jira: https://issues.apache.org/jira/browse/HADOOP-19298 > > > -- This message was sent by Atlassian Jira (v8.20.10#820010) --------------------------------------------------------------------- To unsubscribe, e-mail: common-issues-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-issues-h...@hadoop.apache.org