In my recent work to stabilize the tests after the Jetty 9 upgrade I struggled 
with a number of issues.  The most insidious of which was perhaps caused by 
what must be some poor configuration on one of the Jenkins slaves ubuntu3 that 
results in very poor performance during (ie hangs) reverse DNS lookups of 
0.0.0.0 in particular.

The offending Knox code is/was in 
gateway-provider-rewrite/src/main/java/org/apache/hadoop/gateway/filter/rewrite/impl/UrlRewriteResponse.java
Note that this is the previous code.  The code in master not is much more 
complex in support of a timeout that I'm not sure we should keep.
More on that later.

// KNOX-464: Doing this because Jetty only returns the string version of the IP 
address for request.getLocalName().
// Hopefully the local hostname will be cached so this will not be a 
significant performance hit.
// Previously this was an inline request.getServerName() but this ended up 
mixing the hostname from the Host header
// and the local port which was making load balancer configuration difficult if 
not impossible.
private String getRequestLocalHostName() {
  String hostName = request.getLocalName();
  try {
    hostName = InetAddress.getByName( hostName ).getHostName();
  } catch( UnknownHostException e ) {
    // Ignore it and use the original hostname.
  }
  return hostName;
}

The other half of the puzzle is the use of Jetty's ServletTester.  It turns out 
that from Jetty 8 to 9 this went through some non-trivial changes.  The bottom 
line is that by default it now only waits 5 seconds for a request to complete.  
It just to wait indefinitely.  So between these two things this has exposed 
this potential issue.

Here BTW is a reference to one of the tests that uses Jetty's ServletTester.
gateway-provider-rewrite/src/test/java/org/apache/hadoop/gateway/filter/rewrite/api/UrlRewriteServletFilterTest.java

So there is a choice to be made.

A) Should we continue down the path I used as a workaround to get the tests to 
pass in master and try an compensate for Java not having terrible timeout 
behavior on DNS reverse lookups?

B) Should we increase the timeout in the tests from the default of 5 seconds to 
something like 30 seconds and put the DNS reverse lookup code back the way it 
was?

response = HttpTester.parseResponse( server.getResponses( request.generate(), 
30, TimeUnit.SECONDS ) );

C) Should we be solving KNOX-464 in some other way that does not involve a DNS 
lookup at all?

Reply via email to