diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java index 4a65ca5e6a45..c26ab4036810 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/HddsUtils.java @@ -32,6 +32,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.OptionalInt; import java.util.TreeMap; @@ -82,6 +83,7 @@ import org.apache.hadoop.security.AccessControlException; import org.apache.hadoop.security.token.SecretManager; +import org.apache.hadoop.util.CheckedSupplier; import org.apache.ratis.thirdparty.com.google.protobuf.ByteString; import org.apache.ratis.util.SizeInBytes; import org.apache.hadoop.ozone.conf.OzoneServiceConfig; @@ -824,4 +826,23 @@ public static Map processForLogging(OzoneConfiguration conf) { } return sortedOzoneProps; } + + /** + * Execute some code and ensure thread name is not changed + * (workaround for HADOOP-18433). + */ + public static T preserveThreadName( + CheckedSupplier supplier) throws E { + final Thread thread = Thread.currentThread(); + final String threadName = thread.getName(); + + try { + return supplier.get(); + } finally { + if (!Objects.equals(threadName, thread.getName())) { + LOG.info("Restoring thread name: {}", threadName); + thread.setName(threadName); + } + } + } } diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeClientProtocolServer.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeClientProtocolServer.java index 0b622f78e502..c18f87722588 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeClientProtocolServer.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/HddsDatanodeClientProtocolServer.java @@ -48,6 +48,7 @@ import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_DATANODE_CLIENT_ADDRESS_KEY; import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_DATANODE_HANDLER_COUNT_DEFAULT; import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_DATANODE_HANDLER_COUNT_KEY; +import static org.apache.hadoop.hdds.HddsUtils.preserveThreadName; import static org.apache.hadoop.hdds.protocol.DatanodeDetails.Port.Name.CLIENT_RPC; /** @@ -162,8 +163,8 @@ private RPC.Server getRpcServer(OzoneConfiguration configuration) .ReconfigureProtocolService.newReflectiveBlockingService( reconfigureServerProtocol); - return startRpcServer(configuration, rpcAddress, - ReconfigureProtocolPB.class, reconfigureService, handlerCount); + return preserveThreadName(() -> startRpcServer(configuration, rpcAddress, + ReconfigureProtocolPB.class, reconfigureService, handlerCount)); } /** diff --git a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java index e6880add7718..6a255c7cf94e 100644 --- a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java +++ b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/StorageContainerManager.java @@ -187,6 +187,7 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import static org.apache.hadoop.hdds.HddsUtils.preserveThreadName; import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_EVENT_REPORT_EXEC_WAIT_THRESHOLD_DEFAULT; import static org.apache.hadoop.hdds.scm.ScmConfigKeys.OZONE_SCM_EVENT_REPORT_QUEUE_WAIT_THRESHOLD_DEFAULT; import static org.apache.hadoop.hdds.security.x509.certificate.authority.CertificateStore.CertType.VALID_CERTS; @@ -1078,16 +1079,16 @@ public static RPC.Server startRpcServer( BlockingService instance, int handlerCount) throws IOException { - RPC.Server rpcServer = - new RPC.Builder(conf) - .setProtocol(protocol) - .setInstance(instance) - .setBindAddress(addr.getHostString()) - .setPort(addr.getPort()) - .setNumHandlers(handlerCount) - .setVerbose(false) - .setSecretManager(null) - .build(); + + RPC.Server rpcServer = preserveThreadName(() -> new RPC.Builder(conf) + .setProtocol(protocol) + .setInstance(instance) + .setBindAddress(addr.getHostString()) + .setPort(addr.getPort()) + .setNumHandlers(handlerCount) + .setVerbose(false) + .setSecretManager(null) + .build()); HddsServerUtil.addPBProtocol(conf, protocol, instance, rpcServer); return rpcServer; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java index d45b5d6e0458..45982556ced3 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java @@ -230,6 +230,7 @@ import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_BLOCK_TOKEN_ENABLED; import static org.apache.hadoop.hdds.HddsConfigKeys.HDDS_BLOCK_TOKEN_ENABLED_DEFAULT; import static org.apache.hadoop.hdds.HddsUtils.getScmAddressForClients; +import static org.apache.hadoop.hdds.HddsUtils.preserveThreadName; import static org.apache.hadoop.hdds.server.ServerUtils.updateRPCListenAddress; import static org.apache.hadoop.hdds.utils.HAUtils.getScmInfo; import static org.apache.hadoop.ozone.OmUtils.MAX_TRXN_ID; @@ -1262,7 +1263,8 @@ private RPC.Server startRpcServer(OzoneConfiguration conf, BlockingService reconfigureProtocolService, int handlerCount) throws IOException { - RPC.Server rpcServer = new RPC.Builder(conf) + + RPC.Server rpcServer = preserveThreadName(() -> new RPC.Builder(conf) .setProtocol(OzoneManagerProtocolPB.class) .setInstance(clientProtocolService) .setBindAddress(addr.getHostString()) @@ -1270,7 +1272,7 @@ private RPC.Server startRpcServer(OzoneConfiguration conf, .setNumHandlers(handlerCount) .setVerbose(false) .setSecretManager(delegationTokenMgr) - .build(); + .build()); HddsServerUtil.addPBProtocol(conf, OMInterServiceProtocolPB.class, interOMProtocolService, rpcServer);