핫스팟 버그의 문제점은 컴파일 임계 값 (예 : 10000)에 도달해야 얻을 수 있다는 것입니다. 따라서 단위 테스트가 "사소한"것이라면 아마 잡히지 않을 것입니다.
예를 들어,이 특정 테스트는 20,000 개의 문서 색인을 생성하기 때문에 lucene에서 잘못된 결과 문제를 발견했습니다.
우리의 테스트에서 서로 다른 인터페이스 (예 : 다른 디렉토리 구현) 및 색인화 매개 변수 등을 무작위로 추출 했으므로 테스트는 1 %의 시간 만 실패합니다. 물론 동일한 임의의 시드로 재현 할 수 있습니다. 테스트가 생성하는 모든 인덱스에 대해 checkindex를 실행합니다. 인덱스는 인덱스가 손상되지 않았는지 확인하기 위해 몇 가지 테스트를 수행합니다.
특정 구성이있는 경우 Google에서 테스트했습니다. RAMDirectory + PulsingCodec + 페이로드가 필드에 저장된 경우 컴파일 임계 값에 도달 한 후 게시물에 대한 열거 루프가 잘못된 계산을 반환합니다.이 경우에는 용어에 대해 반환되는 문서 수! = 해당 용어에 대해 저장된 docFreq입니다.
우리는 많은 수의 스트레스 테스트를 수행하며,이 테스트에서 정상적인 어설 션을 기록하는 것이 중요합니다. 즉, 실패한 끝에있는 checkindex 부분입니다.
이 가진 큰 문제, 즉 루씬의 증분 색인은 근본적으로 하나에 여러 개의 세그먼트를 병합하여 작동합니다 열거의 잘못된 데이터를 계산하는 경우,이 유효하지 않은 데이터는 다음 인이의 때문에 새로 합병 색인에 저장 : 일명 부패.
나는이 버그가 이전 루프 최적화 프로그램의 핫스팟 버그 (예 : sign-flip stuff, https://issues.apache.org/jira/browse/LUCENE-2975)보다 훨씬 더 위선적이라고 말하고 싶습니다. 이 경우 우리는 쉽게 잡을 수있는 엉뚱한 부정적인 문서 델타를 얻었습니다. 우리는 또한 그것을 피하기 위해 수동으로 하나의 방법을 언 롤해야했습니다. 반면에 처음에 우리가 가진 유일한 "테스트"는 http://www.pangaea.de/이라는 거대한 10GB 인덱스 였으므로이 버그를 좁히는 것은 힘들었습니다.
이 경우에는 여러 가지를 수동으로 언롤/인라인하는 등 많은 시간을 (예 : 매일 밤) 보냈습니다. 버그를 피할 수 있고 손상된 색인의 가능성이 없도록 몇 가지 해결 방법을 만들려고했습니다. 창조되고있다. 몇 가지 사례를 피할 수는 있지만 더 많은 경우가있었습니다 ... 테스트에서이 문제를 일으킬 수 있다면 더 많은 사례가있을 수 있습니다.
직선 소스에서. +1 – aroth
감사합니다. 그런데 여러 가지 의견을 보았습니다. '잘못된 결과'를 발견 한 테스트 설정은 6 월 30 일에 커밋되었습니다 (https://issues.apache.org/jira/browse/LUCENE- 3264), Java 7 릴리스의 타임 스탬프는 실제로 6 월 27 일입니다 (http://blog.thetaphi.de/2011/07/real-story-behind-java-7ga-bugs.html). 어쨌든 5 월 13 일부터 버그가 oracle에 공개되었습니다 (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7044738). –
상세한 직접적인 답변을 해주신 Robert 께 감사드립니다. 이것은 재앙입니다 : 현재 프로젝트는 많은 암호화와 암호화 해시를 사용합니다. 배열에 대한 수백만 개의 반복 내가 처리 할 수있는 충돌,하지만 잘못 암호화 된 파일이나 해시가 끔찍한 결과와 함께 트랙 아래로 분명 년 될 수 있습니다. – Carsten