Java7"Solr/Lucene"错误有多严重?

Car*_*ten 65 java java-7

显然Java7有一些关于循环优化的讨厌错误:谷歌搜索.

从报告和错误描述中我发现很难判断这个bug有多重要(除非你使用Solr或Lucene).

我想知道的是什么:

  • 我(任何)程序受影响的可能性有多大?
  • 这个bug是否足够确定,正常的测试会捕获它?

注意:我无法让用户使用我的程序-XX:-UseLoopPredicate来避免这个问题.

Rob*_*uir 79

任何热点错误的问题是你需要达到编译阈值(例如10000)才能得到你:所以如果你的单元测试是"微不足道的",你可能不会抓住它.

例如,我们在lucene中捕获了不正确的结果问题,因为此特定测试创建了20,000个文档索引.

在我们的测试中,我们随机选择不同的接口(如不同的目录中实现)和索引参数等,并测试只有失败的时候1%,当然它然后用相同的随机种子可再现.我们还在测试创建的每个索引上运行checkindex,它会进行一些健全性测试以确保索引没有损坏.

对于我们发现的测试,如果你有一个特定的配置:例如RAMDirectory + PulsingCodec +为字段存储的有效负载,那么在它达到编译阈值之后,对过帐的枚举循环返回不正确的计算,在这种情况下返回的文档数量对于一个术语!=为术语存储的docFreq.

我们有很多压力测试,重要的是要注意这个测试中的正常断言实际上是通过的,它的checkindex部分在最后失败了.

这个问题的一大问题是,lucene的增量索引从根本上通过将多个段合并为一个来实现:因此,如果这些枚举计算出无效数据,则将此无效数据存储到新合并的索引中:即损坏.

我会说这个错误比我们以前遇到的循环优化器热点错误(例如sign-flip stuff,https://issues.apache.org/jira/browse/LUCENE-2975)更加狡猾.在那种情况下,我们得到了古怪的负面文档增量,这使得它很容易捕获.我们也只需要手动展开一种方法来躲避它.另一方面,我们最初的唯一"测试"是一个巨大的10GB索引http://www.pangaea.de/,所以将它缩小到这个bug是很痛苦的.

在这种情况下,我花了很多时间(例如上周的每个晚上)尝试手动展开/内联各种各样的东西,试图创建一些解决方法,以便我们可以避开错误而不会有创建损坏索引的可能性.我可以躲避一些案件,但还有更多的案例我不能......而且我敢肯定,如果我们能在我们的测试中触发这些东西,那么还有更多的案例......

  • 直接来源.+1 (3认同)
  • 顺便说一句,谢谢,因为我看到了各种各样的评论:请注意6月30日(https://issues.apache.org/jira/browse/LUCENE-3264)提交的"错误结果"的测试设置,然而,Java 7发行版的时间戳实际上是6月27日(http://blog.thetaphi.de/2011/07/real-story-behind-java-7-ga-bugs.html),哦,这个bug有自5月13日以来一直在oracle开放(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7044738). (3认同)
  • 感谢Robert提供详细的第一手答案.这是一场灾难:我目前的项目使用了大量的加密和加密哈希.数组上的数百万次迭代.我可以处理的崩溃,但是错误地加密文件或哈希可能只会在轨道上出现明显的后果,并带来可怕的后果. (2认同)

小智 8

重现错误的简单方法.打开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:
Run Code Online (Sandbox Code Playgroud)

  • 不,Narayan描述了http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7070134.它是影响lucene的java7中的一个错误(因为如果你使用porter stemmer,你的JRE会崩溃),但可能是最不严重的,因为你只会崩溃:没有索引损坏的可能性. (3认同)