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

Yun Tang edited comment on FLINK-13910 at 8/30/19 8:43 AM:
-----------------------------------------------------------

[~aljoscha] [~tzulitai], what do you think of this? We could only update 
classes within some specific modules and try to find some way to watch new PRs 
must adding serialVersionUID for serializable classes. And I am willing to take 
this ticket to fix this problem.


was (Author: yunta):
[~aljoscha] [~abgore], what do you think of this? We could only update classes 
within some specific modules and try to find some way to watch new PRs must 
adding serialVersionUID for serializable classes. And I am willing to take this 
ticket to fix this problem.

> Many serializable classes have no explicit 'serialVersionUID'
> -------------------------------------------------------------
>
>                 Key: FLINK-13910
>                 URL: https://issues.apache.org/jira/browse/FLINK-13910
>             Project: Flink
>          Issue Type: Bug
>            Reporter: Yun Tang
>            Priority: Critical
>             Fix For: 1.10.0, 1.9.1
>
>         Attachments: SerializableNoSerialVersionUIDField
>
>
> Currently, many serializable classes in Flink have no explicit 
> 'serialVersionUID'. As [official 
> doc|https://flink.apache.org/contributing/code-style-and-quality-java.html#java-serialization]
>  said, {{Serializable classes must define a Serial Version UID}}. 
> No 'serialVersionUID' would cause compatibility problem. Take 
> {{TwoPhaseCommitSinkFunction}} for example, since no explicit 
> 'serialVersionUID' defined, after 
> [FLINK-10455|https://github.com/apache/flink/commit/489be82a6d93057ed4a3f9bf38ef50d01d11d96b]
>  introduced, its default 'serialVersionUID' has changed from 
> "4584405056408828651" to "4064406918549730832". In other words, if we submit 
> a job from Flink-1.6.3 local home to remote Flink-1.6.2 cluster with the 
> usage of {{TwoPhaseCommitSinkFunction}}, we would get exception like:
> {code:java}
> org.apache.flink.streaming.runtime.tasks.StreamTaskException: Cannot 
> instantiate user function.
>         at 
> org.apache.flink.streaming.api.graph.StreamConfig.getStreamOperator(StreamConfig.java:239)
>         at 
> org.apache.flink.streaming.runtime.tasks.OperatorChain.<init>(OperatorChain.java:104)
>         at 
> org.apache.flink.streaming.runtime.tasks.StreamTask.invoke(StreamTask.java:267)
>         at org.apache.flink.runtime.taskmanager.Task.run(Task.java:711)
>         at java.lang.Thread.run(Thread.java:748)
> Caused by: java.io.InvalidClassException: 
> org.apache.flink.streaming.api.functions.sink.TwoPhaseCommitSinkFunction; 
> local class incompatible: stream classdesc serialVersionUID = 
> 4584405056408828651, local class serialVersionUID = 4064406918549730832
>         at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:699)
>         at 
> java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1885)
>         at 
> java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
>         at 
> java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1885)
>         at 
> java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1751)
>         at 
> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2042)
>         at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
>         at 
> java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:2287)
>         at 
> java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:2211)
>         at 
> java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2069)
>         at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1573)
>         at java.io.ObjectInputStream.readObject(ObjectInputStream.java:431)
>         at 
> org.apache.flink.util.InstantiationUtil.deserializeObject(InstantiationUtil.java:537)
>         at 
> org.apache.flink.util.InstantiationUtil.deserializeObject(InstantiationUtil.java:524)
>         at 
> org.apache.flink.util.InstantiationUtil.deserializeObject(InstantiationUtil.java:512)
>         at 
> org.apache.flink.util.InstantiationUtil.readObjectFromConfig(InstantiationUtil.java:473)
>         at 
> org.apache.flink.streaming.api.graph.StreamConfig.getStreamOperator(StreamConfig.java:224)
>         ... 4 more
> {code}
> Similar problems existed in  
> {{org.apache.flink.streaming.api.operators.SimpleOperatorFactory}} which has 
> different 'serialVersionUID' from release-1.9 and current master branch.
> IMO, we might have two options to fix this bug:
> # Add explicit serialVersionUID for those classes which is identical to 
> latest Flink-1.9.0 release code.
> # Use similar mechanism like {{FailureTolerantObjectInputStream}} in 
> {{InstantiationUtil}} to ignore serialVersionUID mismatch.
> I have collected all production classes without serialVersionUID from latest 
> master branch in the attachment, which counts to 639 classes.



--
This message was sent by Atlassian Jira
(v8.3.2#803003)

Reply via email to