diff options
author | Harald Musum <musum@verizonmedia.com> | 2020-06-19 17:22:01 +0200 |
---|---|---|
committer | Harald Musum <musum@verizonmedia.com> | 2020-06-19 17:22:01 +0200 |
commit | e29722b5823e5ba1d8284d91a791a9a04f0df153 (patch) | |
tree | e884c6d0580e67e25898bdd4a16ae0b826163f42 /configserver | |
parent | dcbbb4479fae81b6299bc6e636f216cd2294bc91 (diff) |
Create local session after downloading application package
Diffstat (limited to 'configserver')
2 files changed, 28 insertions, 13 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 543f9c2e303..56496b06c14 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 @@ -2,8 +2,11 @@ package com.yahoo.vespa.config.server.maintenance; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.config.FileReference; +import com.yahoo.config.provision.ApplicationId; import com.yahoo.vespa.config.server.ApplicationRepository; import com.yahoo.vespa.config.server.session.RemoteSession; +import com.yahoo.vespa.config.server.session.SessionRepository; +import com.yahoo.vespa.config.server.tenant.Tenant; import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.defaults.Defaults; import com.yahoo.vespa.filedistribution.FileDownloader; @@ -52,24 +55,37 @@ public class ApplicationPackageMaintainer extends ConfigServerMaintainer { log.fine(() -> "Running"); if (! distributeApplicationPackage.value()) return; - try (var fileDownloader = new FileDownloader(createConnectionPool(configserverConfig), downloadDirectory)){ + try (var fileDownloader = new FileDownloader(createConnectionPool(configserverConfig), downloadDirectory)) { for (var applicationId : applicationRepository.listApplications()) { log.fine(() -> "Verifying application package for " + applicationId); RemoteSession session = applicationRepository.getActiveSession(applicationId); FileReference applicationPackage = session.getApplicationPackageReference(); - log.fine(() -> "Verifying application package file reference " + applicationPackage + " for session " + session.getSessionId()); + long sessionId = session.getSessionId(); + log.fine(() -> "Verifying application package file reference " + applicationPackage + " for session " + sessionId); - if (applicationPackage != null && missingOnDisk(applicationPackage)) { - log.fine(() -> "Downloading missing application package for application " + applicationId + " - session " + session.getSessionId()); + if (applicationPackage != null) { + if (missingOnDisk(applicationPackage)) { + log.fine(() -> "Downloading missing application package for application " + applicationId + " - session " + sessionId); - if (fileDownloader.getFile(applicationPackage).isEmpty()) { - log.warning("Failed to download application package for application " + applicationId + " - session " + session.getSessionId()); + if (fileDownloader.getFile(applicationPackage).isEmpty()) { + log.warning("Failed to download application package for application " + applicationId + " - session " + sessionId); + continue; + } } + createLocalSessionIfMissing(applicationId, sessionId); } } } } + private void createLocalSessionIfMissing(ApplicationId applicationId, long sessionId) { + Tenant tenant = applicationRepository.tenantRepository().getTenant(applicationId.tenant()); + SessionRepository sessionRepository = tenant.getSessionRepository(); + if (sessionRepository.getLocalSession(sessionId) == null) + sessionRepository.createLocalSessionUsingDistributedApplicationPackage(sessionId); + } + + private boolean missingOnDisk(FileReference applicationPackageReference) { Set<String> fileReferencesOnDisk = getFileReferencesOnDisk(downloadDirectory); return ! fileReferencesOnDisk.contains(applicationPackageReference.value()); diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java index c3db5d737df..7e22e4b227e 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java @@ -487,9 +487,9 @@ public class SessionRepository { * This method is used when creating a session based on a remote session and the distributed application package * It does not wait for session being created on other servers */ - private LocalSession createLocalSession(File applicationFile, ApplicationId applicationId, - long sessionId, Optional<Long> currentlyActiveSessionId) { + private LocalSession createLocalSession(File applicationFile, ApplicationId applicationId, long sessionId) { try { + Optional<Long> currentlyActiveSessionId = getActiveSessionId(applicationId); ApplicationPackage applicationPackage = createApplicationPackage(applicationFile, applicationId, sessionId, currentlyActiveSessionId, false); SessionZooKeeperClient sessionZooKeeperClient = createSessionZooKeeperClient(sessionId); @@ -527,7 +527,7 @@ public class SessionRepository { /** * Returns a new session instance for the given session id. */ - Optional<LocalSession> createLocalSessionUsingDistributedApplicationPackage(long sessionId) { + public Optional<LocalSession> createLocalSessionUsingDistributedApplicationPackage(long sessionId) { if (applicationRepo.hasLocalSession(sessionId)) { log.log(Level.FINE, "Local session for session id " + sessionId + " already exists"); return Optional.of(createSessionFromId(sessionId)); @@ -550,10 +550,9 @@ public class SessionRepository { return Optional.empty(); } ApplicationId applicationId = sessionZKClient.readApplicationId(); - return Optional.of(createLocalSession(sessionDir, - applicationId, - sessionId, - getActiveSessionId(applicationId))); + LocalSession localSession = createLocalSession(sessionDir, applicationId, sessionId); + addSession(localSession); + return Optional.of(localSession); } return Optional.empty(); } |