You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@hbase.apache.org by "LiangJun He (Jira)" <ji...@apache.org> on 2022/08/27 17:15:00 UTC

[jira] [Commented] (HBASE-27335) HBase shell hang for a minute when quiting

    [ https://issues.apache.org/jira/browse/HBASE-27335?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17586096#comment-17586096 ] 

LiangJun He commented on HBASE-27335:
-------------------------------------

I have seen that this part of the code of branch-1 and master branch sets the thread as the daemon thread, only branch-2 is not set. The master branch code is as follows:

 
{code:java}
private ThreadPoolExecutor createThreadPool() {
  Configuration conf = conn.getConfiguration();
  int threads = conf.getInt("hbase.hconnection.threads.max", 256);
  long keepAliveTime = conf.getLong("hbase.hconnection.threads.keepalivetime", 60);
  BlockingQueue<Runnable> workQueue =
    new LinkedBlockingQueue<>(threads * conf.getInt(HConstants.HBASE_CLIENT_MAX_TOTAL_TASKS,
      HConstants.DEFAULT_HBASE_CLIENT_MAX_TOTAL_TASKS));
  ThreadPoolExecutor tpe = new ThreadPoolExecutor(threads, threads, keepAliveTime,
    TimeUnit.SECONDS, workQueue,
    new ThreadFactoryBuilder().setDaemon(true).setNameFormat(toString() + "-shared-%d").build());
  tpe.allowCoreThreadTimeOut(true);
  return tpe;
} {code}
The branch-2 branch code is as follows:
{code:java}
private ThreadPoolExecutor getThreadPool(int maxThreads, int coreThreads, String nameHint,
  BlockingQueue<Runnable> passedWorkQueue) {
  // shared HTable thread executor not yet initialized
  if (maxThreads == 0) {
    maxThreads = Runtime.getRuntime().availableProcessors() * 8;
  }
  if (coreThreads == 0) {
    coreThreads = Runtime.getRuntime().availableProcessors() * 8;
  }
  long keepAliveTime = conf.getLong("hbase.hconnection.threads.keepalivetime", 60);
  BlockingQueue<Runnable> workQueue = passedWorkQueue;
  if (workQueue == null) {
    workQueue =
      new LinkedBlockingQueue<>(maxThreads * conf.getInt(HConstants.HBASE_CLIENT_MAX_TOTAL_TASKS,
        HConstants.DEFAULT_HBASE_CLIENT_MAX_TOTAL_TASKS));
    coreThreads = maxThreads;
  }
  ThreadPoolExecutor tpe =
    new ThreadPoolExecutor(coreThreads, maxThreads, keepAliveTime, TimeUnit.SECONDS, workQueue,
      new ThreadFactoryBuilder().setNameFormat(toString() + nameHint + "-pool-%d")
        .setUncaughtExceptionHandler(Threads.LOGGING_EXCEPTION_HANDLER).build());
  tpe.allowCoreThreadTimeOut(true);
  return tpe;
} {code}
I will submit a PR to solve this problem.

 

> HBase shell hang for a minute when quiting
> ------------------------------------------
>
>                 Key: HBASE-27335
>                 URL: https://issues.apache.org/jira/browse/HBASE-27335
>             Project: HBase
>          Issue Type: Bug
>          Components: shell
>            Reporter: Duo Zhang
>            Assignee: LiangJun He
>            Priority: Major
>         Attachments: jstack.log
>
>
> Found this when trying the 2.5.0 RC. The way to reproduce
> Use './bin/hbase shell' to connect to a cluster, and then run these two commands
> {code}
> count "hbase:meta"
> quit
> {code}
> We will hang about 1 minute before the final exit of the shell process.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)