Hudson SCM Polling Thread обнимает при опросе - PullRequest
4 голосов
/ 22 апреля 2011

Мы используем Hudson для нашей среды непрерывной сборки.По какой-то причине, тема для SCM Polling через некоторое время обнимает.Я много экспериментировал с настройками, но, похоже, ничего не получалось.Как это исправить и есть ли сценарии, которые могут обнаружить такой случай, чтобы можно было перезапустить Гудзон?Btw.Перезапуск Гудзона - единственный способ решить эту проблему для нас на данный момент.

Ответы [ 2 ]

4 голосов
/ 26 апреля 2011

Это похоже на ошибку 5413 , которая должна быть устранена с конца 2010 года с помощью HUDSON 5977 (Hudson 1.380+, или теперь Jenkins).

У вас в этом потоке был какой-то способ убить любой поток, застрявший на этапе опроса :

очень примитивно (мне лень разрабатывать что-то лучше, так как это не очень важная проблема) Groovy скрипт ниже.
Может случиться так, что это убьет также опросы SCM, которые не застряли, но мы запускаем этот скрипт автоматически только один раз в день, поэтому он не доставит нам никаких хлопот.
Вы можете улучшить это, например. сохраняя идентификаторы и имена потоков опроса SCM, проверьте еще раз через некоторое время и уничтожьте только те потоки, идентификаторы которых находятся в списке из предыдущей проверки.

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() 
  }
}
0 голосов
/ 22 мая 2013

Другой ответ мне не помог, но следующий скрипт нашел проблему для этой проблемы сделал:

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()
      }
    }
  }
}
...