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