Descargue el archivo jar de oak-run desde aquí http://repo1.maven.org/maven2/org/apache/jackrabbit/oak-run/
Aparece el mensaje SegmentNotFoundException cuando hay problemas de integridad en el repositorio.
Problema
Observa SegmentNotFoundException en los archivos de registro de AEM, y AEM no está funcionando como se esperaba
O
La ejecución de una compactación sin conexión puede fallar con SegmentNotFoundException cuando hay problemas de integridad del repositorio. En los registros se puede encontrar una traza de pila similar a la siguiente:
13:51:21.523 [main] ERROR o.a.j.o.p.segment.SegmentTracker - Segment not found: 4d139bc4-150c-4f0a-b82a-40a4e519fe8a. Creation date delta is 4 ms. org.apache.jackrabbit.oak.plugins.segment.SegmentNotFoundException: Segment 4d139bc4-150c-4f0a-b82a-40a4e519fe8a not found at org.apache.jackrabbit.oak.plugins.segment.file.FileStore.readSegment(FileStore.java:855) [oak-run-1.0.22.jar:1.0.22] at org.apache.jackrabbit.oak.plugins.segment.SegmentTracker.getSegment(SegmentTracker.java:134) ~[oak-run-1.0.22.jar:1.0.22] at org.apache.jackrabbit.oak.plugins.segment.SegmentId.getSegment(SegmentId.java:101) [oak-run-1.0.22.jar:1.0.22] ... Exception in thread "main" org.apache.jackrabbit.oak.plugins.segment.SegmentNotFoundException: Segment 4d139bc4-150c-4f0a-b82a-40a4e519fe8a not found at org.apache.jackrabbit.oak.plugins.segment.file.FileStore.readSegment(FileStore.java:855) at org.apache.jackrabbit.oak.plugins.segment.SegmentTracker.getSegment(SegmentTracker.java:134) at org.apache.jackrabbit.oak.plugins.segment.SegmentId.getSegment(SegmentId.java:101) ...
O
Ejecutar una compactación sin conexión puede fallar con IllegalArgumentException cuando hay problemas de integridad del repositorio. En los registros se puede encontrar una traza de pila similar a la siguiente:
java.lang.IllegalArgumentException at com.google.common.base.Preconditions.checkArgument(Preconditions.java:77) at org.apache.jackrabbit.oak.plugins.segment.ListRecord.(ListRecord.java:41) at org.apache.jackrabbit.oak.plugins.segment.ListRecord.getEntry(ListRecord.java:64) at org.apache.jackrabbit.oak.plugins.segment.ListRecord.getEntries(ListRecord.java:81) at org.apache.jackrabbit.oak.plugins.segment.SegmentStream.read(SegmentStream.java:153) at org.apache.jackrabbit.oak.commons.IOUtils.readFully(IOUtils.java:53) at org.apache.jackrabbit.oak.plugins.segment.Compactor.getBlobKey(Compactor.java:412) at org.apache.jackrabbit.oak.plugins.segment.Compactor.compact(Compactor.java:362) at org.apache.jackrabbit.oak.plugins.segment.Compactor.compact(Compactor.java:321) at org.apache.jackrabbit.oak.plugins.segment.Compactor.access$500(Compactor.java:54) at org.apache.jackrabbit.oak.plugins.segment.Compactor$CompactDiff.propertyAdded(Compactor.java:227) at org.apache.jackrabbit.oak.plugins.segment.CancelableDiff.propertyAdded(CancelableDiff.java:47) at org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.compareAgainstEmptyState(EmptyNodeState.java:156) at org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:434) at org.apache.jackrabbit.oak.plugins.segment.Compactor$CompactDiff.diff(Compactor.java:214) at org.apache.jackrabbit.oak.plugins.segment.Compactor$CompactDiff.childNodeAdded(Compactor.java:263) at org.apache.jackrabbit.oak.plugins.segment.CancelableDiff.childNodeAdded(CancelableDiff.java:74) at org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.compareAgainstEmptyState(EmptyNodeState.java:161) at org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:434) at org.apache.jackrabbit.oak.plugins.segment.Compactor$CompactDiff.diff(Compactor.java:214) at org.apache.jackrabbit.oak.plugins.segment.Compactor$CompactDiff.childNodeAdded(Compactor.java:263) at org.apache.jackrabbit.oak.plugins.segment.CancelableDiff.childNodeAdded(CancelableDiff.java:74) at org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.compareAgainstEmptyState(EmptyNodeState.java:161) at org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:434) at org.apache.jackrabbit.oak.plugins.segment.Compactor$CompactDiff.diff(Compactor.java:214) at org.apache.jackrabbit.oak.plugins.segment.Compactor$CompactDiff.childNodeAdded(Compactor.java:263) at org.apache.jackrabbit.oak.plugins.segment.CancelableDiff.childNodeAdded(CancelableDiff.java:74) at org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.compareAgainstEmptyState(EmptyNodeState.java:161) at org.apache.jackrabbit.oak.plugins.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:434) at org.apache.jackrabbit.oak.plugins.segment.Compactor$CompactDiff.diff(Compactor.java:214) at org.apache.jackrabbit.oak.plugins.segment.Compactor$CompactDiff.childNodeAdded(Compactor.java:263) at org.apache.jackrabbit.oak.plugins.segment.CancelableDiff.childNodeAdded(CancelableDiff.java:74)
Entorno
AEM 6.x
Causa
Se muestra SegmentNotFoundException cuando un segmento no está presente mientras la compactación intenta leer el nodo. Puede haber diferentes causas de fondo para esto:
- El segmento se ha eliminado mediante una intervención manual (por ejemplo, rm -rf /).
- La colección de residuos de revisión ha eliminado el segmento.
- El segmento no se puede encontrar debido a algún error en el código.
En caso de que el problema lo cause la colección de residuos de la corrección (Punto 2), asegúrese de que la compactación en línea esté desactivada para evitar que otros nodos se dañen.
Resolución
Existen múltiples procedimientos que podemos seguir para resolver la situación y completar la compactación sin conexión con éxito.
Importante: Realice una copia de seguridad completa de su repositorio antes de seguir los siguientes pasos.
A. Vuelva a la última buena revisión conocida del almacén de segmentos.
El modo de ejecución de la verificación de oak-run puede ser usado para determinar la última corrección correcta conocida de un almacén de segmentos. Esto puede ser usado para revertir manualmente un almacén de segmentos dañado a su última corrección correcta.
Este proceso retrocederá los datos en el sistema a un punto anterior en el tiempo. Si desea evitar perder los cambios en su sistema, puede probar la opción B a continuación.
Para realizar la comprobación y la restauración:
-
-
Detener AEM.
-
Ejecute el comando:
java -jar oak-run-*.jar check --bin=-1 crx-quickstart/repository/segmentstore/
Este comando busca hacia atrás en las correcciones hasta que encuentra una coherente:
14:00:30.783 [main] INFO o.a.j.o.p.s.f.t.ConsistencyChecker - Found latest good revision afdb922d-ba53-4a1b-aa1b-1cb044b535cf:234880
(En caso de que el ConsistencyChecker falle, vaya a la siguiente sección).
-
Revertir el repositorio a esta corrección a través de la edición.
/crx-quickstart/repository/segmentstore/journal.log.
Borre todas las líneas después de la línea que contiene la última corrección correcta. Si desea saber en qué fecha y hora está revirtiendo el repositorio, ejecute este comando en la carpeta segmentstore (reemplace afdb922d-ba53-4a1b-aa1b-1cb044b535cf con la última corrección correcta en su journal.log):
find . -type f -name "data*.tar" -exec sh -c "tar -tvf {} |grep afdb922d-ba53-4a1b-aa1b-1cb044b535cf" \; -print
El resultado le mostrará una fecha y hora aproximada de esa corrección.
-
Eliminar todo ./crx-quickstart/repository/segmentstore/*.bak files.
-
Si utiliza AEM 6.0, descargue la versión oak-run que coincida con lo que está instalado en AEM para los pasos restantes. Descárguelo desde aquí http://repo1.maven.org/maven2/org/apache/jackrabbit/oak-run/.
-
Llevar a cabo la limpieza de los puntos de comprobación para eliminar los puntos de comprobación huérfanos:
java -jar oak-run-*.jar checkpoints ./crx-quickstart/repository/segmentstore rm-unreferenced.
-
Finalmente, compacte el repositorio:
java -jar oak-run-*.jar compact ./crx-quickstart/repository/segmentstore/
B. Elimine manualmente los nodos dañados.
En AEM, las configuraciones de TarMK sin FileDatastore configurado y situaciones en las que hay daño en los binarios, puede hacer lo siguiente.
El siguiente procedimiento está destinado a los usuarios avanzados. Cuando elimine los nodos dañados, asegúrese de que no son nodos del sistema (como /home, /jcr:system, etc.). O si son nodos del sistema, entonces necesita asegurarse de que puede restaurarlos. Por favor, consulte con el equipo de Atención al Cliente de AEM para obtener ayuda con los pasos documentados aquí si no está seguro.
-
Detener AEM.
-
Use la consola Oak run y cargue el script groovy childCount para identificar los nodos dañados en el almacén de segmentos:
Cargue la consola oak-run:
java -jar oak-run-*.jar console crx-quickstart/repository/segmentstore
Ejecute los dos comandos siguientes en el contenedor para cargar el script y ejecutarlo:
:load https://gist.githubusercontent.com/stillalex/e7067bcb86c89bef66c8/raw/d7a5a9b839c3bb0ae5840252022f871fd38374d3/childCount.groovy
countNodes(session.workingNode)
Esto otorga como resultado la siguiente salida que indica la ruta al nodo o nodos dañados:
21:21:42.029 [main] ERROR o.a.j.o.p.segment.SegmentTracker - Segment not found: 63ae05a4-b506-445c-baa2-cfa1b13b6e2f. Creation date delta is 3 ms.
warning unable to read node /content/dam/test.txt/jcr:content/renditions/original/jcr:contentEn algunos casos el problema está vinculado a propiedades binarias y el script groovy childCount no puede localizar ningún nodo dañado. En estos casos, puede utilizar el siguiente comando que leerá los primeros 1024 bytes por cada binario encontrado durante la travesía (tenga en cuenta que este comando será más lento y solo debe utilizarse cuando el anterior no devuelva los resultados esperados):
countNodes(session.workingNode,true)
-
Elimine todos los nodos dañados identificados que aparecen en la salida del último comando usando rmNodes.groovy
Cargue la consola oak-run:
java -jar oak-run-*.jar console crx-quickstart/repository/segmentstore
Cargue el script groovy:
:load https://gist.githubusercontent.com/stillalex/43c49af065e3dd1fd5bf/raw/9e726a59f75b46e7b474f7ac763b0888d5a3f0c3/rmNode.groovy
Ejecute el comando rmNode para eliminar el nodo dañado, reemplace /path/to/corrupt/node con la ruta al nodo dañado que necesita eliminar.
rmNode(session, "/path/to/corrupt/node")
Donde la ruta del nodo dañado es la ruta obtenida en el paso 2, por ejemplo: "/content/dam/test.txt/jcr:content/renditions/original/jcr:content/"
Nota:Cuando utilice oak-run.jar versión 1.6.13 y superiores, establezca el parámetro --read-write JVM si se encuentra con un error como:
/> rmNode(session,"/path/to/corrupt/node")
Removing node /path/to/corrupt/node
ERROR java.lang.UnsupportedOperationException:
Cannot write to read-only store
at org.apache.jackrabbit.oak.segment.SegmentWriterBuilder$1.execute (SegmentWriterBuilder.java:171)
at org.apache.jackrabbit.oak.segment.SegmentWriter.writeNode (SegmentWriter.java:318)
at org.apache.jackrabbit.oak.segment.SegmentNodeBuilder.getNodeState (SegmentNodeBuilder.java:111)
at org.apache.jackrabbit.oak.segment.SegmentNodeStore$Commit.<init> (SegmentNodeStore.java:581)
at org.apache.jackrabbit.oak.segment.SegmentNodeStore.merge (SegmentNodeStore.java:333)
at org.apache.jackrabbit.oak.spi.state.NodeStore$merge.call (Unknown Source)
at groovysh_evaluate.rmNode (groovysh_evaluate:11) -
Repita el paso 3 con todos los nodos encontrados en el paso 2.
Este comando rmNode de arriba debería devolver "true" con la ruta dañada, lo que significa que la borró. Asegúrese de que estas tres rutas dañadas se eliminen ejecutando de nuevo el comando rmNode en esas rutas. La próxima vez que se ejecute, debería devolver "false".
Si todavía ve que los mismos caminos están en el repositorio, entonces use la versión parcheada de oak-run jar, es decir, oak-run-1.2.18-NPR-17596
¿Qué hace la versión parcheada de Oak run Jar?
Esta versión de jar salta binarios ilegibles en compactación, y los reemplaza con binarios de 0 bytes y registra la excepción y la ruta en syserr. Un repositorio así compactado debería pasar la comprobación de oak-run y el script de recuento de nodos, y usted también debería ser capaz de compactarlo de nuevo usando un oak-run sin parche.
-
Realice una limpieza de puntos de comprobación enumerando los puntos utilizando la siguiente lista. Si hay más de un punto de comprobación, entonces límpielos:
nohup java -Xmx4096m -jar oak-run-1.2.18.jar checkpoints /app/AEM6/author/crx-quickstart/repository/segmentstore rm-all>>nohup.out &
-
Ejecutar compactación sin conexión. Si no sabe cómo ejecutar la compactación sin conexión, consulte este documento.
-
Inicie el servidor y espere a que finalice la indexación.