El problema con cualquier error de zona activa es que necesita alcanzar el umbral de compilación (por ejemplo, 10000) antes de poder obtenerlo: por lo tanto, si las pruebas de su unidad son "triviales", probablemente no lo detecte.
Por ejemplo, detectamos el problema de resultados incorrectos en lucene, porque esta prueba en particular crea 20,000 índices de documentos.
En nuestras pruebas asignamos al azar diferentes interfaces (por ejemplo, diferentes implementaciones de Directorio) y parámetros de indexación y tal, y la prueba solo falla el 1% del tiempo, por supuesto es reproducible con la misma semilla aleatoria. También ejecutamos checkindex en cada índice que crean las pruebas, que hacen algunas pruebas de cordura para garantizar que el índice no esté dañado.
Para la prueba que encontramos, si tiene una configuración particular: p. RAMDirectory + PulsingCodec + cargas almacenadas para el campo, luego, una vez que alcanza el umbral de compilación, el bucle de enumeración sobre las contabilizaciones devuelve cálculos incorrectos, en este caso, el número de documentos devueltos para un término! = El docFreq almacenado para el término.
Tenemos un buen número de pruebas de estrés, y es importante tener en cuenta que las aserciones normales en esta prueba en realidad pasan, es la parte de control al final que falla.
El gran problema con esto, es la indexación incremental de los que Lucene trabaja fundamentalmente mediante la fusión de varios segmentos en uno: debido a esto, si estas enumeraciones calcular los datos no válidos, estos datos no válido es entonces almacenado en el índice resultante de la fusión: también conocido como corrupción.
Diría que este error es mucho más engañoso que los errores de punto de acceso anteriores del bucle que hemos detectado (por ejemplo, cosas de bloqueo de registros, https://issues.apache.org/jira/browse/LUCENE-2975). En ese caso obtuvimos deltas de documentos negativos extravagantes, que hacen que sea fácil de atrapar. También solo tuvimos que desenrollar manualmente un solo método para esquivarlo. Por otro lado, la única "prueba" que tuvimos inicialmente para eso fue un gran índice de 10 GB de http://www.pangaea.de/, por lo que fue doloroso reducirlo a este error.
En este caso, pasé una buena cantidad de tiempo (por ejemplo, todas las noches de la semana pasada) tratando de desenrollar manualmente varias cosas, tratando de crear alguna solución para poder esquivar el error y no tener la posibilidad de índices corruptos siendo creado. Podría esquivar algunos casos, pero había muchos más casos que no podría ... y estoy seguro de que si podemos activar esto en nuestras pruebas, hay más casos por ahí ...
Directamente de la fuente. +1 – aroth
Gracias, por cierto, ya que vi varios comentarios al respecto: tenga en cuenta que la configuración de la prueba que captó los "resultados incorrectos" se cometió el 30 de junio (https://issues.apache.org/jira/browse/LUCENE- 3264), Sin embargo, la fecha y hora en el lanzamiento de Java 7 es en realidad el 27 de junio (http://blog.thetaphi.de/2011/07/real-story-behind-java-7-ga-bugs.html), oh, y el error ha estado abierto en Oracle desde el 13 de mayo de todos modos (http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7044738). –
Gracias Robert por la respuesta detallada de primera mano. Esto es un desastre: mi proyecto actual utiliza una gran cantidad de criptografía y hash criptográficos. Millones de iteraciones en matrices. Bloqueos que podría manejar, pero tener archivos o hashes incorrectamente encriptados puede volverse evidente años atrás con terribles consecuencias. – Carsten