TW-54223 use smaller timeout for 'git ls-remote'
authorDmitry Neverov <dmitry.neverov@jetbrains.com>
Sat, 9 Jun 2018 07:00:41 +0000 (09:00 +0200)
committerDmitry Neverov <dmitry.neverov@jetbrains.com>
Sat, 9 Jun 2018 07:00:41 +0000 (09:00 +0200)
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/AgentPluginConfig.java
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/PluginConfigImpl.java
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/UpdaterImpl.java
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/command/LsRemoteCommand.java
git-agent/src/jetbrains/buildServer/buildTriggers/vcs/git/agent/command/impl/LsRemoteCommandImpl.java

index 40baa630defde979c109ae8a76adfde89c488484..a650605dfe229f44d02e3c6a65365677c21c8541 100644 (file)
@@ -78,6 +78,8 @@ public interface AgentPluginConfig extends PluginConfig {
   @Nullable
   String getGitOutputCharsetName();
 
+  int getLsRemoteTimeoutSeconds();
+
   /**
    * Defines how progress output from git commands is written into build log
    */
index e6efbd860a26c41a05d2afc2f1997e02936afd73..d3fe79afb712ecab70ad4445155dbfcca740de24 100644 (file)
@@ -28,6 +28,7 @@ import org.jetbrains.annotations.Nullable;
 
 import java.io.File;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author dmitry.neverov
@@ -56,6 +57,7 @@ public class PluginConfigImpl implements AgentPluginConfig {
   public static final String PROVIDE_CRED_HELPER = "teamcity.git.provideCredentialHelper";
   private static final String USE_DEFAULT_CHARSET = "teamcity.git.useDefaultCharset";
   private static final String GIT_OUTPUT_CHARSET = "teamcity.git.outputCharset";
+  private static final String LS_REMOTE_TIMEOUT_SECONDS = "teamcity.git.lsRemoteTimeoutSeconds";
 
   private final BuildAgentConfiguration myAgentConfig;
   private final AgentRunningBuild myBuild;
@@ -294,11 +296,24 @@ public class PluginConfigImpl implements AgentPluginConfig {
     return StringUtil.isNotEmpty(charsetName) ? charsetName : "UTF-8";
   }
 
+  @Override
+  public int getLsRemoteTimeoutSeconds() {
+    int defaultTimeoutSeconds = 5 * 60;
+    String valueFromBuild = myBuild.getSharedConfigParameters().get(LS_REMOTE_TIMEOUT_SECONDS);
+    if (valueFromBuild != null) {
+      return parseTimeout(valueFromBuild, defaultTimeoutSeconds);
+    } else {
+      return defaultTimeoutSeconds;
+    }
+  }
+
   private int parseTimeout(String valueFromBuild) {
     return parseTimeout(valueFromBuild, DEFAULT_IDLE_TIMEOUT);
   }
 
   private int parseTimeout(String valueFromBuild, int defaultValue) {
+    if (valueFromBuild == null)
+      return defaultValue;
     try {
       int timeout = Integer.parseInt(valueFromBuild);
       if (timeout > 0)
index 1cf02290b69f52f586348c761532d2ba660b5fb1..c7634c8c87765784537dbbc44212de84b66be35e 100644 (file)
@@ -929,6 +929,7 @@ public class UpdaterImpl implements Updater {
     GitFacade git = myGitFactory.create(workingDir);
     myRemoteRefs = new Refs(git.lsRemote().setAuthSettings(myRoot.getAuthSettings())
       .setUseNativeSsh(myPluginConfig.isUseNativeSSH())
+      .setTimeout(myPluginConfig.getLsRemoteTimeoutSeconds())
       .call());
     return myRemoteRefs;
   }
index a989b4ac8ffbe1a648e88d04d94b4e9a05a5d666..071d632eb4ddcebf95998fc7d0f2bd7b3e052d7f 100644 (file)
@@ -34,6 +34,9 @@ public interface LsRemoteCommand extends BaseCommand {
   @NotNull
   LsRemoteCommand setUseNativeSsh(boolean useNativeSsh);
 
+  @NotNull
+  LsRemoteCommand setTimeout(int timeoutSeconds);
+
   @NotNull
   public List<Ref> call() throws VcsException;
 
index 2b0cdb9f74eefea168677692854124af7f79ab29..56896e43a5a1045001101ed67f07d965b7969c88 100644 (file)
@@ -38,6 +38,7 @@ public class LsRemoteCommandImpl extends BaseCommandImpl implements LsRemoteComm
   private AuthSettings myAuthSettings;
   private boolean myUseNativeSsh = false;
   private int myAttemptsLimit = 3;
+  private int myTimeoutSeconds;
 
   public LsRemoteCommandImpl(@NotNull GitCommandLine cmd) {
     super(cmd);
@@ -61,6 +62,13 @@ public class LsRemoteCommandImpl extends BaseCommandImpl implements LsRemoteComm
     return this;
   }
 
+  @NotNull
+  @Override
+  public LsRemoteCommand setTimeout(int timeoutSeconds) {
+    myTimeoutSeconds = timeoutSeconds;
+    return this;
+  }
+
   @NotNull
   public List<Ref> call() throws VcsException {
     GitCommandLine cmd = getCmd();
@@ -73,6 +81,7 @@ public class LsRemoteCommandImpl extends BaseCommandImpl implements LsRemoteComm
     while (true) {
       try {
         ExecResult result = cmd.run(with()
+                                      .timeout(myTimeoutSeconds)
                                       .authSettings(myAuthSettings)
                                       .useNativeSsh(myUseNativeSsh));
         return parse(result.getStdout());