diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteRetrier.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteRetrier.java index 2aca34c9daaaed..403af13d55a7cc 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteRetrier.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteRetrier.java @@ -14,6 +14,8 @@ package com.google.devtools.build.lib.remote; +import static java.lang.Math.max; + import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.base.Throwables; @@ -158,7 +160,7 @@ public static class ExponentialBackoff implements Backoff { Preconditions.checkArgument(jitter >= 0 && jitter <= 1, "jitter must be in the range (0, 1)"); Preconditions.checkArgument(maxAttempts >= 0, "maxAttempts must be >= 0"); nextDelayMillis = initial.toMillis(); - maxMillis = max.toMillis(); + maxMillis = max(max.toMillis(), nextDelayMillis); this.multiplier = multiplier; this.jitter = jitter; this.maxAttempts = maxAttempts; @@ -166,8 +168,8 @@ public static class ExponentialBackoff implements Backoff { public ExponentialBackoff(RemoteOptions options) { this( - /* initial = */ Duration.ofMillis(100), - /* max = */ Duration.ofSeconds(5), + /* initial= */ Duration.ofMillis(100), + /* max= */ options.remoteRetryMaxDelay, /* multiplier= */ 2, /* jitter= */ 0.1, options.remoteMaxRetryAttempts); diff --git a/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java b/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java index ba8488382cb3b1..893523ad4dd52c 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java +++ b/src/main/java/com/google/devtools/build/lib/remote/options/RemoteOptions.java @@ -362,6 +362,18 @@ public RemoteBuildEventUploadModeConverter() { + "If set to 0, retries are disabled.") public int remoteMaxRetryAttempts; + @Option( + name = "remote_retry_max_delay", + defaultValue = "5s", + documentationCategory = OptionDocumentationCategory.REMOTE, + effectTags = {OptionEffectTag.UNKNOWN}, + converter = RemoteTimeoutConverter.class, + help = + "The maximum backoff delay between remote retry attempts. Following units can be used:" + + " Days (d), hours (h), minutes (m), seconds (s), and milliseconds (ms). If" + + " the unit is omitted, the value is interpreted as seconds.") + public Duration remoteRetryMaxDelay; + @Option( name = "disk_cache", defaultValue = "null",