diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 8fa6594e795..9f33668598f 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -51,6 +51,8 @@ Release 2.5.0 - UNRELEASED HADOOP-10572. Example NFS mount command must pass noacl as it isn't supported by the server yet. (Harsh J via brandonli) + HADOOP-10588. Workaround for jetty6 acceptor startup issue. (kihwal) + OPTIMIZATIONS BUG FIXES diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer.java index 3ad26c68b85..69db5cdc865 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer.java @@ -306,9 +306,42 @@ public class HttpServer implements FilterContainer { return HttpServer.createDefaultChannelConnector(); } + + private static class SelectChannelConnectorWithSafeStartup + extends SelectChannelConnector { + public SelectChannelConnectorWithSafeStartup() { + super(); + } + + /* Override the broken isRunning() method (JETTY-1316). This bug is present + * in 6.1.26. For the versions wihout this bug, it adds insignificant + * overhead. + */ + @Override + public boolean isRunning() { + if (super.isRunning()) { + return true; + } + // We might be hitting JETTY-1316. If the internal state changed from + // STARTING to STARTED in the middle of the check, the above call may + // return false. Check it one more time. + LOG.warn("HttpServer Acceptor: isRunning is false. Rechecking."); + try { + Thread.sleep(10); + } catch (InterruptedException ie) { + // Mark this thread as interrupted. Someone up in the call chain + // might care. + Thread.currentThread().interrupt(); + } + boolean runState = super.isRunning(); + LOG.warn("HttpServer Acceptor: isRunning is " + runState); + return runState; + } + } + @InterfaceAudience.Private public static Connector createDefaultChannelConnector() { - SelectChannelConnector ret = new SelectChannelConnector(); + SelectChannelConnector ret = new SelectChannelConnectorWithSafeStartup(); ret.setLowResourceMaxIdleTime(10000); ret.setAcceptQueueSize(128); ret.setResolveNames(false); diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java index d2664dcf2b0..cd9e017be39 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/http/HttpServer2.java @@ -438,9 +438,41 @@ public final class HttpServer2 implements FilterContainer { return HttpServer2.createDefaultChannelConnector(); } + private static class SelectChannelConnectorWithSafeStartup + extends SelectChannelConnector { + public SelectChannelConnectorWithSafeStartup() { + super(); + } + + /* Override the broken isRunning() method (JETTY-1316). This bug is present + * in 6.1.26. For the versions wihout this bug, it adds insignificant + * overhead. + */ + @Override + public boolean isRunning() { + if (super.isRunning()) { + return true; + } + // We might be hitting JETTY-1316. If the internal state changed from + // STARTING to STARTED in the middle of the check, the above call may + // return false. Check it one more time. + LOG.warn("HttpServer Acceptor: isRunning is false. Rechecking."); + try { + Thread.sleep(10); + } catch (InterruptedException ie) { + // Mark this thread as interrupted. Someone up in the call chain + // might care. + Thread.currentThread().interrupt(); + } + boolean runState = super.isRunning(); + LOG.warn("HttpServer Acceptor: isRunning is " + runState); + return runState; + } + } + @InterfaceAudience.Private public static Connector createDefaultChannelConnector() { - SelectChannelConnector ret = new SelectChannelConnector(); + SelectChannelConnector ret = new SelectChannelConnectorWithSafeStartup(); ret.setLowResourceMaxIdleTime(10000); ret.setAcceptQueueSize(128); ret.setResolveNames(false);