From 86a2dd63c579d09d11b915d853c11c4eaf97c0b1 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Mon, 1 May 2017 10:38:36 -0700 Subject: [PATCH] Be a little less eager to retry failed network requests This is to avoid bogging down the reconciler thread with repeated failing network calls in a short span of time. See https://www.pivotaltracker.com/story/show/143347079 --- .../cloudfoundry/client/cftarget/CFCallableContext.java | 6 ++++-- .../commons/cloudfoundry/client/cftarget/CFTarget.java | 6 +++--- .../commons/cloudfoundry/client/cftarget/CFTargetCache.java | 3 ++- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFCallableContext.java b/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFCallableContext.java index 977d921e8..f7e7458ee 100644 --- a/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFCallableContext.java +++ b/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFCallableContext.java @@ -28,6 +28,7 @@ public class CFCallableContext { private final CFParamsProviderMessages paramsProviderMessages; private Exception lastConnectionError; + private long lastErrorTime = 0; public CFCallableContext(CFParamsProviderMessages paramsProviderMessages) { this.paramsProviderMessages = paramsProviderMessages; @@ -38,6 +39,7 @@ public class CFCallableContext { try { return callable.call(); } catch (Exception e) { + lastErrorTime = System.currentTimeMillis(); throw convertToCfVscodeError(e); } } @@ -61,7 +63,7 @@ public class CFCallableContext { return null; } - public boolean hasConnectionError() { - return this.lastConnectionError != null; + public boolean hasExpiredConnectionError() { + return this.lastConnectionError != null && System.currentTimeMillis() - lastErrorTime > CFTargetCache.ERROR_EXPIRATION.toMillis(); } } \ No newline at end of file diff --git a/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTarget.java b/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTarget.java index dae638aa0..e86e7bde2 100644 --- a/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTarget.java +++ b/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTarget.java @@ -44,7 +44,6 @@ public class CFTarget { private LoadingCache> domainCache; private LoadingCache> stacksCache; private CFCallableContext callableContext; - public CFTarget(String targetName, CFClientParams params, ClientRequests requests, CFCallableContext callableContext) { this.params = params; @@ -111,8 +110,8 @@ public class CFTarget { return callableContext.checkConnection(callable); } - public boolean hasConnectionError() { - return callableContext.hasConnectionError(); + public boolean hasExpiredConnectionError() { + return callableContext.hasExpiredConnectionError(); } public CFClientParams getParams() { @@ -168,4 +167,5 @@ public class CFTarget { // %o : %s - [%a] return params.getOrgName() + " : " + params.getSpaceName() + " ["+params.getApiUrl()+"]"; } + } diff --git a/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTargetCache.java b/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTargetCache.java index 87f7c28d9..e0280f76d 100644 --- a/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTargetCache.java +++ b/headless-services/commons/commons-cf/src/main/java/org/springframework/ide/vscode/commons/cloudfoundry/client/cftarget/CFTargetCache.java @@ -33,6 +33,7 @@ public class CFTargetCache { public static final Duration SERVICES_EXPIRATION = Duration.ofSeconds(10); public static final Duration TARGET_EXPIRATION = Duration.ofHours(1); + public static final Duration ERROR_EXPIRATION = Duration.ofSeconds(10); public CFTargetCache(ClientParamsProvider paramsProvider, CloudFoundryClientFactory clientFactory, ClientTimeouts timeouts) { @@ -75,7 +76,7 @@ public class CFTargetCache { CFTarget target = cache.get(key); if (target != null) { // If any CF errors occurred in the target, refresh once - if (target.hasConnectionError()) { + if (target.hasExpiredConnectionError()) { cache.refresh(key); target = cache.get(key); }