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

ASF GitHub Bot commented on APEXCORE-304:
-----------------------------------------

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

    https://github.com/apache/incubator-apex-core/pull/311#discussion_r61535209
  
    --- Diff: 
engine/src/main/java/com/datatorrent/stram/plan/logical/LogicalPlan.java ---
    @@ -2386,7 +2381,7 @@ public static void write(DAG dag, OutputStream os) 
throws IOException
     
       public static LogicalPlan read(InputStream is) throws IOException, 
ClassNotFoundException
       {
    -    return (LogicalPlan)new ObjectInputStream(is).readObject();
    +    return (LogicalPlan)new 
ClassLoaderObjectInputStream(Thread.currentThread().getContextClassLoader(), 
is).readObject();
    --- End diff --
    
    This is required for Local Mode case.
    
    Lets say a jar path is set to  LIBRARY_JARS and this jar contains a POJO 
that needs to be set to TUPLE_CLASS attr. Now,  one can do that in populateDAG 
method, that would cause a problem in  LocalMode as follows:
    1. populateDAG sets TUPLE_CLASS attr with new POJO class - Works.
    2. Local mode serializes the LogicalPlan - Works.
    3. Local mode deserialized the LogicalPlan - Fails.
    
    3rd step fails becuase The ObjectInputStream deserializer uses System 
ClassLoader which does that have that POJO. ClassLoaderObjectInputStream is an 
overridden version of ObjectInputStream which allows to set the custom 
classloader.
    
    By this time of callstack, Thread.currentThread().getClassLoader() will 
have a classloader which is super of all.
    
    As previously, there was no functionality of LIBRARY_JARS, I guess this was 
not tested and so did not surface as an issue.
    
    For cluster mode, there is no difference. i.e. There is only 1 classloader 
i.e. System.Classloader and that has new jars as well.
    i.e. For cluster mode, Thread.currentThread().getClassLoader() = System 
classloader
    i.e. ClassLoaderObjectInputStream will behave as if ObjectInputStream.
    



> Ability to add jars to classpath in populateDAG
> -----------------------------------------------
>
>                 Key: APEXCORE-304
>                 URL: https://issues.apache.org/jira/browse/APEXCORE-304
>             Project: Apache Apex Core
>          Issue Type: Improvement
>            Reporter: Chinmay Kolhatkar
>            Assignee: Chinmay Kolhatkar
>
> This will have following functionality:
> 1) In populateDAG one would be allowed to add given local jar path to 
> classpath of the application.
> 2) Optionally delete the given jar file after copying to HDFS is done.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to