From f81c17069d064a917abe0c98d4bfeb19bf6b1a43 Mon Sep 17 00:00:00 2001 From: Alex Archambault Date: Thu, 21 Nov 2024 17:10:11 +0100 Subject: [PATCH] Add retry to the rt.jar copying stuff --- main/api/src/mill/api/ClassLoader.scala | 46 +++++++++++++++++-------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/main/api/src/mill/api/ClassLoader.scala b/main/api/src/mill/api/ClassLoader.scala index 5db97159d63..d85e9957efe 100644 --- a/main/api/src/mill/api/ClassLoader.scala +++ b/main/api/src/mill/api/ClassLoader.scala @@ -2,10 +2,10 @@ package mill.api import java.net.{URL, URLClassLoader} -import java.nio.file.FileAlreadyExistsException +import java.nio.file.{FileAlreadyExistsException, FileSystemException} import mill.java9rtexport.Export -import scala.util.Try +import scala.util.{Properties, Try} /** * Utilities for creating classloaders for running compiled Java/Scala code in @@ -78,19 +78,37 @@ object ClassLoader { if (java9OrAbove) { val java90rtJar = ctx.home / Export.rtJarName if (!os.exists(java90rtJar)) { - Try { - os.copy(os.Path(Export.rt()), java90rtJar, createFolders = true) - }.recoverWith { case e: FileAlreadyExistsException => - // some race? - if (os.exists(java90rtJar) && PathRef(java90rtJar) == PathRef(os.Path(Export.rt()))) Try { - // all good - () + // Time between retries should go from 100 ms to around 10s, which should + // leave plenty of time for another process to write fully this 50+ MB file + val retry = Retry( + count = 7, + backoffMillis = 100, + filter = { + case (_, _: FileSystemException) if Properties.isWin => true + case _ => false } - else Try { - // retry - os.copy(os.Path(Export.rt()), java90rtJar, replaceExisting = true, createFolders = true) - } - }.get + ) + retry { + Try { + os.copy(os.Path(Export.rt()), java90rtJar, createFolders = true) + }.recoverWith { case e: FileAlreadyExistsException => + // some race? + if (os.exists(java90rtJar) && PathRef(java90rtJar) == PathRef(os.Path(Export.rt()))) + Try { + // all good + () + } + else Try { + // retry + os.copy( + os.Path(Export.rt()), + java90rtJar, + replaceExisting = true, + createFolders = true + ) + } + }.get + } } urls :+ java90rtJar.toIO.toURI().toURL() } else {