aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-11-04 16:11:18 +0100
committerGitHub <noreply@github.com>2021-11-04 16:11:18 +0100
commit6ebe77e2ceebd37aa26aa762f4c608fee22c1b40 (patch)
treeb039dd7540d2d7d0a1918de4065beefe88a6c672
parent39da265d599c3b302dbce4f6d25103bc4d38418b (diff)
parent373d08d533005ec814bc468f877d0e121051a7a2 (diff)
Merge pull request #19866 from vespa-engine/hmusum/download-application-packages-asynchronously
Download application packages asynchronously [run-systemtest]
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ApplicationPackageMaintainer.java61
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/SessionsMaintainer.java1
2 files changed, 40 insertions, 22 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ApplicationPackageMaintainer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ApplicationPackageMaintainer.java
index 2c0b7e090a6..7147743a086 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ApplicationPackageMaintainer.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ApplicationPackageMaintainer.java
@@ -20,6 +20,12 @@ import com.yahoo.vespa.flags.FlagSource;
import java.io.File;
import java.time.Duration;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.logging.Level;
import java.util.logging.Logger;
import static com.yahoo.vespa.config.server.filedistribution.FileDistributionUtil.fileReferenceExistsOnDisk;
@@ -56,9 +62,10 @@ public class ApplicationPackageMaintainer extends ConfigServerMaintainer {
protected double maintain() {
if (getOtherConfigServersInCluster(configserverConfig).isEmpty()) return 1.0; // Nothing to do
- int attempts = 0;
- int failures = 0;
+ final AtomicInteger attempts = new AtomicInteger(0);
+ final AtomicInteger failures = new AtomicInteger(0);
+ List<CompletableFuture<Void>> futures = new ArrayList<>();
try (var fileDownloader = createFileDownloader()) {
for (var applicationId : applicationRepository.listApplications()) {
log.fine(() -> "Verifying application package for " + applicationId);
@@ -66,28 +73,40 @@ public class ApplicationPackageMaintainer extends ConfigServerMaintainer {
if (session == null) continue; // App might be deleted after call to listApplications()
FileReference applicationPackage = session.getApplicationPackageReference();
- long sessionId = session.getSessionId();
- log.fine(() -> "Verifying application package file reference " + applicationPackage + " for session " + sessionId);
-
- if (applicationPackage != null) {
- attempts++;
- if (! fileReferenceExistsOnDisk(downloadDirectory, applicationPackage)) {
- log.fine(() -> "Downloading missing application package for application " + applicationId + " (session " + sessionId + ")");
-
- FileReferenceDownload download = new FileReferenceDownload(applicationPackage,
- false,
- this.getClass().getSimpleName());
- if (fileDownloader.getFile(download).isEmpty()) {
- failures++;
- log.warning("Failed to download application package for application " + applicationId + " (session " + sessionId + ")");
- continue;
- }
- }
- createLocalSessionIfMissing(applicationId, sessionId);
+ if (applicationPackage == null) continue;
+
+ if ( ! fileReferenceExistsOnDisk(downloadDirectory, applicationPackage)) {
+ long sessionId = session.getSessionId();
+ log.fine(() -> "Downloading application package for " + applicationId +
+ " application package reference " + applicationPackage +
+ " (session " + sessionId + ")");
+
+ FileReferenceDownload download = new FileReferenceDownload(applicationPackage,
+ false,
+ this.getClass().getSimpleName());
+ futures.add(CompletableFuture.supplyAsync(() -> fileDownloader.getFile(download))
+ .thenAccept(file -> {
+ if (file.isPresent()) {
+ attempts.incrementAndGet();
+ createLocalSessionIfMissing(applicationId, sessionId);
+ } else {
+ failures.incrementAndGet();
+ log.warning("Failed to download application package for application " +
+ applicationId + " (session " + sessionId + ")");
+ }
+ }));
}
}
}
- return asSuccessFactor(attempts, failures);
+ log.fine(() -> "Attempts: " + attempts.get() + ", failures: " + failures.get());
+ futures.forEach(future -> {
+ try {
+ future.get();
+ } catch (InterruptedException | ExecutionException e) {
+ log.log(Level.WARNING, "Failed to get future", e);
+ }
+ });
+ return asSuccessFactor(attempts.get(), failures.get());
}
private FileDownloader createFileDownloader() {
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/SessionsMaintainer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/SessionsMaintainer.java
index 062f1ef816e..d980fb079e7 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/SessionsMaintainer.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/SessionsMaintainer.java
@@ -25,7 +25,6 @@ public class SessionsMaintainer extends ConfigServerMaintainer {
@Override
protected double maintain() {
- log.log(Level.FINE, () -> "Running " + SessionsMaintainer.class.getSimpleName());
applicationRepository.deleteExpiredLocalSessions();
if (hostedVespa) {