package hudson.plugins.build_timeout.impl;
import hudson.Extension;
import hudson.model.AbstractBuild;
import hudson.model.BuildListener;
import hudson.model.Descriptor;
import hudson.model.Executor;
import hudson.model.Queue;
import hudson.model.Run;
import hudson.model.queue.Executables;
import hudson.plugins.build_timeout.BuildTimeOutStrategy;
import hudson.plugins.build_timeout.BuildTimeOutStrategyDescriptor;
import hudson.util.TimeUnit2;
import org.jenkinsci.plugins.tokenmacro.MacroEvaluationException;
import org.kohsuke.stapler.DataBoundConstructor;
import java.io.IOException;
/**
* Get the time considered it stuck.
*
* Return 10 times as much as eta if eta is available, else 24 hours.
* @see Executor#isLikelyStuck()
*/
public class LikelyStuckTimeOutStrategy extends BuildTimeOutStrategy {
@DataBoundConstructor
public LikelyStuckTimeOutStrategy() {
}
@Override
public long getTimeOut(AbstractBuild<?, ?> run, BuildListener listener)
throws InterruptedException, MacroEvaluationException, IOException {
Executor executor = run.getExecutor();
if (executor == null) {
return TimeUnit2.HOURS.toMillis(24);
}
Queue.Executable executable = executor.getCurrentExecutable();
if (executable == null) {
return TimeUnit2.HOURS.toMillis(24);
}
long eta = Executables.getEstimatedDurationFor(executable);
if (eta >= 0) {
return eta * 10;
} else {
return TimeUnit2.HOURS.toMillis(24);
}
}
public Descriptor<BuildTimeOutStrategy> getDescriptor() {
return DESCRIPTOR;
}
@Extension
public static final DescriptorImpl DESCRIPTOR = new DescriptorImpl();
public static class DescriptorImpl extends BuildTimeOutStrategyDescriptor {
@Override
public String getDisplayName() {
return Messages.LikelyStuckTimeOutStrategy_DisplayName();
}
}
}