Сбой фоновых задач SonarQube с IllegalArgumentException для Java

Мы обновили Sonarqube до версии 5.2. После этого некоторые Java-проекты начинают давать сбой со следующим исключением:

    2015.12.22 02:42:13 INFO  [o.s.s.c.s.ComputationStepExecutor] Execute component visitors | time=9942ms        
    2015.12.21 13:01:45 ERROR [o.s.s.c.t.CeWorkerRunnableImpl] Failed to execute task AVHFtA0KaMG72s7lWjEx
            java.lang.IllegalArgumentException: Multiple entries with same key: MeasureKey{metricKey='lines', ruleId=-6253, characteristicId=-6253}=org.sonar.db.measure.PastMeasureDto@7493f7f3 and MeasureKey{metricKey='lines', ruleId=-6253, characteristicId=-6253}=org.sonar.db.measure.PastMeasureDto@1e7bae50
                at com.google.common.collect.ImmutableMap.checkNoConflict(ImmutableMap.java:150) ~[guava-17.0.jar:na]
                at com.google.common.collect.RegularImmutableMap.checkNoConflictInBucket(RegularImmutableMap.java:104) ~[guava-17.0.jar:na]
                at com.google.common.collect.RegularImmutableMap.<init>(RegularImmutableMap.java:70) ~[guava-17.0.jar:na]
                at com.google.common.collect.ImmutableMap$Builder.build(ImmutableMap.java:254) ~[guava-17.0.jar:na]
                at com.google.common.collect.Maps.uniqueIndex(Maps.java:1166) ~[guava-17.0.jar:na]
                at com.google.common.collect.Maps.uniqueIndex(Maps.java:1140) ~[guava-17.0.jar:na]
                at com.google.common.collect.FluentIterable.uniqueIndex(FluentIterable.java:424) ~[guava-17.0.jar:na]
                at org.sonar.server.computation.step.ComputeMeasureVariationsStep$VariationMeasuresVisitor.setVariationMeasures(ComputeMeasureVariationsStep.java:145) ~[sonar-server-5.2.jar:na]
                at org.sonar.server.computation.step.ComputeMeasureVariationsStep$VariationMeasuresVisitor.computeMeasuresWithVariations(ComputeMeasureVariationsStep.java:124) ~[sonar-server-5.2.jar:na]
                at org.sonar.server.computation.step.ComputeMeasureVariationsStep$VariationMeasuresVisitor.visitAny(ComputeMeasureVariationsStep.java:115) ~[sonar-server-5.2.jar:na]
                at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visitNode(DepthTraversalTypeAwareCrawler.java:60) ~[sonar-server-5.2.jar:na]
                at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visit(DepthTraversalTypeAwareCrawler.java:44) ~[sonar-server-5.2.jar:na]
                at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visitChildren(DepthTraversalTypeAwareCrawler.java:91) ~[sonar-server-5.2.jar:na]
                at org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler.visit(DepthTraversalTypeAwareCrawler.java:47) ~[sonar-server-5.2.jar:na]
                at org.sonar.server.computation.step.ComputeMeasureVariationsStep.execute(ComputeMeasureVariationsStep.java:92) ~[sonar-server-5.2.jar:na]
                at org.sonar.server.computation.step.ComputationStepExecutor.execute(ComputationStepExecutor.java:39) ~[sonar-server-5.2.jar:na]
                at org.sonar.server.computation.taskprocessor.report.ReportTaskProcessor.process(ReportTaskProcessor.java:53) ~[sonar-server-5.2.jar:na]
                at org.sonar.server.computation.taskprocessor.CeWorkerRunnableImpl.executeTask(CeWorkerRunnableImpl.java:78) [sonar-server-5.2.jar:na]
                at org.sonar.server.computation.taskprocessor.CeWorkerRunnableImpl.run(CeWorkerRunnableImpl.java:55) [sonar-server-5.2.jar:na]
                at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [na:1.7.0_45]
                at java.util.concurrent.FutureTask.runAndReset(Unknown Source) [na:1.7.0_45]
                at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(Unknown Source) [na:1.7.0_45]
                at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source) [na:1.7.0_45]
                at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) [na:1.7.0_45]
                at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) [na:1.7.0_45]
                at java.lang.Thread.run(Unknown Source) [na:1.7.0_45]

