diff options
author | HÃ¥kon Hallingstad <hakon@oath.com> | 2018-12-06 22:05:03 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-06 22:05:03 +0100 |
commit | 1c5812260aa8a49e7d25d26ade15008d81b49374 (patch) | |
tree | ff818340806d5771f61a901f34f1b907a6464af6 /configserver/src | |
parent | 00ea7b629089800d4d840ee0fb99fc86e8498e2b (diff) | |
parent | 790f43668c9f6a1ed0e86cfec730a76c31666cf6 (diff) |
Merge pull request #7891 from vespa-engine/hakonhall/notify-service-monitors-of-infra-apps
Make service monitors aware of infra applications in duper model.
Diffstat (limited to 'configserver/src')
-rw-r--r-- | configserver/src/main/java/com/yahoo/vespa/config/server/SuperModelManager.java | 72 | ||||
-rw-r--r-- | configserver/src/main/resources/configserver-app/services.xml | 8 |
2 files changed, 47 insertions, 33 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/SuperModelManager.java b/configserver/src/main/java/com/yahoo/vespa/config/server/SuperModelManager.java index 542d0b3f387..80818aea2e8 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/SuperModelManager.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/SuperModelManager.java @@ -10,7 +10,6 @@ import com.yahoo.config.model.api.SuperModelListener; import com.yahoo.config.model.api.SuperModelProvider; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.NodeFlavors; -import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import com.yahoo.vespa.config.GenerationCounter; import com.yahoo.vespa.config.server.application.ApplicationSet; @@ -27,6 +26,8 @@ import java.util.Optional; */ public class SuperModelManager implements SuperModelProvider { private final Zone zone; + + private final Object monitor = new Object(); private SuperModelConfigProvider superModelConfigProvider; // Guarded by 'this' monitor private final List<SuperModelListener> listeners = new ArrayList<>(); // Guarded by 'this' monitor @@ -46,49 +47,62 @@ public class SuperModelManager implements SuperModelProvider { } @Override - public synchronized SuperModel getSuperModel() { - return superModelConfigProvider.getSuperModel(); + public SuperModel getSuperModel() { + synchronized (monitor) { + return superModelConfigProvider.getSuperModel(); + } } - public synchronized SuperModelConfigProvider getSuperModelConfigProvider() { - return superModelConfigProvider; + public SuperModelConfigProvider getSuperModelConfigProvider() { + synchronized (monitor) { + return superModelConfigProvider; + } } - public synchronized long getGeneration() { - return generation; + public long getGeneration() { + synchronized (monitor) { + return generation; + } } @Override - public synchronized SuperModel snapshot(SuperModelListener listener) { - listeners.add(listener); - return superModelConfigProvider.getSuperModel(); + public void registerListener(SuperModelListener listener) { + synchronized (monitor) { + listeners.add(listener); + SuperModel superModel = superModelConfigProvider.getSuperModel(); + superModel.getAllApplicationInfos().forEach(application -> listener.applicationActivated(superModel, application)); + } } public Zone getZone() { return zone; } - public synchronized void configActivated(ApplicationSet applicationSet) { - // TODO: Should supermodel care about multiple versions? - ApplicationInfo applicationInfo = applicationSet - .getForVersionOrLatest(Optional.empty(), Instant.now()) - .toApplicationInfo(); - - SuperModel newSuperModel = this.superModelConfigProvider - .getSuperModel() - .cloneAndSetApplication(applicationInfo); - makeNewSuperModelConfigProvider(newSuperModel); - listeners.stream().forEach(listener -> - listener.applicationActivated(newSuperModel, applicationInfo)); + public void configActivated(ApplicationSet applicationSet) { + synchronized (monitor) { + // TODO: Should supermodel care about multiple versions? + ApplicationInfo applicationInfo = applicationSet + .getForVersionOrLatest(Optional.empty(), Instant.now()) + .toApplicationInfo(); + + SuperModel newSuperModel = this.superModelConfigProvider + .getSuperModel() + .cloneAndSetApplication(applicationInfo); + makeNewSuperModelConfigProvider(newSuperModel); + listeners.stream().forEach(listener -> + listener.applicationActivated(newSuperModel, applicationInfo)); + } } - public synchronized void applicationRemoved(ApplicationId applicationId) { - SuperModel newSuperModel = this.superModelConfigProvider - .getSuperModel() - .cloneAndRemoveApplication(applicationId); - makeNewSuperModelConfigProvider(newSuperModel); - listeners.stream().forEach(listener -> - listener.applicationRemoved(newSuperModel, applicationId)); + public void applicationRemoved(ApplicationId applicationId) { + synchronized (monitor) { + SuperModel newSuperModel = this.superModelConfigProvider + .getSuperModel() + .cloneAndRemoveApplication(applicationId); + makeNewSuperModelConfigProvider(newSuperModel); + listeners.stream().forEach(listener -> + listener.applicationRemoved(newSuperModel, applicationId)); + } } private void makeNewSuperModelConfigProvider(SuperModel newSuperModel) { diff --git a/configserver/src/main/resources/configserver-app/services.xml b/configserver/src/main/resources/configserver-app/services.xml index 92ec8d53022..5ba05a629c6 100644 --- a/configserver/src/main/resources/configserver-app/services.xml +++ b/configserver/src/main/resources/configserver-app/services.xml @@ -64,10 +64,10 @@ <preprocess:include file='hosted-vespa/metrics-packets.xml' required='false' /> <preprocess:include file='controller/container.xml' required='false' /> - <component id="com.yahoo.vespa.service.monitor.internal.slobrok.SlobrokMonitorManagerImpl" bundle="service-monitor" /> - <component id="com.yahoo.vespa.service.monitor.internal.health.HealthMonitorManager" bundle="service-monitor" /> - <component id="com.yahoo.vespa.service.monitor.internal.ServiceMonitorImpl" bundle="service-monitor" /> - <component id="com.yahoo.vespa.service.monitor.application.DuperModel" bundle="service-monitor" /> + <component id="com.yahoo.vespa.service.slobrok.SlobrokMonitorManagerImpl" bundle="service-monitor" /> + <component id="com.yahoo.vespa.service.health.HealthMonitorManager" bundle="service-monitor" /> + <component id="com.yahoo.vespa.service.model.ServiceMonitorImpl" bundle="service-monitor" /> + <component id="com.yahoo.vespa.service.duper.DuperModelManager" bundle="service-monitor" /> <component id="com.yahoo.vespa.orchestrator.ServiceMonitorInstanceLookupService" bundle="orchestrator" /> <component id="com.yahoo.vespa.orchestrator.status.ZookeeperStatusService" bundle="orchestrator" /> <component id="com.yahoo.vespa.orchestrator.controller.RetryingClusterControllerClientFactory" bundle="orchestrator" /> |