Поток опроса Hudson SCM зависает во время опроса

#multithreading #svn #hudson #polling

#многопоточность #svn #hudson #опрос

Вопрос:

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

Комментарии:

1. Какие инструменты SCM вы используете (svn, hg и т.д.)?

2. Какая версия hudson? Можете ли вы также предоставить нам трассировки стека?

Ответ №1:

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

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

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

 Thread.getAllStackTraces().keySet().each(){ item ->
  if( item.getName().contains("SCM polling") amp;amp; 
      item.getName().contains("waiting for hudson.remoting")){ 
     println "Interrupting thread "   item.getId() item.interrupt() 
  }
}
  

Ответ №2:

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

 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") amp;amp; tItem.getName().contains(item.getTarget().name))
      { 
        println "Interrupting thread "   tItem.getName(); 
        tItem.interrupt()
      }
    }
  }
}