[ 
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)

Reply via email to