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

ASF GitHub Bot commented on FLINK-1325:
---------------------------------------

Github user aljoscha commented on the pull request:

    https://github.com/apache/incubator-flink/pull/269#issuecomment-67168154
  
    The cleaner visits all methods, yes. It does not know about how we use 
those functions. I'll change one of the tests to access the outer object 
through another method.


> Add a closure cleaner for Java
> ------------------------------
>
>                 Key: FLINK-1325
>                 URL: https://issues.apache.org/jira/browse/FLINK-1325
>             Project: Flink
>          Issue Type: Improvement
>          Components: Java API
>            Reporter: Stephan Ewen
>            Assignee: Aljoscha Krettek
>
> The Java API could really need a simple closure cleaner.
> All functions that are implemented as anonymous subclasses hold a reference 
> to the enclosing class, unless they are implemented as part of a static 
> method.
> That reference (called {{this$0}}) causes serialization to fail, as it draws 
> non serializable classes into the function, even in cases where the function 
> makes no access to the enclosing data.
> It is possible to manually set this reference to {{null}}, using reflection, 
> or using a debugger. Then the serialization succeeds.
> I suggest to add a closure cleaner that uses an ASM visitor over the 
> function's code to see if there is any access to the {{this$0}} field. In 
> case there is non, the field should be set to {{null}}.
> The problem can be reproduced with the simple program below:
> {code}
> public class Test {
>   public void runProgram() throws Exception {
>     ExecutionEnvironment env = ExecutionEnvironment 
> .getExecutionEnvironment();
>     env.generateSequence(1, 10)
>         .map(new MapFunction<Long, Long>() {
>           public Long map(Long value) {
>             return value * 2;
>           }
>         })
>         .print();
>     env.execute();
>   }
>   public static void main(String[] args) throws Exception {
>     new Test().runProgram();
>   }
> }
> {code}



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

Reply via email to