Uploaded image for project: 'Sling'
  1. Sling
  2. SLING-5416

Thread Pool should stop "gracefully"

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • Commons Threads 3.2.6
    • Commons
    • None

    Description

      By default, the Sling thread pool manager calls "Thread.interrupt" to close the thread pool. This is because it is configured to be "not graceful" by default:

      ./bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/ModifiableThreadPoolConfig.java
      ...
       * The default values for this configuration are:
      ...
       * - shutdown graceful: false
       * - shutdown wait time: -1
      ...
       
      ./bundles/commons/threads/src/main/java/org/apache/sling/commons/threads/impl/DefaultThreadPool.java
          public void shutdown() {
              this.logger.info("Shutting down thread pool [{}] ...", name);
              if ( this.executor != null ) {
                  if (this.configuration.isShutdownGraceful()) {
                      this.executor.shutdown();
                  } else {
                      this.executor.shutdownNow();
                  }
                  try {
                      if (this.configuration.getShutdownWaitTimeMs() > 0) {
                          if (!this.executor.awaitTermination(this.configuration.getShutdownWaitTimeMs(), TimeUnit.MILLISECONDS)) {
                              logger.warn("Running commands have not terminated within "
                                  + this.configuration.getShutdownWaitTimeMs()
                                  + "ms. Will shut them down by interruption");
                              this.executor.shutdownNow(); // TODO: shouldn't this be outside the if statement?!
                          }
                      }
                  } catch (final InterruptedException ie) {
                      this.logger.error("Cannot shutdown thread pool [" + this.name + "]", ie);
                  }
      

      I think Sling should change the default to be graceful (not call Thread.interrupt()). Thread.interrupt can can result in many problems, because it closes channels, possibly TCP/IP connections, and so on. When using external libraries (JDBC, MongoDB, Apache Lucene,...) it is hard to ensure that Thread.interrupt does not cause problems.

      Attachments

        Activity

          People

            rombert Robert Munteanu
            thomasm Thomas Mueller
            Votes:
            0 Vote for this issue
            Watchers:
            6 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: