diff options
Diffstat (limited to 'service-monitor')
3 files changed, 62 insertions, 6 deletions
diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/ServiceMonitorImpl.java b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/ServiceMonitorImpl.java index 0eaccf50e29..c6fe584c30a 100644 --- a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/ServiceMonitorImpl.java +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/ServiceMonitorImpl.java @@ -33,7 +33,10 @@ public class ServiceMonitorImpl implements ServiceMonitor { this.zone = superModelProvider.getZone(); this.configServerHosts = toConfigServerList(configserverConfig); ServiceMonitorMetrics metrics = new ServiceMonitorMetrics(metric, timer); - this.superModelListener = new SuperModelListenerImpl(slobrokMonitorManager, metrics); + this.superModelListener = new SuperModelListenerImpl( + slobrokMonitorManager, + metrics, + new ModelGenerator()); superModelListener.start(superModelProvider); } diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SuperModelListenerImpl.java b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SuperModelListenerImpl.java index a1dd6d5a265..56b42a80a79 100644 --- a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SuperModelListenerImpl.java +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SuperModelListenerImpl.java @@ -17,6 +17,7 @@ public class SuperModelListenerImpl implements SuperModelListener { private static final Logger logger = Logger.getLogger(SuperModelListenerImpl.class.getName()); private final ServiceMonitorMetrics metrics; + private final ModelGenerator modelGenerator; // superModel and slobrokMonitorManager are always updated together // and atomically using this monitor. @@ -25,9 +26,11 @@ public class SuperModelListenerImpl implements SuperModelListener { private SuperModel superModel; SuperModelListenerImpl(SlobrokMonitorManager slobrokMonitorManager, - ServiceMonitorMetrics metrics) { + ServiceMonitorMetrics metrics, + ModelGenerator modelGenerator) { this.slobrokMonitorManager = slobrokMonitorManager; this.metrics = metrics; + this.modelGenerator = modelGenerator; } void start(SuperModelProvider superModelProvider) { @@ -38,7 +41,7 @@ public class SuperModelListenerImpl implements SuperModelListener { SuperModel snapshot = superModelProvider.snapshot(this); snapshot.getAllApplicationInfos().stream().forEach(application -> - applicationActivated(superModel, application)); + applicationActivated(snapshot, application)); } } @@ -59,13 +62,11 @@ public class SuperModelListenerImpl implements SuperModelListener { } ServiceModel createServiceModelSnapshot(Zone zone, List<String> configServerHostnames) { - ModelGenerator modelGenerator = new ModelGenerator(); - try (LatencyMeasurement measurement = metrics.startServiceModelSnapshotLatencyMeasurement()) { // Reference 'measurement' in a dummy statement, otherwise the compiler // complains about "auto-closeable resource is never referenced in body of // corresponding try statement". Why hasn't javac fixed this!? - measurement.hashCode(); + dummy(measurement); // WARNING: The slobrok monitor manager may be out-of-sync with super model (no locking) return modelGenerator.toServiceModel( @@ -75,4 +76,6 @@ public class SuperModelListenerImpl implements SuperModelListener { slobrokMonitorManager); } } + + private void dummy(LatencyMeasurement measurement) {} }
\ No newline at end of file diff --git a/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SuperModelListenerImplTest.java b/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SuperModelListenerImplTest.java new file mode 100644 index 00000000000..0451785f34d --- /dev/null +++ b/service-monitor/src/test/java/com/yahoo/vespa/service/monitor/SuperModelListenerImplTest.java @@ -0,0 +1,50 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.service.monitor; + +import com.yahoo.config.model.api.ApplicationInfo; +import com.yahoo.config.model.api.SuperModel; +import com.yahoo.config.model.api.SuperModelProvider; +import com.yahoo.config.provision.Zone; +import com.yahoo.vespa.service.monitor.internal.ServiceMonitorMetrics; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +public class SuperModelListenerImplTest { + @Test + public void sanityCheck() { + SlobrokMonitorManager slobrokMonitorManager = mock(SlobrokMonitorManager.class); + ServiceMonitorMetrics metrics = mock(ServiceMonitorMetrics.class); + ModelGenerator modelGenerator = mock(ModelGenerator.class); + SuperModelListenerImpl listener = new SuperModelListenerImpl( + slobrokMonitorManager, + metrics, + modelGenerator); + + SuperModelProvider superModelProvider = mock(SuperModelProvider.class); + SuperModel superModel = mock(SuperModel.class); + when(superModelProvider.snapshot(listener)).thenReturn(superModel); + + ApplicationInfo application1 = mock(ApplicationInfo.class); + ApplicationInfo application2 = mock(ApplicationInfo.class); + List<ApplicationInfo> applications = Stream.of(application1, application2) + .collect(Collectors.toList()); + when(superModel.getAllApplicationInfos()).thenReturn(applications); + + listener.start(superModelProvider); + verify(slobrokMonitorManager).applicationActivated(superModel, application1); + verify(slobrokMonitorManager).applicationActivated(superModel, application2); + + Zone zone = mock(Zone.class); + List<String> configServers = new ArrayList<>(); + ServiceModel serviceModel = listener.createServiceModelSnapshot(zone, configServers); + verify(modelGenerator).toServiceModel(superModel, zone, configServers, slobrokMonitorManager); + } +}
\ No newline at end of file |