Help with JDK-8211057
    Maurizio Cimadamore 
    maurizio.cimadamore at oracle.com
       
    Mon Sep 24 12:42:26 UTC 2018
    
    
  
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
    
    
More information about the build-dev
mailing list