Насколько серьезна ошибка Java7 "Solr / Lucene"?
видимо Java7 имеет некоторые неприятные ошибки в отношении оптимизации цикла:поиск Google.
из отчетов и описаний ошибок мне трудно судить, насколько важна эта ошибка (если вы не используете Solr или Lucene).
что я хотел бы знать:
- насколько вероятно, что моя (любая) программа затронута?
- является ли ошибка достаточно детерминированной, чтобы нормальное тестирование поймало ее?
примечание: Я не могу сделать пользователи моей программы используют -XX:-UseLoopPredicate
чтобы избежать проблем.
5 ответов:
проблема с любыми ошибками hotspot заключается в том, что вам нужно достичь порога компиляции (например, 10000), прежде чем он сможет вас получить: поэтому, если ваши модульные тесты "тривиальны", вы, вероятно, не поймаете его.
например, мы поймали проблему неверных результатов в lucene, потому что этот конкретный тест создает 20 000 индексов документов.
в наших тестах мы рандомизируем различные интерфейсы (например, различные реализации каталогов) и параметры индексирования и т. д., И только тест не удается 1% времени, конечно, его затем воспроизводится с тем же случайным семенем. Мы также запускаем checkindex для каждого индекса, который создают тесты, которые выполняют некоторые тесты на здравомыслие, чтобы убедиться, что индекс не поврежден.
для теста мы обнаружили, что если у вас есть определенная конфигурация: например, RAMDirectory + PulsingCodec + полезные нагрузки, хранящиеся для поля, то после того, как он достигнет порога компиляции, цикл перечисления по проводкам возвращает неправильные вычисления, в этом случае число вернули документы на срок != docFreq, сохраненный для этого термина.
У нас есть большое количество стресс-тестов, и важно отметить, что нормальные утверждения в этом тесте действительно проходят, его часть checkindex в конце, которая терпит неудачу.
большая проблема с этим заключается в том, что инкрементное индексирование lucene принципиально работает путем слияния нескольких сегментов в один: из-за этого, если эти перечисления вычисляют недопустимые данные, эти недопустимые данные затем хранящиеся в недавно объединенный индекс: он же коррупция.
Я бы сказал, что эта ошибка намного хитрее, чем предыдущие ошибки оптимизатора цикла hotspot, которые мы ударили (например, sign-flip stuff,https://issues.apache.org/jira/browse/LUCENE-2975). в этом случае мы получили дурацкие отрицательные дельты документа, которые позволяют легко поймать. Нам также пришлось вручную развернуть один метод, чтобы увернуться от него. С другой стороны, единственным "тестом", который мы изначально имели для этого, был огромный индекс 10GB http://www.pangaea.de/, так что было больно сузить его до этого жука.
в этом случае я потратил много времени (например, каждую ночь на прошлой неделе), пытаясь вручную развернуть/встроить различные вещи, пытаясь создать некоторый обходной путь, чтобы мы могли уклониться от ошибки и не иметь возможности создавать поврежденные индексы. Я мог уклониться от некоторых дел, но было еще много дел, которые я не мог... и я уверен, что если мы можем вызвать этот материал в наших тестах есть больше случаев там...
простой способ воспроизвести ошибку. Откройте eclipse (Indigo в моем случае) и перейдите в раздел справка/Поиск. Введите строку поиска, вы заметите, что eclipse аварийно завершает работу. Взгляните на журнал.
# 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:
проблема, все еще существует по состоянию на 2 декабря 2012 года в обоих Oracle JDK версия Java версия java " 1.7.0_09" Java (TM) SE среда выполнения (сборка 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.7.0_25-b15 на OSX.
через очень болезненные проб и ошибок я определил, что с помощью Java 1.7 с Solr 3.6.2 и autocommit
<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, но похоже, что это то, что происходит здесь. FWIW я также пробовал JDK 1.7.0_04, и это также показывает проблему.