Tinder / bazel-diff

Performs Bazel Target Diffing between two revisions in Git, allowing for Test Target Selection and Selective Building
Other
397 stars 59 forks source link

fix(generate-hashes): fix infrequent NPE #121

Closed Malinskiy closed 2 years ago

Malinskiy commented 2 years ago

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

Malinskiy commented 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)