From 353ee59cdb80e3e4937024a823e77f3a8dc93c0d Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Thu, 21 Aug 2025 08:13:49 +0200 Subject: [PATCH] fix: Workaround syncFile issue **Problem** We get non-deterministic NoSuchFileException. **Solution** Catch the exception. --- .../scala/sbt/util/ActionCacheStore.scala | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/util-cache/src/main/scala/sbt/util/ActionCacheStore.scala b/util-cache/src/main/scala/sbt/util/ActionCacheStore.scala index cfa4648ee..530e958ed 100644 --- a/util-cache/src/main/scala/sbt/util/ActionCacheStore.scala +++ b/util-cache/src/main/scala/sbt/util/ActionCacheStore.scala @@ -2,7 +2,14 @@ package sbt.util import java.io.RandomAccessFile import java.nio.ByteBuffer -import java.nio.file.{ Files, FileSystemException, Path, Paths, StandardCopyOption } +import java.nio.file.{ + Files, + FileSystemException, + NoSuchFileException, + Path, + Paths, + StandardCopyOption +} import java.util.concurrent.atomic.AtomicBoolean import sjsonnew.support.scalajson.unsafe.{ CompactPrinter, Converter, Parser } import sjsonnew.shaded.scalajson.ast.unsafe.JValue @@ -293,13 +300,18 @@ class DiskActionCacheStore(base: Path, converter: FileConverter) extends Abstrac case p if !Files.exists(p) => // println(s"- syncFile: $p does not exist") writeFileAndNotify(p) - case p if Digest.sameDigest(p, d) => - // println(s"- syncFile: $p has same digest") - p case p => - // println(s"- syncFile: $p has different digest") - IO.delete(p.toFile()) - writeFileAndNotify(p) + try + if Digest.sameDigest(p, d) then p + else + // println(s"- syncFile: $p has different digest") + IO.delete(p.toFile()) + writeFileAndNotify(p) + catch + // in theory, Fies.exists(...) should have caught this, + // but in practice, NoSuchFileException is thrown often + case _: NoSuchFileException => + writeFileAndNotify(p) /** * Emulate virtual side effects.