From dd1bc3e2a3d3a616acc8d07cd6681f7b7fc8685e Mon Sep 17 00:00:00 2001 From: Jose Luis Contreras Date: Fri, 4 Jan 2019 14:22:00 +0100 Subject: [PATCH 1/3] Added retry/backoff to GitHubRepositoryName.resolve method for robustness --- .../jenkins/GitHubRepositoryName.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/cloudbees/jenkins/GitHubRepositoryName.java b/src/main/java/com/cloudbees/jenkins/GitHubRepositoryName.java index 99e941579..d0e565803 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubRepositoryName.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubRepositoryName.java @@ -4,6 +4,7 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; +import com.google.common.collect.Iterables; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -64,6 +65,9 @@ public class GitHubRepositoryName { Pattern.compile("ssh://(?:git@)?([^/]+)/([^/]+)/([^/]+)/?") }; + private static final int MAX_RETRIES = 3; + private static final int BACKOFF_MILLIS = 50; + /** * Create {@link GitHubRepositoryName} from URL * @@ -160,12 +164,34 @@ public Iterable resolve() { * @return iterable with lazy login process for getting authenticated repos * @since 1.13.0 */ - public Iterable resolve(Predicate predicate) { + public Iterable baseResolve(Predicate predicate) { return from(GitHubPlugin.configuration().findGithubConfig(and(withHost(host), predicate))) .transform(toGHRepository(this)) .filter(notNull()); } + + /** + * Wraps baseResolve with a retry mechanism with linear backoff + */ + public Iterable resolve(Predicate predicate) { + int mtries = 0; + Iterable repos = baseResolve(predicate); + + while(Iterables.size(repos) == 0 && mtries < MAX_RETRIES){ + mtries++; + LOGGER.info("No repository names resolved for predicate: " + predicate.toString() + "\n Retrying..."); + try { + Thread.sleep(BACKOFF_MILLIS * mtries); + }catch(InterruptedException e) { + LOGGER.error("Error resolving GitHubRepositoryName with predicate: " + predicate.toString()); + } + repos = baseResolve(predicate); + } + + return repos; + } + /** * Variation of {@link #resolve()} method that just returns the first valid repository object. * From 7569a5260381eb453485cc58822360ba0c00fbd5 Mon Sep 17 00:00:00 2001 From: Jose Luis Contreras Date: Fri, 25 Jan 2019 14:14:29 +0100 Subject: [PATCH 2/3] Moved retry mechanism to the applyNullSafe method --- .../jenkins/GitHubRepositoryName.java | 47 ++++++++----------- 1 file changed, 19 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/cloudbees/jenkins/GitHubRepositoryName.java b/src/main/java/com/cloudbees/jenkins/GitHubRepositoryName.java index d0e565803..b043c9eab 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubRepositoryName.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubRepositoryName.java @@ -21,6 +21,7 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import java.io.IOException; +import java.net.UnknownHostException; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -164,34 +165,12 @@ public Iterable resolve() { * @return iterable with lazy login process for getting authenticated repos * @since 1.13.0 */ - public Iterable baseResolve(Predicate predicate) { + public Iterable resolve(Predicate predicate) { return from(GitHubPlugin.configuration().findGithubConfig(and(withHost(host), predicate))) .transform(toGHRepository(this)) .filter(notNull()); } - - /** - * Wraps baseResolve with a retry mechanism with linear backoff - */ - public Iterable resolve(Predicate predicate) { - int mtries = 0; - Iterable repos = baseResolve(predicate); - - while(Iterables.size(repos) == 0 && mtries < MAX_RETRIES){ - mtries++; - LOGGER.info("No repository names resolved for predicate: " + predicate.toString() + "\n Retrying..."); - try { - Thread.sleep(BACKOFF_MILLIS * mtries); - }catch(InterruptedException e) { - LOGGER.error("Error resolving GitHubRepositoryName with predicate: " + predicate.toString()); - } - repos = baseResolve(predicate); - } - - return repos; - } - /** * Variation of {@link #resolve()} method that just returns the first valid repository object. * @@ -249,12 +228,24 @@ private static Function toGHRepository(final GitHubReposit return new NullSafeFunction() { @Override protected GHRepository applyNullSafe(@Nonnull GitHub gitHub) { - try { - return gitHub.getRepository(format("%s/%s", repoName.getUserName(), repoName.getRepositoryName())); - } catch (IOException e) { - LOGGER.warn("Failed to obtain repository {}", this, e); - return null; + int mtries = 0; + while(mtries < MAX_RETRIES){ + try { + return gitHub.getRepository(format("%s/%s", repoName.getUserName(), repoName.getRepositoryName())); + } catch (UnknownHostException e){ + LOGGER.warn("Failed to resolve repository {}", this, e); + mtries++; + try { + Thread.sleep(BACKOFF_MILLIS * mtries); + } catch(InterruptedException ex) { + LOGGER.error("{}", this, ex); + } + } catch (IOException e) { + LOGGER.warn("Failed to obtain repository {}", this, e); + return null; + } } + return null; } }; } From 60385cb5ddc699b02fb218eb3d0d282a0f1354d0 Mon Sep 17 00:00:00 2001 From: Jose Luis Contreras Date: Mon, 28 Jan 2019 14:56:27 +0100 Subject: [PATCH 3/3] Style fixes, updated findbugs-maven-plugin to v3.0.5 to work with maven 3.6 --- pom.xml | 2 +- .../com/cloudbees/jenkins/GitHubRepositoryName.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index 4c0539cc3..a5c28734d 100644 --- a/pom.xml +++ b/pom.xml @@ -51,7 +51,7 @@ 1.625.3 false true - 3.0.2 + 3.0.5 1 7 1.120 diff --git a/src/main/java/com/cloudbees/jenkins/GitHubRepositoryName.java b/src/main/java/com/cloudbees/jenkins/GitHubRepositoryName.java index b043c9eab..66cccc0b0 100644 --- a/src/main/java/com/cloudbees/jenkins/GitHubRepositoryName.java +++ b/src/main/java/com/cloudbees/jenkins/GitHubRepositoryName.java @@ -4,7 +4,6 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; -import com.google.common.collect.Iterables; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; @@ -229,15 +228,16 @@ private static Function toGHRepository(final GitHubReposit @Override protected GHRepository applyNullSafe(@Nonnull GitHub gitHub) { int mtries = 0; - while(mtries < MAX_RETRIES){ + while (mtries < MAX_RETRIES) { try { - return gitHub.getRepository(format("%s/%s", repoName.getUserName(), repoName.getRepositoryName())); - } catch (UnknownHostException e){ + return gitHub.getRepository(format("%s/%s", repoName.getUserName(), + repoName.getRepositoryName())); + } catch (UnknownHostException e) { LOGGER.warn("Failed to resolve repository {}", this, e); mtries++; try { Thread.sleep(BACKOFF_MILLIS * mtries); - } catch(InterruptedException ex) { + } catch (InterruptedException ex) { LOGGER.error("{}", this, ex); } } catch (IOException e) {