diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-11-04 16:11:18 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-04 16:11:18 +0100 |
commit | 6ebe77e2ceebd37aa26aa762f4c608fee22c1b40 (patch) | |
tree | b039dd7540d2d7d0a1918de4065beefe88a6c672 | |
parent | 39da265d599c3b302dbce4f6d25103bc4d38418b (diff) | |
parent | 373d08d533005ec814bc468f877d0e121051a7a2 (diff) |
Merge pull request #19866 from vespa-engine/hmusum/download-application-packages-asynchronously
Download application packages asynchronously [run-systemtest]
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) { |