Come eseguire il debug di SegmentNotFoundException quando il problema è segnalato in AEM 6.x

Descrizione

Come eseguire il debug di SegmentNotFoundException quando il problema è segnalato in AEM 6.x

A SegmentNotFoundException nel registro degli errori indica che un segmento non è più presente, anche se qualcuno tenta comunque di accedervi. Le cause principali sono sostanzialmente tre: il segmento è stato rimosso con un intervento manuale (ad es. rm -rf /), il segmento è stato rimosso dalla revisione della raccolta degli oggetti inattivi o il segmento non può essere trovato a causa di alcuni bug nel codice.

Ci potrebbe essere un'eccezione come il seguente potrebbe essere visto nei log:

org.apache.jackrabbit.oak.segment.SegmentNotFoundException: Segment d2c720c4-c146-4ab1-ac37-542aad93c33f not found at
org.apache.jackrabbit.oak.segment.file.FileStore$8.call(FileStore.java:602) at
org.apache.jackrabbit.oak.segment.file.FileStore$8.call(FileStore.java:542) at
org.apache.jackrabbit.oak.segment.SegmentCache.getSegment(SegmentCache.java:95) at
org.apache.jackrabbit.oak.segment.file.FileStore.readSegment(FileStore.java:542) at
org.apache.jackrabbit.oak.segment.SegmentId.getSegment(SegmentId.java:125) at org.apache.jackrabbit.oak.segment.Record.getSegment(Record.java:70) at
org.apache.jackrabbit.oak.segment.MapRecord.compare(MapRecord.java:424) at org.apache.jackrabbit.oak.segment.MapRecord.compare(MapRecord.java:433) at
org.apache.jackrabbit.oak.segment.MapRecord.compare(MapRecord.java:391) at
org.apache.jackrabbit.oak.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:608) at
org.apache.jackrabbit.oak.spi.commit.EditorDiff.childNodeChanged(EditorDiff.java:148) at
org.apache.jackrabbit.oak.segment.MapRecord$3.childNodeChanged(MapRecord.java:442) at
org.apache.jackrabbit.oak.segment.MapRecord.compare(MapRecord.java:490) at org.apache.jackrabbit.oak.segment.MapRecord.compare(MapRecord.java:433) at
org.apache.jackrabbit.oak.segment.SegmentNodeState.compareAgainstBaseState(SegmentNodeState.java:608) at
org.apache.jackrabbit.oak.spi.commit.EditorDiff.process(EditorDiff.java:52) at
org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate.updateIndex(AsyncIndexUpdate.java:695) at
org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate.runWhenPermitted(AsyncIndexUpdate.java:543) at
org.apache.jackrabbit.oak.plugins.index.AsyncIndexUpdate.run(AsyncIndexUpdate.java:402) at
org.apache.sling.commons.scheduler.impl.QuartzJobExecutor.execute(QuartzJobExecutor.java:118) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)

Risoluzione

Ci sono 2 approcci che possiamo seguire per risolvere il problema e rimuovere le incongruenze nell'archivio descritto di seguito nelle sezioni A e B.

A. Ripristinare l’ultima revisione valida nota dell’archivio segmenti.

In primo luogo, dovremmo utilizzare il oak run strumento che è un jar1 eseguibile che contiene tutto il necessario per un semplice Oak installazione ed esecuzione oakoperazioni correlate.

La modalità di esecuzione del controllo di oak-run può essere utilizzato per determinare l'ultima revisione valida nota di un archivio segmenti.  Questa procedura può essere utilizzata per ripristinare manualmente un archivio segmenti corrotto alla sua ultima revisione valida.

Attenzione: Questo processo riporta i dati nel sistema a un punto precedente.  Se vuoi evitare di perdere le modifiche nel sistema, puoi provare l’opzione B riportata di seguito.

Per eseguire il controllo e il ripristino:

  1. Scaricare una versione di oak-run corrisponde al tuo oak versione di base da https://mvnrepository.com/artifact/org.apache.jackrabbit/oak-run

  2. Per ripristinare un archivio di segmenti corrotto alla sua ultima modifica dello stato buono nella directory di lavoro di CQ (quella contenente il crx-quickstartfolder) e backup di tutti i file in ./crx-quickstart/repository/segmentstore/.

  3. Esegui la verifica di coerenza,

    java -Xmx6000m -jar oak-run-\*.jar check --bin=-1 /path/to/crx-quickstart/repository/segmentstore
    

    Questa operazione contente di eseguire una ricerca all’indietro attraverso le revisioni fino a trovarne una coerente:

    Cerca un messaggio simile al seguente:

    main INFO o.a.j.o.p.s.f.t.ConsistencyChecker - Found latest good revision afdb922d-ba53-4a1b-aa1b-1cb044b535cf:234880
    
  4. Ripristina l’archivio a questa revisione modificando ./crx-quickstart/repository/segmentstore/journal.log ed eliminando tutte le righe successive a quella contenente l’ultima revisione valida.

  5. Rimuovi tutti i file ./crx-quickstart/repository/segmentstore/\*.bak.

  6. Esegui la pulizia dei checkpoint per rimuovere i checkpoint orfani con il seguente comando:

    java -Xmx6000m -jar oak-run-\*.jar checkpoints /path/to/crx-quickstart/repository/segmentstore rm-unreferenced
    
  7. Infine, compatta l’archivio:

    java -Xmx6000m -jar oak-run-\*.jar compact /path/to/crx-quickstart/repository/segmentstore/
    

