diff options
Diffstat (limited to 'configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java')
-rw-r--r-- | configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java b/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java index 8d001d5d5df..4b61021bc38 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/application/Application.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.config.server.application; import com.yahoo.component.Version; +import com.yahoo.config.ConfigInstance; import com.yahoo.config.ConfigurationRuntimeException; import com.yahoo.config.model.api.ApplicationInfo; import com.yahoo.config.model.api.Model; @@ -11,6 +12,8 @@ import com.yahoo.vespa.config.ConfigCacheKey; import com.yahoo.vespa.config.ConfigDefinitionKey; import com.yahoo.vespa.config.ConfigKey; import com.yahoo.vespa.config.ConfigPayload; +import com.yahoo.vespa.config.ConfigPayloadBuilder; +import com.yahoo.vespa.config.GenericConfig; import com.yahoo.vespa.config.GetConfigRequest; import com.yahoo.vespa.config.buildergen.ConfigDefinition; import com.yahoo.vespa.config.protocol.ConfigResponse; @@ -23,6 +26,7 @@ import com.yahoo.vespa.config.server.rpc.ConfigResponseFactory; import com.yahoo.vespa.config.server.rpc.UncompressedConfigResponseFactory; import com.yahoo.vespa.config.server.tenant.TenantRepository; import com.yahoo.vespa.config.util.ConfigUtils; +import com.yahoo.yolean.Exceptions; import java.util.Objects; import java.util.Set; @@ -131,18 +135,35 @@ public class Application implements ModelResult { debug("Resolving " + configKey + " with config definition " + def); } - ConfigPayload payload = null; + ConfigInstance.Builder builder; + ConfigPayload payload; try { - payload = model.getConfig(configKey, def); + builder = model.getConfigInstance(configKey, def); + if (builder instanceof GenericConfig.GenericConfigBuilder) { + payload = ((GenericConfig.GenericConfigBuilder) builder).getPayload(); + } + else { + try { + ConfigInstance instance = builder.buildInstance(def.getCNode()); + payload = ConfigPayload.fromInstance(instance); + } catch (ConfigurationRuntimeException e) { + // This can happen in cases where services ask for config that no longer exist before they have been able + // to reconfigure themselves + log.log(Level.INFO, "Error resolving instance for builder '" + builder.getClass().getName() + + "', returning empty config: " + Exceptions.toMessageString(e)); + payload = ConfigPayload.fromBuilder(new ConfigPayloadBuilder()); + } + if (def.getCNode() != null) + payload.applyDefaultsFromDef(def.getCNode()); + } } catch (Exception e) { throw new ConfigurationRuntimeException("Unable to get config for " + app, e); } - if (payload == null) { - metricUpdater.incrementFailedRequests(); - throw new ConfigurationRuntimeException("Unable to resolve config " + configKey); - } - ConfigResponse configResponse = responseFactory.createResponse(payload, applicationGeneration, internalRedeploy); + ConfigResponse configResponse = responseFactory.createResponse(payload, + applicationGeneration, + internalRedeploy, + builder.getApplyOnRestart()); metricUpdater.incrementProcTime(System.currentTimeMillis() - start); if (useCache(req)) { cache.put(cacheKey, configResponse, configResponse.getConfigMd5()); |