Hi Magnus,
it's true that CompileProperties relies on Properties, which rely on
Hashtable (not HashMap) which is likely NOT to have predictable
iteration order (although I haven't been able to make it spit things in
different orders on my Linux box). That said, it seems like the code
keeps that into account:
Properties p = new Properties();
try {
p.load(new FileInputStream(propertiesPath));
}
...
List<String> sortedKeys = new ArrayList<String>();
for ( Object key : p.keySet() ) {
sortedKeys.add((String)key);
}
Collections.sort(sortedKeys); // <-----
That is, there is always a sort step on the keys, which should guarantee
some predictability of the output?
So I think this is ok.
But, looking at your JBS issue more in detail, I see that the problem
you have is NOT with CompileProperties but with the PropertiesParser
tool; this is a more complex tool. Eyeballing at it, I find one
suspicious piece of code:
http://hg.openjdk.java.net/jdk/jdk/file/354fb27fd38a/make/langtools/tools/propertiesparser/gen/ClassGenerator.java#l151
This is a complex stream call which ends up with a Collectors.groupingBy
- and that method ends up collecting things into an HashMap.
I suggest changing as follows:
Map<FactoryKind, List<Map.Entry<String, Message>>> groupedEntries =
messageFile.messages.entrySet().stream()
.collect(Collectors.groupingBy(e ->
FactoryKind.parseFrom(e.getKey().split("\\.")[1]), LinkedHashMap::new,
Collectors.toList()));
And see whether your problem is addressed? (seems so on my machine)
Hope this helps
Maurizio
On 24/09/18 10:29, Magnus Ihse Bursie wrote:
Hi compiler folks!
Could anyone possibly help me with having a look at
https://bugs.openjdk.java.net/browse/JDK-8211057? The
CompileProperties build tool helper is not generating reproducible
output, that is, if you run it multiple times one after another, with
no source code changes, it will (sometimes) not generate identical
output. This breaks our build tests for reproducibility. :-(
I've fixed a handful of similar build tool issues the last year, and
almost all of the cases ended up with someone iterating over a HashMap
and just outputting elements in the order they happened to get them.
However, this case seem different. I see no HashMap, and there is code
that clearly intends to sort the output.
My best guess here is that Properties.keySet() is backed by a HashMap,
and that Collections.sort(sortedKeys) does not do what the author of
the code intended, but that's just my guess.
Since this is hard to reproduce (it's an highly intermittent failure,
typically appearing mostly on Windows machines) I'd really appreciate
some help by reasoning about the code.
/Magnus