Stephan Ewen created FLINK-1325: ----------------------------------- Summary: 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
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)