【问题标题】:Hudson SCM Polling Thread hungs while pollingHudson SCM 轮询线程在轮询时挂起
【发布时间】:2011-08-10 22:19:05
【问题描述】:
我们将 Hudson 用于我们的持续构建环境。出于某种原因,SCM Polling 的线程在一段时间后会挂起。我已经对设置进行了很多尝试,但似乎没有任何效果。如何解决这个问题,是否有一些脚本可以检测到这种情况以便能够重新启动 hudson?顺便提一句。重启 hudson 是目前为我们解决此问题的唯一方法。
【问题讨论】:
标签:
multithreading
svn
hudson
polling
【解决方案1】:
这类似于bug 5413,应该从 2010 年底开始使用HUDSON 5977(Hudson 1.380+,或现在的 Jenkins)解决。
你在那些线程中有some way to kill any thread stuck on the polling step:
非常原始(我懒得开发更好的东西,因为这不是很重要的问题)Groovy 脚本如下。
它可能会杀死没有卡住的 SCM 轮询,但我们每天只自动运行一次这个脚本,所以它不会给我们带来任何麻烦。
您可以改进它,例如通过保存 SCM 轮询线程的 id 和名称,一段时间后再次检查并仅杀死之前检查中 id 在列表中的线程。
Thread.getAllStackTraces().keySet().each(){ item ->
if( item.getName().contains("SCM polling") &&
item.getName().contains("waiting for hudson.remoting")){
println "Interrupting thread " + item.getId() item.interrupt()
}
}
【解决方案2】:
其他答案对我不起作用,但以下脚本 found the the issue for this problem 起作用:
Jenkins.instance.getTrigger("SCMTrigger").getRunners().each()
{
item ->
println(item.getTarget().name)
println(item.getDuration())
println(item.getStartTime())
long millis = Calendar.instance.time.time - item.getStartTime()
if(millis > (1000 * 60 * 3)) // 1000 millis in a second * 60 seconds in a minute * 3 minutes
{
Thread.getAllStackTraces().keySet().each()
{
tItem ->
if (tItem.getName().contains("SCM polling") && tItem.getName().contains(item.getTarget().name))
{
println "Interrupting thread " + tItem.getName();
tItem.interrupt()
}
}
}
}