SegmentNotFoundException och IllegalArgumentException
Det går inte att köra en offlinekomprimering med SegmentNotFoundException eller IllegalArgumentException. I den här artikeln beskrivs olika sätt att åtgärda felen och slutföra offlinekompakationen. Innan du fortsätter bör du dock göra en fullständig säkerhetskopiering av databasen.
Beskrivning description
Miljö
Adobe Experience Manager (AEM)
Utgåva
Scenario 1
Det går inte att köra en offlinekomprimering med SegmentNotFoundException när det finns integritetsproblem i databasen.
Du observerar SegmentNotFoundException i AEM loggfiler och AEM fungerar inte som förväntat.
Scenario 2
Det går inte att köra en offlinekomprimering med SegmentNotFoundException när det finns integritetsproblem i databasen.
En stackspårning som liknar den nedan visas i loggarna:
13:51:21.523 [ main] ERROR o.a.j.o.p.segment.SegmentTracker - Segment not found: 4d139bc4-150c-4f0a-b82a-4867593098a. Creation date delta is 4 ms.
org.apache.jackrabbit.oak.plugins.segment.SegmentNotFoundException: Segment 4d139bc4-150c-4f0a-b82a-4867593098a 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-4867593098a 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)
...
Scenario 3
Det går inte att köra en offlinekompaktion med IllegalArgument-undantag när databasens integritet har ändrats.
En stackspårning som liknar den nedan visas i loggarna:
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)
Upplösning resolution
Det finns flera procedurer som vi kan följa för att lösa situationen och slutföra offlinekompaktionen.
Viktigt! Utför en fullständig säkerhetskopiering av databasen innan du följer stegen nedan.
A. Återgå till den senast fungerande versionen av segmentbutiken.
Kontrollkörningsläget för ekakning kan användas för att avgöra den senaste fungerande versionen av en segmentbutik.
Den kan användas för att manuellt återställa en skadad segmentbutik till den senaste bra versionen.
Varning! Den här processen återställer data i systemet till en tidigare tidpunkt.
Om du inte vill förlora ändringar i systemet kan du prova alternativ B nedan i stället.
Så här utför du kontrollen och återställningen:
-
Hämta
oak-runjar-filen här https://repo1.maven.org/maven2/org/apache/jackrabbit/oak-run/. -
Sluta AEM.
-
Kör det här kommandot:
java -jar oak-run-*.jar check --bin=-1 crx-quickstart/repository/segmentstore/Det här kommandot söker bakåt i ändringarna tills det hittar ett konsekvent:
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(Om ConsistencyChecker misslyckas går du till nästa avsnitt.)
-
Återställ databasen till den här versionen genom att redigera:
/crx-quickstart/repository/segmentstore/journal.logTa bort alla rader efter raden som innehåller den senaste fungerande ändringen.
Om du vill ta reda på vilket datum och vilken tid du återställer databasen till kör du det här kommandot i mappen
segmentstore(ersätt afdb922d-ba53-4a1b-aa1b-1cb044b535cf med den senaste bra versionen ijournal.log):find . -type f -name "data*.tar" -exec sh -c "tar -tvf {} |grep afdb922d-ba53-4a1b-aa1b-1cb044b535cf" \; -printUtdata skulle visa ungefärligt datum och ungefärlig tid för den ändringen.
-
Ta bort alla
./crx-quickstart/repository/segmentstore/*.bak files. -
Om du använder AEM 6.0 kan du hämta den körbara versionen som matchar den som är installerad i AEM för de återstående stegen.
Hämta den här https://repo1.maven.org/maven2/org/apache/jackrabbit/oak-run/.
-
Kör rensning av kontrollpunkter för att ta bort överblivna kontrollpunkter:
java -jar oak-run-*.jar checkpoints ./crx-quickstart/repository/segmentstore rm-unreferenced -
Komprimera slutligen databasen:
java -jar oak-run-*.jar compact ./crx-quickstart/repository/segmentstore/
B. Ta bort skadade noder manuellt.
I AEM inställningar för tarMK utan konfigurerad FileDatastore och situationer där skador förekommer i binärfilerna kan du göra följande.
*Varning:*Nedanstående procedur är avsedd för avancerade användare.
När du tar bort skadade noder måste du se till att de inte är systemnoder (till exempel /home, /jcr:system).
Eller om de är systemnoder måste du se till att du kan återställa dem.
Kontakta AEM kundtjänst om du är osäker.
-
Sluta AEM.
-
Använd Oak Run Console och läs in gruppskriptet
childCountför att identifiera skadade noder i segmentbutiken:Läs in konsolens ekar-gränssnitt:
java -jar oak-run-*.jar console crx-quickstart/repository/segmentstoreKör de två kommandona nedan i gränssnittet för att läsa in skriptet och köra det:
:loadhttps://gist.githubusercontent.com/stillalex/e7067bcb86c89bef66c8/raw/d7a5a9b839c3bb0ae5840252022f871fd38374d3/childCount.groovycountNodes(session.workingNode)Detta resulterar i följande utdata som anger sökvägen till de skadade noderna:
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:contentI vissa fall är problemet länkat till binära egenskaper och gruppskriptet
childCountkan inte hitta några skadade noder.I dessa fall kan du använda följande kommando som läser de första 1024 byten för varje binär fil som påträffas under genomgången (observera att det här kommandot blir långsammare och bör bara användas när ovanstående inte returnerar det förväntade resultatet):
countNodes(session.workingNode,true) -
Ta bort alla identifierade skadade noder i utdata från det senaste kommandot med
rmNodes.groovy.Läs in konsolens ekar-gränssnitt:
java -jar oak-run-*.jar console crx-quickstart/repository/segmentstoreLäs in grupperingsskriptet:
:loadhttps://gist.githubusercontent.com/stillalex/43c49af065e3dd1fd5bf/raw/9e726a59f75b46e7b474f7ac763b0888d5a3f0c3/rmNode.groovyKör kommandot
rmNodeför att ta bort den skadade noden och ersätt/path/to/corrupt/nodemed sökvägen till den skadade noden som du måste ta bort.rmNode(session, "/path/to/corrupt/node")Där den skadade nodsökvägen är sökvägen som fås i steg 2, till exempel:
/content/dam/test.txt/jcr:content/renditions/original/jcr:content/.
Obs! När du använderoak-run.jarversion 1.6.13 och senare anger du JVM-parametern--read-writeom du stöter på ett fel som: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) -
Upprepa steg 3 för alla noder som finns i steg 2.
Det här
rmNode-kommandot ovan ska returnera true för den skadade sökvägen, vilket betyder att den har tagits bort.Kontrollera att de hittade tre skadade sökvägar tas bort genom att köra kommandot
rmNodeigen på de sökvägarna.Nästa körning ska returnera
false.Om du fortfarande ser att samma sökvägar finns i databasen använder du den patchade versionen av ekkörningsbehållaren (dvs. oak-run-1.2.18-NPR-17596).
Vad gör patchad version av ekkörningsbehållare?
I den här versionen av jar hoppas oläsbara binärfiler över vid komprimering, så att de ersätts med binärfiler på 0 byte och undantag och sökväg till systemservern loggas.
Databasen som på så sätt kompileras bör sedan skicka en körkontroll, nodräkningsskriptet och du bör även kunna komprimera den igen med en icke-patchad ekkörning.
-
Utför en rensning av kontrollpunkter genom att lista kontrollpunkter med hjälp av nedan.
Om det finns fler än en kontrollpunkt ska du rensa upp dem:
nohup java -Xmx4096m -jar oak-run-1.2.18.jar checkpoints /app/AEM6/author/crx-quickstart/repository/segmentstore rm-all>>nohup.out & -
Kör en offlinekomprimering.
Om du inte vet hur du kör offlinekomprimering läser du Oak offlinekomprimeringsinstruktioner för GitHub Gist.
-
Starta servern och vänta tills indexeringen är klar.
Orsak
Ett SegmentNotFoundException returneras när ett segment inte finns medan komprimeringen försöker läsa noden.
Det kan finnas olika rotorsaker till detta:
- Segmentet har tagits bort genom manuell åtgärd (till exempel: rm -rf /).
- Segmentet har tagits bort av skräpinsamlingen för revision.
- Det går inte att hitta segmentet på grund av ett fel i koden.
Om problemet orsakas av skräpinsamling för revision (orsak nr 2) kontrollerar du att onlinekomprimering är inaktiverat för att undvika att fler noder skadas.