diff --git a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/ElasticsearchBuildCompletePlugin.java b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/ElasticsearchBuildCompletePlugin.java index 065a57f801c9e..a615b48759d9e 100644 --- a/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/ElasticsearchBuildCompletePlugin.java +++ b/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/ElasticsearchBuildCompletePlugin.java @@ -44,6 +44,7 @@ import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.concurrent.TimeUnit; import javax.inject.Inject; @@ -178,7 +179,11 @@ public void execute(BuildFinishedFlowAction.Parameters parameters) throws FileNo try { // we are very generious here, as the upload can take // a long time depending on its size - pb.start().waitFor(30, java.util.concurrent.TimeUnit.MINUTES); + long timeoutSec = calculateUploadWaitTimeoutSeconds(uploadFile); + boolean completedInTime = pb.start().waitFor(timeoutSec, TimeUnit.SECONDS); + if (completedInTime == false) { + System.out.println("Timed out waiting for buildkite artifact upload after " + timeoutSec + " seconds"); + } } catch (InterruptedException e) { System.out.println("Failed to upload buildkite artifact " + e.getMessage()); } @@ -278,5 +283,14 @@ private static void createBuildArchiveTar(List files, File projectDir, Fil private static String calculateArchivePath(Path path, Path projectPath) { return path.startsWith(projectPath) ? projectPath.relativize(path).toString() : path.getFileName().toString(); } + + private static long calculateUploadWaitTimeoutSeconds(File file) { + long fileSizeBytes = file.length(); + long fileSizeMB = fileSizeBytes / (1024 * 1024); + + // Allocate 4 seconds per MB (assumes ~250 KB/s upload speed) + // with min 10 seconds and max 30 minutes + return Math.max(10, Math.min(1800, fileSizeMB * 4)); + } } }