Ci possono essere casi in cui il controllo di esecuzione oak non è in grado di trovare la buona revisione e otteniamo "ConsistencyChecker - Non è stata trovata una buona revisione" durante l'esecuzione del comando di controllo.

Come correggere la corruzione quando si incontra "ConsistencyChecker - Non è stata trovata una buona revisione" sul controllo di coerenza

B. Rimuovere manualmente i nodi danneggiati.

In AEM, le impostazioni TarMK senza FileDatastore configurato e le situazioni in cui la corruzione è nei binari, puoi fare quanto segue.

*Attenzionen:* La procedura riportata di seguito è destinata agli utenti che utilizzano energia elettrica. Quando si eliminano i nodi corrotti è necessario assicurarsi che non siano nodi di sistema (ad esempio /home, /jcr:system, ecc.). Se si tratta di nodi di sistema, è necessario assicurarsi di poterli ripristinare.  In caso di dubbi, rivolgiti al team di assistenza clienti AEM per ricevere supporto in merito ai passaggi documentati in questa sezione.

  1. Interrompi AEM.

  2. Utilizza la Oak run e carica la childCount groovy script per identificare i nodi corrotti nell’archivio segmenti:

    Carica il oak-run shell della console:

    java -jar oak-run-\*.jar console crx-quickstart/repository/segmentstore
    

    Esegui i due comandi seguenti nella shell per caricare lo script ed eseguirlo:

    :load https://gist.githubusercontent.com/stillalex/e7067bcb86c89bef66c8/raw/d7a5a9b839c3bb0ae5840252022f871fd38374d3/childCount.groovy
    countNodes(session.workingNode)
    

    Questo si traduce nel seguente output che indica il percorso dei nodi danneggiati:

    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:content
    

    In alcuni casi il problema è collegato a proprietà binarie e alla childCount groovy Impossibile individuare nodi danneggiati.  In questi casi è possibile utilizzare il seguente comando che leggerà i primi 1024 byte per ogni binario rilevato durante l'attraversamento (Nota che questo comando sarà più lento e dovrebbe essere utilizzato solo quando quello sopra non restituisce i risultati previsti):

    countNodes(session.workingNode,true)
    
  3. Rimuovi tutti i nodi danneggiati identificati che sono elencati nell’output dell’ultimo comando tramite rmNodes.groovy

    Carica il oak-run shell della console utilizzando il comando seguente:

    java -jar oak-run-\*.jar console crx-quickstart/repository/segmentstore
    

    Carica lo script di Groovy:

    :load
    https://gist.githubusercontent.com/stillalex/43c49af065e3dd1fd5bf/raw/9e726a59f75b46e7b474f7ac763b0888d5a3f0c3/rmNode.groovy
    

    Esegui il comando rmNode per rimuovere il nodo corrotto e sostituisci /path/to/corrupt/node con il percorso del nodo corrotto da rimuovere.

    rmNode(session, "/path/to/corrupt/node")
    

    Dove il percorso del nodo corrotto è il percorso ottenuto al passaggio 2, ad esempio: /content/dam/test.txt/jcr:content/renditions/original/jcr:content/

    Nota: Quando utilizzi oak-run.jar versione 1.6.13 e successive, set --read-write Parametro JVM se si verifica un errore come:

    / 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)
    
  4. Ripeti il passaggio 3 per tutti i nodi individuati nel passaggio 2.

    Il comando rmNode di cui sopra deve restituire true per il percorso corrotto, che indica la corretta eliminazione. Assicurati che questi tre percorsi corrotti trovati vengano eliminati eseguendo nuovamente il comando rmNode su quei percorsi. L’esecuzione successiva deve restituire false.

    Se vedi ancora che gli stessi percorsi sono presenti nell’archivio, utilizza la versione patched di oak-run vaso oak-run-1.2.18-NPR-17596

    Cosa fa la versione con patch di Oak esegui Jar Do?

    Questa versione del file jar ignora i file binari illeggibili durante la compattazione sostituendoli con binari a 0 byte e registrando l’eccezione e il percorso di syserr. L’archivio così compattato dovrebbe quindi passare oak-run controlla, lo script di conteggio dei nodi e dovresti anche essere in grado di compattarlo di nuovo utilizzando un oak-run.

  5. Esegui una pulizia dei punti di controllo elencandoli tramite il comando seguente. Se sono presenti più punti di controllo, puliscili:

    nohup java -Xmx4096m -jar oak-run-1.2.18.jar checkpoints /app/AEM6/author/crx-quickstart/repository/segmentstore rm-allnohup.out &
    
  6. Esegui una compattazione offline.  Se non sai come eseguire la compattazione offline, vedi qui.

  7. Avvia il server e attendi il completamento dell’indicizzazione.

In questa pagina