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

Xiao Chen commented on HADOOP-14841:
------------------------------------

Adding some contexts from my investigation, and a proposed solution.
- The exception comes from {{KMSJSONReader}}, when it tries to deserialize the 
json object. Writer seems fine. This is most likely due to the different 
underlying jackson requirement:
[MessageBodyReader|http://grepcode.com/file/repo1.maven.org/maven2/javax.ws.rs/javax.ws.rs-api/2.0.1/javax/ws/rs/ext/MessageBodyReader.java#140]
 and 
[MessageBodyWriter|http://grepcode.com/file/repo1.maven.org/maven2/javax.ws.rs/javax.ws.rs-api/2.0.1/javax/ws/rs/ext/MessageBodyWriter.java#128].
 

{quote}In case the entity input stream is empty, the reader is expected to 
either return a Java representation of a zero-length entity or throw a 
javax.ws.rs.core.NoContentException in case no zero-length entity 
representation is defined for the supported Java type. A NoContentException, if 
thrown by a message body reader while reading a server request entity, is 
automatically translated by JAX-RS server runtime into a 
javax.ws.rs.BadRequestException wrapping the original NoContentException and 
rethrown for a standard processing by the registered exception mappers.
{quote}

So it looks like KMS reader code should special-case the 'entity input stream 
is empty' situation.


- jackson 2.4.0+ [added a 
flag|https://github.com/fasterxml/jackson-jaxrs-providers/issues/49] to allow 
empty input stream. If we were ever to upgrade to that, we maybe able to get 
away with it's IOE - which means kms client will retry.
- Why the input stream is empty? Not 100% sure in our case, but very likely 3rd 
party.... - I checked hadoop codes through the entire call stack (below) into 
the KMSJSONReader, didn't find any violation that could result in the stream 
being read prematurely. Closest [googling 
result|https://stackoverflow.com/questions/8522568/why-is-httpservletrequest-inputstream-empty]
 I found seems to point their issues to gae/catalina.

{noformat}
"561010393@qtp-1495634188-2@4730" prio=5 tid=0x22 nid=NA runnable
  java.lang.Thread.State: RUNNABLE
          at 
org.apache.hadoop.crypto.key.kms.server.KMSJSONReader.readFrom(KMSJSONReader.java:57)
          at 
org.apache.hadoop.crypto.key.kms.server.KMSJSONReader.readFrom(KMSJSONReader.java:38)
          at 
com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:474)
          at 
com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123)
          at 
com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46)
          at 
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153)
          at 
com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203)
          at 
com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
          at 
com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
          at 
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
          at 
com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
          at 
com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
          at 
com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
          at 
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
          at 
com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
          at 
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
          at 
com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
          at 
com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
          at 
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
          at 
com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
          at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
          at 
org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
          at 
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1221)
          at 
org.apache.hadoop.crypto.key.kms.server.KMSMDCFilter.doFilter(KMSMDCFilter.java:84)
          at 
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
          at 
org.apache.hadoop.security.authentication.server.AuthenticationFilter.doFilter(AuthenticationFilter.java:631)
          at 
org.apache.hadoop.security.token.delegation.web.DelegationTokenAuthenticationFilter.doFilter(DelegationTokenAuthenticationFilter.java:301)
          at 
org.apache.hadoop.security.authentication.server.AuthenticationFilter.doFilter(AuthenticationFilter.java:579)
          at 
org.apache.hadoop.crypto.key.kms.server.KMSAuthenticationFilter.doFilter(KMSAuthenticationFilter.java:130)
          at 
org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1212)
          at 
org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:399)
          at 
org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
          at 
org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
          at 
org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:767)
          at 
org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:450)
          at 
org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
          at org.mortbay.jetty.Server.handle(Server.java:326)
          at 
org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
          at 
org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:945)
          at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
          at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
          at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
          at 
org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
          at 
org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
{noformat}

- Since this is an EOFException, which is an IOE, we can have the KMS client to 
retry. So far all occurrences are load-related, so retry will likely help
- HADOOP-14521 already added retries, but only 
{{RetryPolicies#failoverOnNetworkException}}, so an EOF isn't retried.

The retry policy itself is pretty widely used, so perhaps we can throw a 
{{RetriableException}} from {{KMSJSONReader}} to make the KMSCP retry. This 
isn't the cleanest solution but given the above, I think it's more practical.

[~shahrs87] [~jojochuang] [~andrew.wang] What's your thoughts on this?

> Add KMS Client retry to handle 'No content to map' EOFExceptions
> ----------------------------------------------------------------
>
>                 Key: HADOOP-14841
>                 URL: https://issues.apache.org/jira/browse/HADOOP-14841
>             Project: Hadoop Common
>          Issue Type: Improvement
>          Components: kms
>    Affects Versions: 2.6.0
>            Reporter: Xiao Chen
>            Assignee: Xiao Chen
>
> We have seen quite some occurrences when the KMS server is stressed, some of 
> the requests would end up getting a 500 return code, with this in the server 
> log:
> {noformat}
> 2017-08-31 06:45:33,021 WARN org.apache.hadoop.crypto.key.kms.server.KMS: 
> User impala/HOSTNAME@REALM (auth:KERBEROS) request POST 
> https://HOSTNAME:16000/kms/v1/keyversion/MNHDKEdWtZWM4vPb0p2bw544vdSRB2gy7APAQURcZns/_eek?eek_op=decrypt
>  caused exception.
> java.io.EOFException: No content to map to Object due to end of input
>         at 
> org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2444)
>         at 
> org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2396)
>         at 
> org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1648)
>         at 
> org.apache.hadoop.crypto.key.kms.server.KMSJSONReader.readFrom(KMSJSONReader.java:54)
>         at 
> com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:474)
>         at 
> com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123)
>         at 
> com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46)
>         at 
> com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153)
>         at 
> com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203)
>         at 
> com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
>         at 
> com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
>         at 
> com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
>         at 
> com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
>         at 
> com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
>         at 
> com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
>         at 
> com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
>         at 
> com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
>         at 
> com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
>         at 
> com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
>         at 
> com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
>         at 
> com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
>         at 
> com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
>         at javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
>         at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
>         at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>         at 
> org.apache.hadoop.crypto.key.kms.server.KMSMDCFilter.doFilter(KMSMDCFilter.java:84)
>         at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>         at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>         at 
> org.apache.hadoop.security.authentication.server.AuthenticationFilter.doFilter(AuthenticationFilter.java:631)
>         at 
> org.apache.hadoop.security.token.delegation.web.DelegationTokenAuthenticationFilter.doFilter(DelegationTokenAuthenticationFilter.java:301)
>         at 
> org.apache.hadoop.security.authentication.server.AuthenticationFilter.doFilter(AuthenticationFilter.java:579)
>         at 
> org.apache.hadoop.crypto.key.kms.server.KMSAuthenticationFilter.doFilter(KMSAuthenticationFilter.java:130)
>         at 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
>         at 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
>         at 
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
>         at 
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
>         at 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
>         at 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
>         at 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
>         at 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
>         at 
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
>         at 
> org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:610)
>         at 
> org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:503)
>         at java.lang.Thread.run(Thread.java:745)
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to