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

Questo articolo spiega come eseguire il debug di SegmentNotFoundException quando viene segnalato un problema in AEM 6.x ripristinando l’ultima revisione valida nota dell’archivio segmenti.

Descrizione description

Ambiente

Experience Manager 6.x

Problema/Sintomi

Il registro degli errori mostra un’eccezione SegmentNotFound, come nell’esempio seguente:

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 resolution

Passaggi da risolvere

Esistono due approcci per risolvere il problema e rimuovere le incoerenze nell’archivio

Ripristina l’ultima revisione valida nota dell’archivio segmenti.

Innanzitutto, utilizza lo strumento oak run, un jar eseguibile[ 1] che contiene tutto il necessario per una semplice installazione Oak e per l’esecuzione di operazioni relative a oak.

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

Attenzione: questo processo consente di eseguire il rollback dei dati del sistema a un momento precedente.  Se desideri evitare di perdere le modifiche nel sistema, puoi provare l’opzione B riportata di seguito.

Per eseguire il controllo e il ripristino:

  1. Scarica una versione di oak-run che corrisponde alla versione principale di oak attualmente in uso da https://mvnrepository.com/artifact/org.apache.jackrabbit/oak-run

  2. Per ripristinare un archivio segmenti danneggiato al suo ultimo stato integro, passa alla directory di lavoro di CQ (quella contenente la cartella crx-quickstartfolder) ed esegui il 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:

    code language-none
    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 eliminazione di tutte le righe successive a quella contenente l’ultima revisione valida.

  5. Rimuovi tutto./crx-quickstart/repository/segmentstore/*.bak.

  6. Esegui la pulizia dei punti di controllo per rimuovere quelli orfani utilizzando il comando seguente:

    code language-none
    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/

In alcuni casi, durante l’esecuzione del comando di controllo, il controllo dell’esecuzione oak non è in grado di trovare la revisione corretta e viene visualizzato "ConsistencyChecker - Nessuna revisione valida trovata".

Come correggere il danneggiamento quando si verifica l’errore "ConsistencyChecker - Nessuna revisione valida trovata" nella verifica di coerenza

Rimuovere manualmente i nodi danneggiati.

Puoi eseguire le seguenti operazioni nelle impostazioni AEM, TarMK senza FileDatastore configurato e nelle situazioni in cui i file binari sono danneggiati.

Attenzione: la procedura seguente è destinata agli utenti avanzati.  Quando si eliminano i nodi corrotti, è necessario assicurarsi che non siano nodi di sistema (ad esempio /home, /jcr:system e così via).  Se si tratta di nodi di sistema, è necessario assicurarsi di poterli ripristinare.  In caso di dubbi, rivolgiti al team di assistenza clienti dell’AEM per ricevere assistenza sui passaggi documentati in questa sezione.

  1. Interrompi AEM.

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

    Carica la shell della console Oak run:

    code language-none
    java -jar oak-run-*.jar console crx-quickstart/repository/segmentstore
    

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

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

    Questo determina il seguente output che indica il percorso dei nodi danneggiati:

    code language-none
    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 lo script di Groovy childCount non è in grado di individuare nodi danneggiati.  In questi casi, puoi utilizzare il seguente comando, che leggerà i primi 1024 byte per ogni file binario rilevato durante l’attraversamento. Tieni presente che questo comando sarà più lento e dovrebbe essere utilizzato solo quando quello precedente non restituisce i risultati previsti:

    code language-none
    countNodes(session.workingNode,true)
    
  3. Rimuovi tutti i nodi danneggiati identificati elencati nell’output dell’ultimo comando utilizzando rmNodes.groovy Carica la shell della console oak-run utilizzando il comando seguente:

    code language-none
    java -jar oak-run-*.jar console crx-quickstart/repository/segmentstore
    

    Carica lo script di Groovy:

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

    Eseguire il comando rmNode per rimuovere il nodo corrotto, sostituire /path/to/danneggiato/node con il percorso del nodo corrotto da rimuovere.

    code language-none
    rmNode(session, "/path/to/corrupt/node")
    

    dove il percorso del nodo corrotto è il percorso ottenuto nel 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, imposta il parametro JVM in lettura/scrittura se riscontri un errore, ad esempio:

    code language-none
    / 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 trovati nel passaggio 2

    Il comando rmNode di cui sopra deve restituire true per il percorso corrotto, che significa che è stato eliminato. Assicurati che questi tre percorsi danneggiati vengano eliminati eseguendo nuovamente il comando rmNode su di essi. L’esecuzione successiva deve restituire false.
    Se noti che gli stessi percorsi sono ancora presenti nell’archivio, utilizza versione aggiornata del file jar oak-run, ovvero oak-run-1.2.18-NPR-17596. 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 compattato risultante dovrebbe quindi superare il controllo di oak-run e lo script di conteggio dei nodi, nonché essere in grado di compattarlo nuovamente utilizzando un oak-run non aggiornato.

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

    code language-none
    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, consulta qui.

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

Causa

Un’eccezione SegmentNotFoundException nel registro degli errori indica che un segmento non è più presente, anche se apparentemente qualcuno tenta di accedervi ancora. Le cause principali sono tre: il segmento è stato rimosso con un intervento manuale (ad esempio rm -rf /), il segmento è stato rimosso tramite la raccolta di oggetti inattivi di revisione o il segmento non è stato trovato a causa di un bug nel codice.

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f