Closed Malinskiy closed 2 years ago
Example of an error stacktrace:
java.lang.NullPointerException
--
| at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
| at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
| at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
| at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
| at java.base/java.util.concurrent.ForkJoinTask.getThrowableException(ForkJoinTask.java:603)
| at java.base/java.util.concurrent.ForkJoinTask.reportException(ForkJoinTask.java:678)
| at java.base/java.util.concurrent.ForkJoinTask.invoke(ForkJoinTask.java:737)
| at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateParallel(ReduceOps.java:919)
| at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:233)
| at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578)
| at com.bazel_diff.TargetHashingClientImpl.hashAllTargets(TargetHashingClient.java:210)
| at com.bazel_diff.TargetHashingClientImpl.hashAllBazelTargetsAndSourcefiles(TargetHashingClient.java:35)
| at com.bazel_diff.GenerateHashes.call(main.java:62)
| at com.bazel_diff.GenerateHashes.call(main.java:24)
| at picocli.CommandLine.executeUserObject(CommandLine.java:1853)
| at picocli.CommandLine.access$1100(CommandLine.java:145)
| at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2255)
| at picocli.CommandLine$RunLast.handle(CommandLine.java:2249)
| at picocli.CommandLine$RunLast.handle(CommandLine.java:2213)
| at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2080)
| at picocli.CommandLine.execute(CommandLine.java:1978)
| at com.bazel_diff.BazelDiff.main(main.java:180)
| Caused by: java.lang.NullPointerException
| at com.bazel_diff.TargetHashingClientImpl.createDigestForTarget(TargetHashingClient.java:83)
| at com.bazel_diff.TargetHashingClientImpl.lambda$hashAllTargets$0(TargetHashingClient.java:196)
| at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
| at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1655)
| at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
| at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
| at java.base/java.util.stream.ReduceOps$ReduceTask.doLeaf(ReduceOps.java:952)
| at java.base/java.util.stream.ReduceOps$ReduceTask.doLeaf(ReduceOps.java:926)
| at java.base/java.util.stream.AbstractTask.compute(AbstractTask.java:327)
| at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)
| at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
| at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
| at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
| at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
| at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)
There is an edge-case where the rules are depending on each other's digests, but they're hashed in parallel, so threads will not see the result of a previous hashing iteration. To overcome this we synchronise access using ConcurrentHashMap for the ruleHashes