[ https://issues.apache.org/jira/browse/THRIFT-4513?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16393828#comment-16393828 ]
ASF GitHub Bot commented on THRIFT-4513: ---------------------------------------- Github user romanoid commented on the issue: https://github.com/apache/thrift/pull/1505 @jeking3 Yes, thanks, PR had some assumption on Map keys being only primitive for constant maps, which is not true in general. Latest revision should no longer rely on it. > thrift generated java code is not stable for constants > ------------------------------------------------------ > > Key: THRIFT-4513 > URL: https://issues.apache.org/jira/browse/THRIFT-4513 > Project: Thrift > Issue Type: Improvement > Components: Java - Compiler > Reporter: Roman Soroka > Priority: Major > > In certain cases, output generated with java compiler is unstable, this > prevents correct incremental generation, artifact caching, etc. > This is especially crucible if the goal is reproducible builds: same results > for the same source inputs. > Here's example: > Let's say we have thrift definition: > const map<string, Enum1Enum2> CONSTANT_MAP = > { 'key1' : \\{"enum1" : Enum1.ENUM1_VALUE1, "enum2" : Enum2.ENUM2_VALUE} > , > 'key2' : \{"enum1" : Enum1.ENUM1_VALUE2, "enum2" : Enum2.ENUM2_VALUE}, > 'key3' : \{"enum1" : Enum1.ENUM1_VALUE3, "enum2" : Enum2.ENUM2_VALUE}, > .... > } > Compiler generates code like: > public static final java.util.Map<java.lang.String,Enum1Enum2> CONSTANT_MAP = > new java.util.HashMap<java.lang.String,Enum1Enum2>(); > static { > Enum1Enum2 tmp199 = new Enum1Enum2(); > tmp199.setEnum1(com.java.package.Enum1.ENUM1_VALUE2); > tmp199.setEnum2(com.java.package.Enum2.ENUM2_VALUE); > CONSTANT_MAP.put("key2", tmp199); > Enum1Enum2 tmp200 = new Enum1Enum2(); > tmp200.setEnum1(com.java.package.Enum1.ENUM1_VALUE1); > tmp200.setEnum2(com.java.package.Enum2.ENUM2_VALUE); > CONSTANT_MAP.put("key1", tmp200); > Enum1Enum2 tmp201 = new Enum1Enum2(); > tmp201.setEnum1(com.java.package.Enum1.ENUM1_VALUE3); > tmp201.setEnum2(com.java.package.Enum2.ENUM2_VALUE); > CONSTANT_MAP.put("key3", tmp201); > Possible reorderings: > 1. Values are added in different order from run to run. > 2. Set methods in value construction may be called in different order. > Note: this results in equivalent java maps, so there is no runtime issues. > Proposed remedy: > When building construction of Constants from JSON, java code generator > should use by-key ordering. > -- This message was sent by Atlassian JIRA (v7.6.3#76005)