aboutsummaryrefslogtreecommitdiffstats
path: root/node-repository/src
diff options
context:
space:
mode:
authorMorten Tokle <mortent@oath.com>2018-05-31 14:37:13 +0200
committerMorten Tokle <mortent@oath.com>2018-05-31 14:37:13 +0200
commit34ef606353066aa32317a585bc18b4fda43ab7b1 (patch)
tree5b4f8425344c45683a0b9243198ce1a97656f41a /node-repository/src
parent8df85470c9d73c29132c4429549af1a453a95c02 (diff)
Keep a copy of node repository to prevent frequent zk access
Diffstat (limited to 'node-repository/src')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/filter/NodeIdentifier.java22
1 files changed, 21 insertions, 1 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/filter/NodeIdentifier.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/filter/NodeIdentifier.java
index 6d92f9c4541..a805db43b6b 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/filter/NodeIdentifier.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/filter/NodeIdentifier.java
@@ -1,8 +1,10 @@
// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.provision.restapi.v2.filter;
+import com.yahoo.concurrent.ThreadFactoryFactory;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.Zone;
+import com.yahoo.log.LogLevel;
import com.yahoo.vespa.athenz.identityprovider.api.VespaUniqueInstanceId;
import com.yahoo.vespa.athenz.tls.SubjectAlternativeName;
import com.yahoo.vespa.athenz.tls.X509CertificateUtils;
@@ -11,6 +13,10 @@ import com.yahoo.vespa.hosted.provision.NodeRepository;
import java.security.cert.X509Certificate;
import java.util.List;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.logging.Logger;
import java.util.stream.Collectors;
import static com.yahoo.vespa.athenz.tls.SubjectAlternativeName.Type.DNS_NAME;
@@ -31,9 +37,23 @@ class NodeIdentifier {
private final Zone zone;
private final NodeRepository nodeRepository;
+ private final AtomicReference<List<Node>> nodes;
+ private static final Logger logger = Logger.getLogger(NodeIdentifier.class.getName());
+
NodeIdentifier(Zone zone, NodeRepository nodeRepository) {
this.zone = zone;
this.nodeRepository = nodeRepository;
+ nodes = new AtomicReference<>(nodeRepository.getNodes());
+ new ScheduledThreadPoolExecutor(1, ThreadFactoryFactory.getDaemonThreadFactory("node-identifier-refresh"))
+ .scheduleAtFixedRate(this::updateNodeRepoCache, 1, 1, TimeUnit.MINUTES);
+ }
+
+ private void updateNodeRepoCache() {
+ logger.log(LogLevel.DEBUG, "Refreshing node list in filter");
+ try {
+ this.nodes.set(nodeRepository.getNodes());
+ } catch (Throwable ignored) {
+ }
}
NodePrincipal resolveNode(List<X509Certificate> certificateChain) throws NodeIdentifierException {
@@ -73,7 +93,7 @@ class NodeIdentifier {
private String getHostFromCalypsoCertificate(List<SubjectAlternativeName> sans) {
String openstackId = getUniqueInstanceId(sans);
- return nodeRepository.getNodes().stream()
+ return nodes.get().stream()
.filter(node -> node.openStackId().equals(openstackId))
.map(Node::hostname)
.findFirst()