Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“Java7”有多严重;Solr/Lucene“;缺陷_Java_Java 7 - Fatal编程技术网

“Java7”有多严重;Solr/Lucene“;缺陷

“Java7”有多严重;Solr/Lucene“;缺陷,java,java-7,Java,Java 7,显然,Java7在循环优化方面存在一些令人讨厌的错误: 从报告和bug描述中,我发现很难判断这个bug有多严重(除非您使用Solr或Lucene) 我想知道的是: 我的(任何)计划受到影响的可能性有多大 这个bug是否具有足够的确定性,以至于正常的测试能够捕捉到它 注意:我不能让我的程序的用户使用-XX:-UseLoopPredicate来避免这个问题。任何热点bug的问题是,在它能够得到您之前,您需要达到编译阈值(例如10000):因此,如果您的单元测试是“琐碎的”,您可能无法捕获它 例如

显然,Java7在循环优化方面存在一些令人讨厌的错误:

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

我想知道的是:

  • 我的(任何)计划受到影响的可能性有多大
  • 这个bug是否具有足够的确定性,以至于正常的测试能够捕捉到它

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

任何热点bug的问题是,在它能够得到您之前,您需要达到编译阈值(例如10000):因此,如果您的单元测试是“琐碎的”,您可能无法捕获它

例如,我们在lucene中发现了错误的结果问题,因为这个特定的测试创建了20000个文档索引

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

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

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

最大的问题是,lucene的增量索引基本上是通过将多个段合并为一个段来工作的:因此,如果这些枚举计算无效数据,那么这些无效数据将存储到新合并的索引中:aka corrupt

我想说,这个bug比我们遇到的以前的循环优化器热点bug(例如,sign flip stuff,)要狡猾得多。在这种情况下,我们得到了古怪的负文档增量,这使得捕获更容易。我们也只需要手动展开一个方法来躲避它。另一方面,我们最初对此唯一的“测试”是一个巨大的10GB索引,因此将其缩小到这个bug是痛苦的


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

复制错误的简单方法。打开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:

据我所知,这个bug只在服务器jvm中发现。如果您在客户机jvm上运行您的程序,那么您就没有问题了。如果您在服务器jvm上运行程序,则取决于该程序问题的严重程度。

截至2012年12月2日,该问题仍然存在 在Oracle和JDK中 java版本 java版本“1.7.0_09” Java(TM)SE运行时环境(build 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) OpenJDK 64位服务器虚拟机(构建23.2-b09,混合模式)

奇怪的是 -XX:-UseLoopPredicate或-XX:LoopUnrollLimit=1 选项防止错误发生, 但是当一起使用时,JDK会失败 见例。
两年后,我相信OSX上的1.7.0_25-b15中仍然存在这个bug(或它的一个变体)

通过非常痛苦的尝试和错误,我确定使用Java1.7和Solr3.6.2以及autocommit
30000
似乎会导致索引损坏。它似乎只在30000时出现在w/1.7和
maxTime
上——如果我切换到Java1.6,我就没有问题了。如果我将
maxTime
降低到3000,我就没有问题了

JVM不会崩溃,但它会导致RSolr死亡,Ruby中的堆栈跟踪如下: . 它在保存了几百条记录后就可以可靠地完成这项工作


考虑到这里涉及的很多层(Ruby、Sunspot、Rsolr等),我不确定是否可以将其归结为一个JVM bug,但我确实觉得这就是这里发生的事情。FWIW我也尝试过JDK1.7.0_04,它也展示了这个问题

直接从源头上+1顺便说一句,谢谢,因为我看到了关于它的各种评论:请注意,捕获“错误结果”的测试设置是在6月30日提交的(),但是Java 7发行版上的时间戳实际上是6月27日(),哦,而且这个错误从5月13日起就在oracle打开了()。感谢Robert提供了详细的第一手答案。这是一场灾难:我当前的项目使用了大量加密和加密哈希。阵列上的数百万次迭代。崩溃我可以处理,但不正确加密的文件或散列只会在几年后变得明显,并带来可怕的后果。卡斯滕:我也有同感。崩溃的错误远没有无声的错误严重。崩溃不会损坏您的lucene索引。
-XX:-UseLoopPredicate
标志是否足以避免已知的损坏/崩溃情况?或者,
-XX:LoopUnrollLimit=1
是否也是所需的bug之一?或者,是否存在任何发射选项都无法修复(u01之前)的已知问题?这与Robert描述的相同吗?不,Narayan描述。这是java7中影响lucene的bug之一(因为如果使用porter stemmer,JRE将崩溃),但可能是最不严重的,因为只会发生崩溃:没有索引损坏的可能性。这有误导性: