From 6c9bdaa8576513225bc2bae66061c910755ab4ab Mon Sep 17 00:00:00 2001 From: Piotr Chabelski Date: Tue, 31 Dec 2024 09:44:15 +0100 Subject: [PATCH] Add a variable interval when retrying, to prevent stampeding --- modules/build/src/main/scala/scala/build/package.scala | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/build/src/main/scala/scala/build/package.scala b/modules/build/src/main/scala/scala/build/package.scala index 07858f40b3..820b5db998 100644 --- a/modules/build/src/main/scala/scala/build/package.scala +++ b/modules/build/src/main/scala/scala/build/package.scala @@ -3,11 +3,13 @@ package scala import scala.annotation.tailrec import scala.concurrent.duration.DurationConversions.* import scala.concurrent.duration.{DurationInt, FiniteDuration} +import scala.util.Random package object build { def retry[T]( maxAttempts: Int = 3, - waitDuration: FiniteDuration = 1.seconds + waitDuration: FiniteDuration = 1.seconds, + variableWaitDelayInMs: Int = 500 )(logger: Logger)( run: => T ): T = { @@ -21,7 +23,9 @@ package object build { else { t.getStackTrace.foreach(ste => logger.debug(ste.toString)) logger.log(s"Caught $t, trying again in $waitDuration…") - Thread.sleep(waitDuration.toMillis) + val variableDelay = Random.between(0, variableWaitDelayInMs + 1).milliseconds + val currentWaitDuration = waitDuration + variableDelay + Thread.sleep(currentWaitDuration.toMillis) helper(count + 1) } }