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

ASF GitHub Bot commented on DRILL-6063:
---------------------------------------

Github user parthchandra commented on a diff in the pull request:

    https://github.com/apache/drill/pull/1079#discussion_r159508398
  
    --- Diff: 
exec/java-exec/src/main/java/org/apache/drill/exec/rpc/user/UserClient.java ---
    @@ -344,7 +344,18 @@ private boolean 
clientNeedsAuthExceptPlain(DrillProperties props) {
           mechanismName = factory.getSimpleName();
           logger.trace("Will try to authenticate to server using {} mechanism 
with encryption context {}",
               mechanismName, connection.getEncryptionCtxtString());
    +
    +      // Update the thread context class loader to current class loader
    +      // See DRILL-6063 for detailed description
    +      final ClassLoader oldThreadCtxtCL = 
Thread.currentThread().getContextClassLoader();
    +      final ClassLoader newThreadCtxtCL = this.getClass().getClassLoader();
    +      Thread.currentThread().setContextClassLoader(newThreadCtxtCL);
    +
    --- End diff --
    
    makes sense


> Set correct ThreadContext ClassLoader before using Hadoop Configuration class 
> in DrillClient
> --------------------------------------------------------------------------------------------
>
>                 Key: DRILL-6063
>                 URL: https://issues.apache.org/jira/browse/DRILL-6063
>             Project: Apache Drill
>          Issue Type: Improvement
>          Components: Client - Java
>    Affects Versions: 1.11.0
>            Reporter: Sorabh Hamirwasia
>            Assignee: Sorabh Hamirwasia
>             Fix For: 1.13.0
>
>
> Drill Client uses Hadoop Configuration class in security mechanism factories. 
> Configuration class internally uses ThreadContext class loader to get the 
> default resources for configurations. When Drill JDBC driver is used with 3rd 
> party tool like Squirrel then it creates a class loader with all Drill Driver 
> related dependencies. This class loader is used to instantiate an object of 
> Driver class in a separate thread. But the thread context class loader has 
> dependencies related to Squirrel only. As a result of this when Hadoop 
> Configuration class tries to load the resources with default values it 
> doesn't find them in class path.
> If we specify hadoop dependencies in Squirrel's classpath instead of Driver 
> dependencies class path then it will work since Thread Context class loader 
> will have Hadoop libraries loaded too and will find the resources. But this 
> is not good as it is tying up one Squirrel instance with one version of 
> Hadoop which might not be true in all the cases like here when same Squirrel 
> instance can be used to load multiple versions of Drill Driver having 
> different hadoop version dependencies.
> To deal with this issue a simple fix is to set the Thread Context class 
> loader to be same as Drill Driver dependencies class loader before accessing 
> Hadoop Configuration class in Drill Client and later restore it back.
> Some pointers in code:
> * Place where JDBC driver is loaded as part of separate thread in Squirrel: 
> [OpenConnectionCommand.java|https://sourceforge.net/p/squirrel-sql/git/ci/master/tree/sql12/core/src/net/sourceforge/squirrel_sql/client/mainframe/action/OpenConnectionCommand.java#l167]
> * Place where JDBC driver class is instantiated in Squirrel using Driver 
> dependencies class loader: 
> [SQLDriverManager.java|https://sourceforge.net/p/squirrel-sql/git/ci/master/tree/sql12/core/src/net/sourceforge/squirrel_sql/fw/sql/SQLDriverManager.java#l74]
> * Place where Hadoop Configuration class looks into Thread Context Class 
> Loader: 
> [Configuration.java|https://github.com/apache/hadoop-common/blob/trunk/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/conf/Configuration.java#L615]



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

Reply via email to