首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java7的"Solr/Lucene“bug有多严重?

Java7的"Solr/Lucene“bug有多严重?
EN

Stack Overflow用户
提问于 2011-08-01 12:01:06
回答 5查看 8.7K关注 0票数 66

显然,Java7在循环优化方面有一些令人讨厌的bug:Google search

从报告和bug描述中,我发现很难判断这个bug有多严重(除非您使用Solr或Lucene)。

我想知道的是:

  • 我的(任何)程序受到影响的可能性有多大?
  • 错误确定性是否足以使正常测试捕获到它?

注意:我不能让我的程序用户使用-XX:-UseLoopPredicate来避免这个问题。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-08-01 12:27:09

任何热点bug的问题是,你需要达到编译阈值(例如10000)才能得到它:所以如果你的单元测试是“微不足道的”,你可能不会捕捉到它。

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

在我们的测试中,我们随机化了不同的接口(例如,不同的目录实现)和索引参数等,测试只有1%的时间失败,当然,它可以用相同的随机种子重现。我们还对test创建的每个索引运行checkindex,这会进行一些健全性测试,以确保索引不会损坏。

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

我们有大量的压力测试,重要的是要注意到这个测试中的正常断言实际上是通过的,它是最后失败的checkindex部分。

最大的问题是,lucene的增量索引基本上是通过将多个段合并成一个段来工作的:因此,如果这些枚举计算无效数据,这些无效数据就会存储到新合并的索引中:也就是损坏。

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

在这种情况下,我花了大量时间(例如,上周的每晚)尝试手动展开/内联各种内容,尝试创建一些解决方法,这样我们就可以避开bug,并且不会创建损坏的索引。我可以躲开一些案子,但还有更多的案子我不能...我相信如果我们能在我们的测试中触发这个东西,就会有更多的案例出现……

票数 79
EN

Stack Overflow用户

发布于 2011-08-02 12:23:03

复制bug的简单方法。打开eclipse (我的例子是Indigo),然后转到Help/Search。输入搜索字符串,您将注意到eclipse崩溃。请看一下日志。

代码语言:javascript
复制
# 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:
票数 8
EN

Stack Overflow用户

发布于 2012-12-02 22:58:11

截至2012年12月2日,该问题仍然存在于Oracle JDK Java -version java版本"1.7.0_09“java运行时环境(build 1.7.0_09-b05) java HotSpot(TM) 64位服务器VM (build 23.5-b02,混合模式)和OpenJDK java版本"1.7.0_09-icedtea”OpenJDK运行时环境(fedora-2.3.3.fc17.1-x86_64) openjdk 64位服务器VM (build 23.2-b09,混合模式)中。

奇怪的是,单独使用-XX:-UseLoopPredicate或-XX:LoopUnrollLimit=1选项中的任何一个都可以防止错误的发生,但是当它们一起使用时- JDK会失败参见例如https://bugzilla.redhat.com/show_bug.cgi?id=849279

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6894104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档