diff options
author | Harald Musum <musum@verizonmedia.com> | 2020-08-19 10:49:25 +0200 |
---|---|---|
committer | Harald Musum <musum@verizonmedia.com> | 2020-08-19 10:49:25 +0200 |
commit | 5237d30ab21f17bf69b7ad817a48d85eb8f9f6a8 (patch) | |
tree | 77a19820dba5d4c41e8a96063ed4be8cbf1bdacb /configserver | |
parent | 2d8013592b52073f48697d899778b2f8c20b6c34 (diff) |
Add and use getOptionalApplicationId in some places
In some scenarios data might be missing in ZooKeeper, in those
cases handle that instead of failing
Diffstat (limited to 'configserver')
5 files changed, 25 insertions, 9 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java index b8508922b78..ebeb7e7e377 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java @@ -760,9 +760,9 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye Set<ApplicationId> applicationIds = new HashSet<>(); sessionsPerTenant.values() .forEach(sessionList -> sessionList.stream() - .map(Session::getApplicationId) - .filter(Objects::nonNull) - .forEach(applicationIds::add)); + .map(Session::getOptionalApplicationId) + .filter(Optional::isPresent) + .forEach(appId -> applicationIds.add(appId.get()))); Map<ApplicationId, Long> activeSessions = new HashMap<>(); applicationIds.forEach(applicationId -> { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ConfigServerBootstrap.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ConfigServerBootstrap.java index 0aab83d5a6a..cbea6d99dd2 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/ConfigServerBootstrap.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ConfigServerBootstrap.java @@ -105,7 +105,11 @@ public class ConfigServerBootstrap extends AbstractComponent implements Runnable initializing(vipStatusMode); // Run maintainers that cleans up zookeeper and disk usage before bootstrapping - configServerMaintenance.ifPresent(ConfigServerMaintenance::runBeforeBootstrap); + try { + configServerMaintenance.ifPresent(ConfigServerMaintenance::runBeforeBootstrap); + } catch (Exception e) { + log.log(Level.INFO, "Running maintainers before bootstrap failed, continuing with bootstrap", e); + } switch (mode) { case BOOTSTRAP_IN_SEPARATE_THREAD: diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java index 21103b490fd..11ce659625d 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java @@ -108,17 +108,18 @@ public class Deployment implements com.yahoo.config.provision.Deployment { @Override public void prepare() { if (prepared) return; - try (ActionTimer timer = applicationRepository.timerFor(session.getApplicationId(), "deployment.prepareMillis")) { + ApplicationId applicationId = session.getApplicationId(); + try (ActionTimer timer = applicationRepository.timerFor(applicationId, "deployment.prepareMillis")) { TimeoutBudget timeoutBudget = new TimeoutBudget(clock, timeout); - PrepareParams.Builder params = new PrepareParams.Builder().applicationId(session.getApplicationId()) + PrepareParams.Builder params = new PrepareParams.Builder().applicationId(applicationId) .timeoutBudget(timeoutBudget) .ignoreValidationErrors(!validate) .vespaVersion(version.toString()) .isBootstrap(isBootstrap); dockerImageRepository.ifPresent(params::dockerImageRepository); athenzDomain.ifPresent(params::athenzDomain); - Optional<ApplicationSet> activeApplicationSet = applicationRepository.getCurrentActiveApplicationSet(tenant, session.getApplicationId()); + Optional<ApplicationSet> activeApplicationSet = applicationRepository.getCurrentActiveApplicationSet(tenant, applicationId); tenant.getSessionRepository().prepareLocalSession(session, logger, params.build(), activeApplicationSet, tenant.getPath(), clock.instant()); this.prepared = true; diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java index d401669b8d6..c0b8b20d265 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java @@ -134,8 +134,18 @@ public abstract class Session implements Comparable<Session> { sessionZooKeeperClient.writeAthenzDomain(athenzDomain); } + /** Returns application id read from ZooKeeper. Will throw RuntimeException if not found */ public ApplicationId getApplicationId() { return sessionZooKeeperClient.readApplicationId(); } + /** Returns application id read from ZooKeeper. Will return Optional.empty() if not found */ + public Optional<ApplicationId> getOptionalApplicationId() { + try { + return Optional.of(getApplicationId()); + } catch (RuntimeException e) { + return Optional.empty(); + } + } + public FileReference getApplicationPackageReference() {return sessionZooKeeperClient.readApplicationPackageReference(); } public Optional<DockerImage> getDockerImageRepository() { return sessionZooKeeperClient.readDockerImageRepository(); } 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 6c4ef469be6..60ec297993f 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 @@ -181,8 +181,9 @@ public class SessionRepository { deleteLocalSession(candidate); } else if (createTime.plus(Duration.ofDays(1)).isBefore(clock.instant())) { // Sessions with state ACTIVATE, but which are not actually active - ApplicationId applicationId = candidate.getApplicationId(); - Long activeSession = activeSessions.get(applicationId); + Optional<ApplicationId> applicationId = candidate.getOptionalApplicationId(); + if (applicationId.isEmpty()) continue; + Long activeSession = activeSessions.get(applicationId.get()); if (activeSession == null || activeSession != candidate.getSessionId()) { deleteLocalSession(candidate); log.log(Level.INFO, "Deleted inactive session " + candidate.getSessionId() + " created " + |