У меня установлены следующие плагины в Sonar

  • Findbugs 3.3 (найтибаги)
  • С# 4.3 (кшарп)
  • Groovy 1.2 (отличный)
  • Java 3.8 (Ява)
  • LDAP 1.4 (лдап)
  • Flex 2.2 (гибкий)
  • PHP 2.4.1 (php)
  • Разрушитель сборки 1.1 (разрушитель сборки)
  • JavaScript 2.8 (javascript)
  • JIRA 1.2 (Джира)

person olexii    schedule 22.12.2015    source источник
comment
Не могли бы вы попробовать с SonarQube 5.3-RC? Это поможет использовать дополнительную информацию о неисправном компоненте. Спасибо.   -  person Julien L. - SonarSource Team    schedule 06.01.2016
comment
Не могли бы вы также указать, какую базу данных вы используете и какая сортировка используется (поддерживается только сортировка с учетом регистра, см. docs.sonarqube.org/display/SONAR/Requirements).   -  person Julien L. - SonarSource Team    schedule 07.01.2016
comment
мы используем MySQL 5.5 и механизм хранения innodb. по поводу 5.3-RC будем пробовать. Спасибо   -  person olexii    schedule 11.01.2016


Ответы (2)


Похоже, у вас есть некоторые поврежденные прошлые измерения, вероятно, из-за отсутствия анализа во время миграции или других непредвиденных проблем.

Вам придется очистить базу данных, чтобы продолжить анализ. С SonarQube 5.3 вы сможете узнать, какой компонент испортил прошлые измерения.

Чтобы найти повторяющиеся меры для удаления для данного компонента, вам нужно будет выполнить следующий SQL-запрос (замените ключом компонента):

SELECT s.id, pm.metric_id, pm.rule_id, pm.characteristic_id FROM project_measures pm
INNER JOIN snapshots s ON s.id=pm.snapshot_id
INNER JOIN projects p ON p.id=s.project_id AND p.kee='<COMPONENT_KEY>'
INNER JOIN metrics m ON m.id=pm.metric_id
WHERE m.name='lines' 
AND pm.person_id IS NULL
GROUP BY s.id, pm.metric_id, pm.rule_id, pm.characteristic_id
HAVING count(*) > 1

Затем для каждой возвращаемой строки выполните следующий запрос (замените значением столбца s.id и т. д.):

SELECT pm.* FROM project_measures pm 
INNER JOIN snapshots s ON s.id=pm.snapshot_id
WHERE s.id=<S_ID> AND pm.metric_id=<PM_METRIC_ID> AND pm.rule_id=<PM_RULE_ID> AND pm.characteristic_id=<PM_CHARCTERISTIC_ID>

Вы должны иметь по крайней мере 2 строки, возвращаемые этим запросом: это дублированные данные, которые приводят к сбою вычислений проекта. Вам нужно сохранить только одну строку, удалив остальные с помощью:

DELETE FROM project_measures WHERE id=<PM_ID>

Пожалуйста, сделайте резервную копию базы данных перед удалением некоторых данных!

person Julien L. - SonarSource Team    schedule 11.01.2016

У нас также была эта проблема для type=DIRECTORY, но с помощью SQL-запроса Жюльена не было найдено дублирующихся мер. Решение заключалось в том, чтобы исключить каждый каталог, указанный в выброшенном исключении. Это было сделано путем добавления шаблонов, подобных приведенным ниже, в список исключений.

**/Implementations/Sales/**

После успешного завершения анализа (может потребоваться несколько запусков) вы можете удалить исключения из списка и запустить снова. Анализ завершится успешно, и любое содержимое, вызвавшее проблему, будет удалено.

person Rupreck    schedule 29.01.2016