Thomas Mueller created SLING-5416:
-------------------------------------

             Summary: Thread Pool should stop "gracefully"
                 Key: SLING-5416
                 URL: https://issues.apache.org/jira/browse/SLING-5416
             Project: Sling
          Issue Type: Improvement
            Reporter: Thomas Mueller


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:

{noformat}
./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);
            }
{noformat}

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.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to