diff options
author | Bjørn Christian Seime <bjorn.christian@seime.no> | 2017-09-08 16:41:39 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-08 16:41:39 +0200 |
commit | 5f6fb2f02a995fc1aafdb28e82560a96e6cfb948 (patch) | |
tree | 0a939ab42743a481e209f9302966ae8ecf24df7f | |
parent | ce32546fbf9f2552b0474097ac54c45705caee3e (diff) | |
parent | 6be842592dd6202a821d75ceb812edb0dcb4ba89 (diff) |
Merge pull request #3367 from vespa-engine/hakon/move-slobrokmonitor-to-java
Move SlobrokMonitor to Java
5 files changed, 100 insertions, 163 deletions
diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/JavaSlobrokMonitor.java b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/JavaSlobrokMonitor.java deleted file mode 100644 index 9b5cb64d0c2..00000000000 --- a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/JavaSlobrokMonitor.java +++ /dev/null @@ -1,48 +0,0 @@ -// 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.jrt.Supervisor; -import com.yahoo.jrt.Transport; -import com.yahoo.jrt.slobrok.api.Mirror; -import com.yahoo.jrt.slobrok.api.SlobrokList; - -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -/** - * Thin wrapper around {@link Mirror} class, that is a bit nicer to work with. - * - * @author bakksjo - */ -public class JavaSlobrokMonitor { - private final Mirror mirror; - - public JavaSlobrokMonitor(final List<String> slobroks) { - final Supervisor supervisor = new Supervisor(new Transport()); - final SlobrokList slobrokList = new SlobrokList(); - slobrokList.setup(slobroks.toArray(new String[0])); - mirror = new Mirror(supervisor, slobrokList); - } - - public Map<String, String> getRegisteredServices() throws ServiceTemporarilyUnavailableException { - if (!mirror.ready()) { - throw new ServiceTemporarilyUnavailableException("Slobrok mirror not ready"); - } - // TODO: Get _all_ services without resorting to a hack like this. - return Stream.iterate("*", pattern -> pattern + "/*").limit(10) - .flatMap(pattern -> Stream.of(mirror.lookup(pattern))) - .collect(Collectors.toMap(Mirror.Entry::getName, Mirror.Entry::getSpec)); - } - - public void shutdown() { - mirror.shutdown(); - } - - public static class ServiceTemporarilyUnavailableException extends Exception { - public ServiceTemporarilyUnavailableException(final String msg) { - super(msg); - } - } -} diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SingleClusterServiceMonitor.java b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SingleClusterServiceMonitor.java deleted file mode 100644 index f8f89c89f97..00000000000 --- a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SingleClusterServiceMonitor.java +++ /dev/null @@ -1,68 +0,0 @@ -// 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.cloud.config.SlobroksConfig; -import com.yahoo.component.AbstractComponent; - -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; -import java.util.stream.Collectors; - -/** - * This class can be used as a component, and will regularly dump known slobrok entries to the log. It will use - * the slobrok service configured for the current application. - * - * It is quite noisy and not useful for anything but testing. - * - * @author bakksjo - */ -public class SingleClusterServiceMonitor extends AbstractComponent { - private static final Logger logger = Logger.getLogger(SingleClusterServiceMonitor.class.getName()); - - private volatile JavaSlobrokMonitor slobrokMonitor; - - public SingleClusterServiceMonitor(final SlobroksConfig slobroksConfig) { - this.slobrokMonitor = new JavaSlobrokMonitor(getSlobrokSpecs(slobroksConfig)); - - new Thread(() -> { - while (true) { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - final JavaSlobrokMonitor slobrok = slobrokMonitor; - if (slobrok == null) { - return; - } - final Map<String, String> services; - try { - services = slobrok.getRegisteredServices(); - } catch (JavaSlobrokMonitor.ServiceTemporarilyUnavailableException e) { - logger.info("Slobrok monitor temporarily unavailable"); - continue; - } - if (services.isEmpty()) { - logger.info("Slobrok lookup returned no entries"); - } - services.forEach((serviceName, serviceSpec) -> - logger.info("Slobrok entry: " + serviceName + " => " + serviceSpec)); - } - }).start(); - } - - @Override - public void deconstruct() { - final JavaSlobrokMonitor slobrok = slobrokMonitor; - slobrokMonitor = null; - // Nothing prevents the mirror from being in use while we are shutting down, but so be it (for now at least). - slobrok.shutdown(); - } - - private static List<String> getSlobrokSpecs(final SlobroksConfig slobroksConfig) { - return slobroksConfig.slobrok().stream() - .map(SlobroksConfig.Slobrok::connectionspec) - .collect(Collectors.toList()); - } -} diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitor.java b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitor.java new file mode 100644 index 00000000000..4154dd598a4 --- /dev/null +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/monitor/SlobrokMonitor.java @@ -0,0 +1,99 @@ +// 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.jrt.Supervisor; +import com.yahoo.jrt.Transport; +import com.yahoo.jrt.slobrok.api.Mirror; +import com.yahoo.jrt.slobrok.api.SlobrokList; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +class SlobrokMonitor { + private final Supervisor supervisor = new Supervisor(new Transport()); + private final SlobrokList slobrokList = new SlobrokList(); + private final Mirror mirror = new Mirror(supervisor, slobrokList); + + void setSlobrokConnectionSpecs(List<String> slobroks) { + slobrokList.setup(slobroks.toArray(new String[0])); + } + + Map<SlobrokServiceName, SlobrokServiceSpec> getRegisteredServices() { + if (!mirror.ready()) { + return Collections.emptyMap(); + } + + Mirror.Entry[] mirrorEntries = mirror.lookup("**"); + return Arrays.stream(mirrorEntries).collect(Collectors.toMap( + entry -> new SlobrokServiceName(entry.getName()), + entry -> new SlobrokServiceSpec(entry.getSpec()))); + } + + boolean isRegistered(SlobrokServiceName serviceName) { + return mirror.lookup(serviceName.s()).length != 0; + } + + void shutdown() { + mirror.shutdown(); + } + + static class SlobrokServiceName { + private final String name; + + SlobrokServiceName(String name) { + this.name = name; + } + + // TODO: Fix spec + String s() { + return name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + SlobrokServiceName that = (SlobrokServiceName) o; + + return name.equals(that.name); + } + + @Override + public int hashCode() { + return name.hashCode(); + } + } + + static class SlobrokServiceSpec { + private final String spec; + + SlobrokServiceSpec(String spec) { + this.spec = spec; + } + + // TODO: Fix name + String s() { + return spec; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + SlobrokServiceSpec that = (SlobrokServiceSpec) o; + + return spec.equals(that.spec); + } + + @Override + public int hashCode() { + return spec.hashCode(); + } + } +} diff --git a/service-monitor/src/main/scala/com/yahoo/vespa/service/monitor/SlobrokAndConfigIntersector.scala b/service-monitor/src/main/scala/com/yahoo/vespa/service/monitor/SlobrokAndConfigIntersector.scala index 958a9bc462c..5ee19dda0a6 100644 --- a/service-monitor/src/main/scala/com/yahoo/vespa/service/monitor/SlobrokAndConfigIntersector.scala +++ b/service-monitor/src/main/scala/com/yahoo/vespa/service/monitor/SlobrokAndConfigIntersector.scala @@ -99,7 +99,7 @@ class SlobrokAndConfigIntersector( instancesObservables.slobroksPerInstance.subscribe { slobrokServiceMap => val nextSlobrokMonitorMap = slobrokServiceMap.map { case (instanceReference, slobrokServices) => val slobrokMonitor = latestSlobrokMonitorMap.getOrElse(instanceReference, new SlobrokMonitor()) - slobrokMonitor.setSlobrokConnectionSpecs(asConnectionSpecs(slobrokServices)) + slobrokMonitor.setSlobrokConnectionSpecs(asConnectionSpecs(slobrokServices).toList.asJava) (instanceReference, slobrokMonitor) } val removedSlobrokMonitors = (latestSlobrokMonitorMap -- nextSlobrokMonitorMap.keySet).values diff --git a/service-monitor/src/main/scala/com/yahoo/vespa/service/monitor/SlobrokMonitor.scala b/service-monitor/src/main/scala/com/yahoo/vespa/service/monitor/SlobrokMonitor.scala deleted file mode 100644 index f5ae2eeb510..00000000000 --- a/service-monitor/src/main/scala/com/yahoo/vespa/service/monitor/SlobrokMonitor.scala +++ /dev/null @@ -1,46 +0,0 @@ -// 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.jrt.slobrok.api.Mirror.Entry -import com.yahoo.jrt.slobrok.api.{Mirror, SlobrokList} -import com.yahoo.jrt.{Supervisor, Transport} -import com.yahoo.vespa.service.monitor.SlobrokMonitor._ - -import scala.collection.JavaConverters._ - -/** - * @author bakksjo - */ -class SlobrokMonitor { - private val supervisor: Supervisor = new Supervisor(new Transport()) - private val slobrokList = new SlobrokList() - private val mirror = new Mirror(supervisor, slobrokList) - - def setSlobrokConnectionSpecs(slobrokConnectionSpecs: Traversable[String]): Unit = { - val slobrokConnectionSpecsJavaList: java.util.List[String] = slobrokConnectionSpecs.toList.asJava - slobrokList.setup(slobrokConnectionSpecsJavaList.toArray(new Array[java.lang.String](0))) - } - - def getRegisteredServices(): Map[SlobrokServiceName, SlobrokServiceSpec] = { - if (!mirror.ready()) { - return Map() - } - val mirrorEntries: Array[Entry] = mirror.lookup("**") - mirrorEntries.map { mirrorEntry => - (SlobrokServiceName(mirrorEntry.getName), SlobrokServiceSpec(mirrorEntry.getSpec)) - }.toMap - } - - def isRegistered(serviceName: SlobrokServiceName): Boolean = { - mirror.lookup(serviceName.s).length != 0 - } - - def shutdown(): Unit = { - mirror.shutdown() - } -} - -object SlobrokMonitor { - case class SlobrokServiceName(s: String) - case class SlobrokServiceSpec(s: String) -} |