【问题标题】:Hudson SCM Polling Thread hungs while pollingHudson SCM 轮询线程在轮询时挂起
【发布时间】:2011-08-10 22:19:05
【问题描述】:

我们将 Hudson 用于我们的持续构建环境。出于某种原因,SCM Polling 的线程在一段时间后会挂起。我已经对设置进行了很多尝试,但似乎没有任何效果。如何解决这个问题,是否有一些脚本可以检测到这种情况以便能够重新启动 hudson?顺便提一句。重启 hudson 是目前为我们解决此问题的唯一方法。

【问题讨论】:

  • 您使用什么 SCM 工具(svn、hg 等)?
  • 哪个哈德逊版本?你也可以给我们堆栈跟踪吗?

标签: 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()
          }
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 2023-03-16
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      相关资源
      最近更新 更多