[
https://issues.apache.org/jira/browse/KNOX-935?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15997715#comment-15997715
]
Ajith S commented on KNOX-935:
------------------------------
The problem is at
{{org.apache.hadoop.gateway.GatewayFilter.Holder#getInstance}}
Here is my analysis.
1. {{org.apache.hadoop.gateway.dispatch.GatewayDispatchFilter}} will initialize
{{org.apache.hadoop.gateway.dispatch.AbstractGatewayDispatch#client}} in
{{org.apache.hadoop.gateway.dispatch.GatewayDispatchFilter#init}}
2. This init is not called when webcontext is initialized as its added to
{{org.apache.hadoop.gateway.GatewayFilter}} through a
{{org.apache.hadoop.gateway.GatewayFilter.Holder}} via
{{org.apache.hadoop.gateway.GatewayFilter#addFilter(java.lang.String,
java.lang.String, java.lang.String,
java.util.Map<java.lang.String,java.lang.String>, java.lang.String)}}
3. Notice here as the filter instance is created in
{{org.apache.hadoop.gateway.GatewayFilter.Holder#getInstance}} when the
{{org.apache.hadoop.gateway.GatewayFilter.Holder#doFilter}} is called via
{{org.apache.hadoop.gateway.GatewayFilter.Chain#doFilter}} (a normal filter
would have init'ed on webcontext startup but
{{org.apache.hadoop.gateway.GatewayFilter#init}} does not initializes its
filter chain, rather does it on doFilter call)
Now the problem is if, right after server startup, if more than one
simultaneous call come to
{{org.apache.hadoop.gateway.GatewayFilter.Chain#doFilter}}, this particular
code in {{org.apache.hadoop.gateway.GatewayFilter.Holder#getInstance}}
{code}
if( instance == null ) {
try {
if( clazz == null ) {
clazz = getClazz();
}
instance = clazz.newInstance();
instance.init( this );
................
{code}
When thread1 has just finished creating the instance but yet to call init,
thread 2 will fail the if and go ahead to
{{org.apache.hadoop.gateway.dispatch.GatewayDispatchFilter#doFilter}} which
will end up at
{{org.apache.hadoop.gateway.dispatch.DefaultDispatch#executeOutboundRequest}}
(see the stacktrace)
Here as thread1 is yet to create the httpclient object in
{{org.apache.hadoop.gateway.dispatch.GatewayDispatchFilter#init}}, for thread2
the client will be null in
{{org.apache.hadoop.gateway.dispatch.DefaultDispatch#executeOutboundRequest}}
and thus causing NPE
> NPE in DefaultDispatch.executeOutboundRequest
> ---------------------------------------------
>
> Key: KNOX-935
> URL: https://issues.apache.org/jira/browse/KNOX-935
> Project: Apache Knox
> Issue Type: Bug
> Reporter: Ajith S
>
> {code}
> Caused by: javax.servlet.ServletException: java.lang.NullPointerException
> at
> org.apache.hadoop.gateway.filter.AbstractGatewayFilter.doFilter(AbstractGatewayFilter.java:70)
> at
> org.apache.hadoop.gateway.GatewayFilter$Holder.doFilter(GatewayFilter.java:315)
> at
> org.apache.hadoop.gateway.GatewayFilter$Chain.doFilter(GatewayFilter.java:215)
> at
> com.example.knox.filter.FooLogoutFilter.doFilter(FooLogoutFilter.java:63)
> at
> org.apache.hadoop.gateway.GatewayFilter$Holder.doFilter(GatewayFilter.java:315)
> at
> org.apache.hadoop.gateway.GatewayFilter$Chain.doFilter(GatewayFilter.java:215)
> at
> org.apache.hadoop.gateway.filter.security.AbstractIdentityAssertionFilter.doFilterInternal(AbstractIdentityAssertionFilter.java:209)
> at
> org.apache.hadoop.gateway.filter.security.AbstractIdentityAssertionFilter.continueChainAsPrincipal(AbstractIdentityAssertionFilter.java:157)
> at
> com.example.knox.filter.FooIdentityAssertionFilter.doFilter(FooIdentityAssertionFilter.java:36)
> at
> org.apache.hadoop.gateway.GatewayFilter$Holder.doFilter(GatewayFilter.java:315)
> at
> org.apache.hadoop.gateway.GatewayFilter$Chain.doFilter(GatewayFilter.java:215)
> at
> org.apache.hadoop.gateway.filter.rewrite.api.UrlRewriteServletFilter.doFilter(UrlRewriteServletFilter.java:60)
> at
> org.apache.hadoop.gateway.filter.AbstractGatewayFilter.doFilter(AbstractGatewayFilter.java:61)
> at
> org.apache.hadoop.gateway.GatewayFilter$Holder.doFilter(GatewayFilter.java:315)
> at
> org.apache.hadoop.gateway.GatewayFilter$Chain.doFilter(GatewayFilter.java:215)
> at
> org.apache.hadoop.gateway.filter.ShiroSubjectIdentityAdapter$CallableChain$1.run(ShiroSubjectIdentityAdapter.java:93)
> at
> org.apache.hadoop.gateway.filter.ShiroSubjectIdentityAdapter$CallableChain$1.run(ShiroSubjectIdentityAdapter.java:90)
> ... 59 more
> Caused by: java.lang.NullPointerException
> at
> org.apache.hadoop.gateway.dispatch.DefaultDispatch.executeOutboundRequest(DefaultDispatch.java:119)
> at
> org.apache.hadoop.gateway.dispatch.DefaultDispatch.executeRequest(DefaultDispatch.java:105)
> at
> org.apache.hadoop.gateway.dispatch.DefaultDispatch.doGet(DefaultDispatch.java:285)
> at
> org.apache.hadoop.gateway.dispatch.GatewayDispatchFilter$GetAdapter.doMethod(GatewayDispatchFilter.java:130)
> at
> org.apache.hadoop.gateway.dispatch.GatewayDispatchFilter.doFilter(GatewayDispatchFilter.java:102)
> at
> org.apache.hadoop.gateway.filter.AbstractGatewayFilter.doFilter(AbstractGatewayFilter.java:61)
> ... 75 more
> {code}
--
This message was sent by Atlassian JIRA
(v6.3.15#6346)