aboutsummaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorHÃ¥kon Hallingstad <hakon@oath.com>2018-12-06 22:05:03 +0100
committerGitHub <noreply@github.com>2018-12-06 22:05:03 +0100
commit1c5812260aa8a49e7d25d26ade15008d81b49374 (patch)
treeff818340806d5771f61a901f34f1b907a6464af6 /configserver
parent00ea7b629089800d4d840ee0fb99fc86e8498e2b (diff)
parent790f43668c9f6a1ed0e86cfec730a76c31666cf6 (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')
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/SuperModelManager.java72
-rw-r--r--configserver/src/main/resources/configserver-app/services.xml8
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" />