Насколько серьезна ошибка Java7 "Solr / Lucene"? - PullRequest
65 голосов
/ 01 августа 2011

Очевидно, что в Java7 есть какая-то неприятная ошибка, связанная с оптимизацией цикла: Поиск в Google .

По отчетам и описаниям ошибок мне трудно судить, насколько значительна эта ошибка (если вы не используете Solr или Lucene).

Что бы я хотел знать:

  • Насколько вероятно, что моя (любая) программа будет затронута?
  • Достаточно ли детерминистична ошибка, чтобы обычное тестирование ее поймало?

Примечание: я не могу заставить пользователей моей программы использовать -XX:-UseLoopPredicate, чтобы избежать проблемы.

Ответы [ 5 ]

79 голосов
/ 01 августа 2011

Проблема с любыми ошибками в горячих точках заключается в том, что вам нужно достичь порога компиляции (например, 10000), прежде чем он сможет вас достать: поэтому, если ваши модульные тесты «тривиальны», вы, вероятно, не поймаете его.

Например, мы обнаружили проблему с неверными результатами в lucene, потому что этот конкретный тест создает 20 000 индексов документов.

В наших тестах мы рандомизировали разные интерфейсы (например, разные реализации Справочника) и параметры индексации и тому подобное, итест не удался только 1% времени, конечно, тогда он воспроизводится с тем же случайным начальным числом.Мы также запускаем checkindex для каждого индекса, создаваемого тестами, которые выполняют некоторые тесты работоспособности, чтобы убедиться, что индекс не поврежден.

Для теста, который мы обнаружили, если у вас есть конкретная конфигурация: например, RAMDirectory + PulsingCodec + полезные данные сохраненыдля поля, затем после достижения порога компиляции цикл перечисления по проводкам возвращает неверные вычисления, в этом случае количество возвращенных документов для термина! = docFreq, сохраненного для термина.

Мы имеембольшое количество стресс-тестов, и важно отметить, что обычные утверждения в этом тесте действительно проходят, это часть checkindex в конце, которая не проходит.

Большая проблема с этим заключается в том, что инкрементная индексация lucene фундаментально работаетпутем объединения нескольких сегментов в один: из-за этого, если эти перечисления вычисляют недопустимые данные, эти недопустимые данные затем сохраняются во вновь объединенном индексе: aka коррупция.

Я бы сказал этоошибка намного хитрее, чем предыдущий оптимизатор циклаошибки горячих точек, к которым мы попали (например, всплывающие подсказки, https://issues.apache.org/jira/browse/LUCENE-2975).). В этом случае мы получили дурацкие отрицательные ошибки документа, которые облегчают его отлов.Нам также нужно было только вручную развернуть один метод, чтобы избежать его.С другой стороны, единственным «тестом», который у нас изначально был для этого, был огромный индекс в 10 ГБ http://www.pangaea.de/,, поэтому было больно сужать его до этой ошибки.

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

8 голосов
/ 02 августа 2011

Простой способ воспроизвести ошибку.Откройте затмение (в моем случае Indigo) и перейдите в «Справка / Поиск».Введите строку поиска, вы заметите, что затмение падает.Посмотрите на журнал.

# Problematic frame:
# J  org.apache.lucene.analysis.PorterStemmer.stem([CII)Z
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
#

---------------  T H R E A D  ---------------

Current thread (0x0000000007b79000):  JavaThread "Worker-46" [_thread_in_Java, id=264, stack(0x000000000f380000,0x000000000f480000)]

siginfo: ExceptionCode=0xc0000005, reading address 0x00000002f62bd80e

Registers:
4 голосов
/ 02 декабря 2012

Проблема, существующая по состоянию на 2 декабря 2012 г. в обоих Oracle JDK Java-версия Java-версия "1.7.0_09" Java (TM) SE Runtime Environment (сборка 1.7.0_09-b05) Java HotSpot (TM) 64-битная серверная виртуальная машина (сборка 23.5-b02, смешанный режим) и openjdk Java-версия "1.7.0_09-icedtea" Среда выполнения OpenJDK (fedora-2.3.3.fc17.1-x86_64) 64-битная серверная виртуальная машина OpenJDK (сборка 23.2-b09, смешанный режим)

Странно, что по отдельности любой из -XX: -UseLoopPredicate или -XX: LoopUnrollLimit = 1 опция предотвращения ошибок, но при использовании вместе - JDK не удается см. например https://bugzilla.redhat.com/show_bug.cgi?id=849279

1 голос
/ 27 августа 2013

Что ж, это два года спустя, и я считаю, что эта ошибка (или ее разновидность) все еще присутствует в 1.7.0_25-b15 на OSX.

Путем очень болезненных проб и ошибок я определил, что использование Java 1.7 с Solr 3.6.2 и автокоммитом <maxTime>30000</maxTime>, похоже, приводит к повреждению индекса.Кажется, это происходит только с 1.7 и maxTime на 30000. Если я переключусь на Java 1.6, у меня нет проблем.Если я опускаю maxTime до 3000, у меня нет проблем.

JVM не аварийно завершает работу, но заставляет RSolr умереть со следующей трассировкой стека в Ruby: https://gist.github.com/armhold/6354416. Он делает это надежно после сохранения нескольких сотен записей.

Учитываяздесь задействовано много слоев (Ruby, Sunspot, Rsolr и т. д.). Я не уверен, что смогу свести это во что-то, что окончательно доказывает ошибку JVM, но, похоже, именно это и происходит.Я также пробовал JDK 1.7.0_04, и это также показывает проблему.

0 голосов
/ 04 августа 2011

Насколько я понимаю, эта ошибка обнаружена только на сервере jvm.Если вы запускаете свою программу на клиенте jvm, вы находитесь в открытом доступе.Если вы запускаете свою программу на сервере jvm, это зависит от программы, насколько серьезной может быть проблема.

...