From 9f364c42000c2d044b83339ad833b09800f17c53 Mon Sep 17 00:00:00 2001 From: Adam Jordens Date: Mon, 2 Jul 2018 14:56:10 -0700 Subject: [PATCH] fix(roles): Introduce cache / short refresh around clouddriver calls (#243) Cuts down on the number of calls to clouddriver for metadata that does not change all that frequently. Noticed a fairly high volume of calls falling through from x509 authentication attempts, more than seemed reasonable. --- .../fiat/providers/ProviderHealthTracker.java | 1 - .../internal/ClouddriverService.java | 61 +++++++------------ 2 files changed, 22 insertions(+), 40 deletions(-) diff --git a/fiat-roles/src/main/java/com/netflix/spinnaker/fiat/providers/ProviderHealthTracker.java b/fiat-roles/src/main/java/com/netflix/spinnaker/fiat/providers/ProviderHealthTracker.java index 6f66180f3..c8ffc2fb4 100644 --- a/fiat-roles/src/main/java/com/netflix/spinnaker/fiat/providers/ProviderHealthTracker.java +++ b/fiat-roles/src/main/java/com/netflix/spinnaker/fiat/providers/ProviderHealthTracker.java @@ -29,7 +29,6 @@ public class ProviderHealthTracker { private final long maximumStalenessTimeMs; private AtomicLong lastSuccessfulUpdateTimeMs = new AtomicLong(-1); - @Autowired public ProviderHealthTracker(long maximumStalenessTimeMs) { this.maximumStalenessTimeMs = maximumStalenessTimeMs; } diff --git a/fiat-roles/src/main/java/com/netflix/spinnaker/fiat/providers/internal/ClouddriverService.java b/fiat-roles/src/main/java/com/netflix/spinnaker/fiat/providers/internal/ClouddriverService.java index 169ca3426..277422229 100644 --- a/fiat-roles/src/main/java/com/netflix/spinnaker/fiat/providers/internal/ClouddriverService.java +++ b/fiat-roles/src/main/java/com/netflix/spinnaker/fiat/providers/internal/ClouddriverService.java @@ -25,6 +25,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; import java.util.List; import java.util.concurrent.atomic.AtomicReference; @@ -36,9 +37,6 @@ */ @Slf4j public class ClouddriverService implements HealthTrackable, InitializingBean { - - private static final String GROUP_KEY = "clouddriverService"; - private final ClouddriverApi clouddriverApi; @Autowired @@ -53,52 +51,37 @@ public ClouddriverService(ClouddriverApi clouddriverApi) { } @Override - public void afterPropertiesSet() throws Exception { + public void afterPropertiesSet() { try { - getAccounts(); - getApplications(); + refreshAccounts(); + refreshApplications(); } catch (Exception e) { log.warn("Cache initialization failed: ", e); } } public List getAccounts() { - return new SimpleJava8HystrixCommand<>( - GROUP_KEY, - "getAccounts", - () -> { - accountCache.set(clouddriverApi.getAccounts()); - healthTracker.success(); - return accountCache.get(); - }, - (Throwable cause) -> { - logFallback("account", cause); - List accounts = accountCache.get(); - if (accounts == null) { - throw new HystrixBadRequestException("Clouddriver is unavailable", cause); - } - return accounts; - }).execute(); + return accountCache.get(); } public List getApplications() { - return new SimpleJava8HystrixCommand<>( - GROUP_KEY, - "getApplications", - () -> { - applicationCache.set(clouddriverApi.getApplications()); - healthTracker.success(); - return applicationCache.get(); - }, - (Throwable cause) -> { - logFallback("application", cause); - List applications = applicationCache.get(); - if (applications == null) { - throw new HystrixBadRequestException("Clouddriver is unavailable", cause); - } - return applications; - }) - .execute(); + return applicationCache.get(); + } + + @Scheduled(fixedDelayString = "${fiat.clouddriverRefreshMs:30000}") + public void refreshAccounts() { + accountCache.set( + clouddriverApi.getAccounts() + ); + healthTracker.success(); + } + + @Scheduled(fixedDelayString = "${fiat.clouddriverRefreshMs:30000}") + public void refreshApplications() { + applicationCache.set( + clouddriverApi.getApplications() + ); + healthTracker.success(); } private static void logFallback(String resource, Throwable cause) {