显然Java7有一些关于循环优化的讨厌错误:谷歌搜索.
从报告和错误描述中我发现很难判断这个bug有多重要(除非你使用Solr或Lucene).
我想知道的是什么:
注意:我无法让用户使用我的程序-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是很痛苦的.
在这种情况下,我花了很多时间(例如上周的每个晚上)尝试手动展开/内联各种各样的东西,试图创建一些解决方法,以便我们可以避开错误而不会有创建损坏索引的可能性.我可以躲避一些案件,但还有更多的案例我不能......而且我敢肯定,如果我们能在我们的测试中触发这些东西,那么还有更多的案例......
小智 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)
归档时间: |
|
查看次数: |
8594 次 |
最近记录: |