You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ap...@apache.org on 2022/07/19 01:15:51 UTC

[hbase] branch branch-2.5 updated: HBASE-27195 Clean up netty worker/thread pool configuration (#4619)

This is an automated email from the ASF dual-hosted git repository.

apurtell pushed a commit to branch branch-2.5
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2.5 by this push:
     new a321fb2eeeb HBASE-27195 Clean up netty worker/thread pool configuration (#4619)
a321fb2eeeb is described below

commit a321fb2eeebbc0baecd63515af4219d0d4a659cc
Author: Andrew Purtell <ap...@apache.org>
AuthorDate: Mon Jul 18 15:48:40 2022 -0700

    HBASE-27195 Clean up netty worker/thread pool configuration (#4619)
    
    The configuration settings "hbase.netty.worker.count" and
    "hbase.netty.eventloop.rpcserver.thread.count" appear to duplicate each
    other.
    
    Also, formalizes another setting found in NettyEventLoopGroupConfig,
    "hbase.netty.nativetransport".
    
    Also, native epoll is not limited to amd64. aarch64 supports it too.
    
    Signed-off-by: Duo Zhang <zh...@apache.org>
    
    Conflicts:
            hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/NettyRpcServer.java
---
 .../java/org/apache/hadoop/hbase/util/JVM.java     | 19 ++++++++++---
 .../apache/hadoop/hbase/ipc/NettyRpcServer.java    | 32 ++++++----------------
 .../hbase/util/NettyEventLoopGroupConfig.java      | 24 ++++++++++++----
 hbase-server/src/test/resources/hbase-site.xml     |  5 ----
 4 files changed, 42 insertions(+), 38 deletions(-)

diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/JVM.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/JVM.java
index 161dbddf4d8..2104511b4f2 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/JVM.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/JVM.java
@@ -42,12 +42,15 @@ public class JVM {
 
   private static final boolean ibmvendor =
     System.getProperty("java.vendor") != null && System.getProperty("java.vendor").contains("IBM");
-  private static final boolean windows =
-    System.getProperty("os.name") != null && System.getProperty("os.name").startsWith("Windows");
-  private static final boolean linux =
-    System.getProperty("os.name") != null && System.getProperty("os.name").startsWith("Linux");
+  // At least on my systems os.name reports as "linux", not "Linux". Prefer case insensitive tests.
+  private static final boolean windows = System.getProperty("os.name") != null
+    && System.getProperty("os.name").toLowerCase().contains("windows");
+  private static final boolean linux = System.getProperty("os.name") != null
+    && System.getProperty("os.name").toLowerCase().contains("linux");
   private static final boolean amd64 =
     System.getProperty("os.arch") != null && System.getProperty("os.arch").contains("amd64");
+  private static final boolean aarch64 =
+    System.getProperty("os.arch") != null && System.getProperty("os.arch").contains("aarch64");
 
   private static final String JVMVersion = System.getProperty("java.version");
 
@@ -99,6 +102,14 @@ public class JVM {
     return amd64;
   }
 
+  /**
+   * Check if the arch is aarch64;
+   * @return whether this is aarch64 or not.
+   */
+  public static boolean isAarch64() {
+    return aarch64;
+  }
+
   /**
    * Check if the finish() method of GZIPOutputStream is broken
    * @return whether GZIPOutputStream.finish() is broken.
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/NettyRpcServer.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/NettyRpcServer.java
index 2b7c0ffb302..a08d095d3fe 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/NettyRpcServer.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/ipc/NettyRpcServer.java
@@ -53,10 +53,7 @@ import org.apache.hbase.thirdparty.io.netty.channel.EventLoopGroup;
 import org.apache.hbase.thirdparty.io.netty.channel.ServerChannel;
 import org.apache.hbase.thirdparty.io.netty.channel.group.ChannelGroup;
 import org.apache.hbase.thirdparty.io.netty.channel.group.DefaultChannelGroup;
-import org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoopGroup;
-import org.apache.hbase.thirdparty.io.netty.channel.socket.nio.NioServerSocketChannel;
 import org.apache.hbase.thirdparty.io.netty.handler.codec.FixedLengthFrameDecoder;
-import org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultThreadFactory;
 import org.apache.hbase.thirdparty.io.netty.util.concurrent.GlobalEventExecutor;
 
 /**
@@ -67,14 +64,6 @@ import org.apache.hbase.thirdparty.io.netty.util.concurrent.GlobalEventExecutor;
 public class NettyRpcServer extends RpcServer {
   public static final Logger LOG = LoggerFactory.getLogger(NettyRpcServer.class);
 
-  /**
-   * Name of property to change netty rpc server eventloop thread count. Default is 0. Tests may set
-   * this down from unlimited.
-   */
-  public static final String HBASE_NETTY_EVENTLOOP_RPCSERVER_THREADCOUNT_KEY =
-    "hbase.netty.eventloop.rpcserver.thread.count";
-  private static final int EVENTLOOP_THREADCOUNT_DEFAULT = 0;
-
   /**
    * Name of property to change the byte buf allocator for the netty channels. Default is no value,
    * which causes us to use PooledByteBufAllocator. Valid settings here are "pooled", "unpooled",
@@ -103,21 +92,16 @@ public class NettyRpcServer extends RpcServer {
     super(server, name, services, bindAddress, conf, scheduler, reservoirEnabled);
     this.bindAddress = bindAddress;
     this.channelAllocator = getChannelAllocator(conf);
-    EventLoopGroup eventLoopGroup;
-    Class<? extends ServerChannel> channelClass;
+    // Get the event loop group configuration from the server class if available.
+    NettyEventLoopGroupConfig config = null;
     if (server instanceof HRegionServer) {
-      NettyEventLoopGroupConfig config = ((HRegionServer) server).getEventLoopGroupConfig();
-      eventLoopGroup = config.group();
-      channelClass = config.serverChannelClass();
-    } else {
-      int threadCount = server == null
-        ? EVENTLOOP_THREADCOUNT_DEFAULT
-        : server.getConfiguration().getInt(HBASE_NETTY_EVENTLOOP_RPCSERVER_THREADCOUNT_KEY,
-          EVENTLOOP_THREADCOUNT_DEFAULT);
-      eventLoopGroup = new NioEventLoopGroup(threadCount,
-        new DefaultThreadFactory("NettyRpcServer", true, Thread.MAX_PRIORITY));
-      channelClass = NioServerSocketChannel.class;
+      config = ((HRegionServer) server).getEventLoopGroupConfig();
+    }
+    if (config == null) {
+      config = new NettyEventLoopGroupConfig(conf, "NettyRpcServer");
     }
+    EventLoopGroup eventLoopGroup = config.group();
+    Class<? extends ServerChannel> channelClass = config.serverChannelClass();
     ServerBootstrap bootstrap = new ServerBootstrap().group(eventLoopGroup).channel(channelClass)
       .childOption(ChannelOption.TCP_NODELAY, tcpNoDelay)
       .childOption(ChannelOption.SO_KEEPALIVE, tcpKeepAlive)
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/NettyEventLoopGroupConfig.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/NettyEventLoopGroupConfig.java
index 4ff401633ab..b487cf40697 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/NettyEventLoopGroupConfig.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/NettyEventLoopGroupConfig.java
@@ -37,6 +37,13 @@ import org.apache.hbase.thirdparty.io.netty.util.concurrent.DefaultThreadFactory
  */
 @InterfaceAudience.Private
 public class NettyEventLoopGroupConfig {
+
+  public static final String NETTY_WORKER_COUNT_KEY = "hbase.netty.worker.count";
+  public static final int DEFAULT_NETTY_WORKER_COUNT = 0;
+
+  public static final String NETTY_NATIVETRANSPORT_KEY = "hbase.netty.nativetransport";
+  public static final boolean DEFAULT_NETTY_NATIVETRANSPORT = true;
+
   private final EventLoopGroup group;
 
   private final Class<? extends ServerChannel> serverChannelClass;
@@ -45,14 +52,21 @@ public class NettyEventLoopGroupConfig {
 
   private static boolean useEpoll(Configuration conf) {
     // Config to enable native transport.
-    boolean epollEnabled = conf.getBoolean("hbase.netty.nativetransport", true);
-    // Use the faster native epoll transport mechanism on linux if enabled
-    return epollEnabled && JVM.isLinux() && JVM.isAmd64();
+    final boolean epollEnabled =
+      conf.getBoolean(NETTY_NATIVETRANSPORT_KEY, DEFAULT_NETTY_NATIVETRANSPORT);
+    // Use the faster native epoll transport mechanism on linux if enabled and the
+    // hardware architecture is either amd64 or aarch64. Netty is known to have native
+    // epoll support for these combinations.
+    return epollEnabled && JVM.isLinux() && (JVM.isAmd64() || JVM.isAarch64());
   }
 
   public NettyEventLoopGroupConfig(Configuration conf, String threadPoolName) {
-    boolean useEpoll = useEpoll(conf);
-    int workerCount = conf.getInt("hbase.netty.worker.count", 0);
+    final boolean useEpoll = useEpoll(conf);
+    final int workerCount = conf.getInt(NETTY_WORKER_COUNT_KEY,
+      // For backwards compatibility we also need to consider
+      // "hbase.netty.eventloop.rpcserver.thread.count"
+      // if it is defined in site configuration instead.
+      conf.getInt("hbase.netty.eventloop.rpcserver.thread.count", DEFAULT_NETTY_WORKER_COUNT));
     ThreadFactory eventLoopThreadFactory =
       new DefaultThreadFactory(threadPoolName, true, Thread.MAX_PRIORITY);
     if (useEpoll) {
diff --git a/hbase-server/src/test/resources/hbase-site.xml b/hbase-server/src/test/resources/hbase-site.xml
index 5e64bfcd907..0b6f1d59a0e 100644
--- a/hbase-server/src/test/resources/hbase-site.xml
+++ b/hbase-server/src/test/resources/hbase-site.xml
@@ -277,9 +277,4 @@
     <value>3</value>
     <description>Default is unbounded</description>
   </property>
-  <property>
-    <name>hbase.netty.eventloop.rpcserver.thread.count</name>
-    <value>3</value>
-    <description>Default is unbounded</description>
-  </property>
 </configuration>