Hoe te om SegmentNotFoundException te zuiveren wanneer de Uitgave in AEM 6.x wordt gemeld
Dit artikel helpt u begrijpen hoe te om SegmentNotFoundException te zuiveren wanneer de Uitgave in AEM 6.x wordt gemeld door aan de laatste bekende goede revisie van de segmentopslag terug te keren.
Beschrijving description
Milieu
Experience Manager 6.x
Uitgave/Symptomen
Het logboek van de fout toont een uitzondering SegmentNotFound, zoals in het volgende voorbeeld:
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)
Resolutie resolution
Stappen om op te lossen
Er zijn twee manieren om het probleem op te lossen en de inconsistenties in de repository te verwijderen
keert aan de laatste bekende goede revisie van de segmentopslag terug.
Eerste, gebruik het hulpmiddel van de eik looppas, dat een runnable jar [ 1 ] is die alles bevat u voor een eenvoudige installatie van Oak en het uitvoeren van op eik betrekking hebbende verrichtingen wenst.
De wijze van de controlelooppas van eiken-looppas kan worden gebruikt om de laatste bekende goede revisie van een segmentopslag te bepalen. Dat kan worden gebruikt om een corrupte segmentopslag aan zijn recentste goede revisie manueel terug te keren.
Voorzichtigheid: Dit proces zal de gegevens in het systeem aan een vorig punt in tijd terugdraaien. Als u wilt vermijden verliesgevend veranderingen in uw systeem dan kunt u optie B in plaats daarvan proberen.
De controle en het terugzetten uitvoeren:
-
Download een versie van eak-looppas die uw eak kernversie van https://mvnrepository.com/artifact/org.apache.jackrabbit/oak-run aanpast
-
Als u een beschadigde segmentopslag wilt terugzetten naar de meest recente goede staat, wijzigt u deze in de werkmap van CQ (de map die de crx-quickstartfolder bevat) en maakt u een back-up van alle bestanden in ./crx-quickstart/repository/segmentstore/.
-
Voer de consistentiecontrole uit,
java -Xmx6000m -jar oak-run-*.jar check —bin=-1 /path/to/crx-quickstart/repository/segmentstore
Dit doorzoekt achterwaarts door de revisies tot het verenigbare vindt:
Kijk hieronder naar berichten:
code language-none main INFO o.a.j.o.p.s.f.t.ConsistencyChecker - Found latest good revision afdb922d-ba53-4a1b-aa1b-1cb044b535cf:234880 -
Herstel de repository naar deze revisie door te bewerken./crx-quickstart/repository/segmentstore/journal.log en alle regels verwijderen na de regel met de laatste goede revisie.
-
Alles verwijderen./crx-quickstart/repository/segmentstore/*.bak-bestanden.
-
Opschonen van controlepunten uitvoeren om zwevende controlepunten te verwijderen met de volgende opdracht:
code language-none java -Xmx6000m -jar oak-run-*.jar checkpoints /path/to/crx-quickstart/repository/segmentstore rm-unreferenced -
Ten slotte compacte de gegevensopslagruimte:
java -Xmx6000m -jar oak-run-*.jar compact /path/to/crx-quickstart/repository/segmentstore/
er zouden gevallen kunnen zijn wanneer de eiken looppascontrole niet de goede revisie kan vinden, en wij "ConsistencyChecker - Geen goede gevonden revisie"terwijl het runnen van het controlebevel krijgen.
hoe te om corruptie te bevestigen wanneer het ontmoeten "ConsistencyChecker - Geen goede die revisie"op consistentiecontrole wordt gevonden
verwijder manueel bedorven knopen.
U kunt het volgende in AEM doen, montages TarMK zonder gevormde FileDatastore, en situaties waar de corruptie in de binaire getallen is.
Voorzichtigheid : De hieronder procedure is voorgenomen voor gevorderde gebruikers. Wanneer u corrupte knooppunten verwijdert, moet u ervoor zorgen dat deze geen systeemknooppunten zijn (zoals /home, /jcr:system, enz.). Als het systeemknooppunten zijn, moet u ervoor zorgen dat u ze kunt herstellen. Raadpleeg het team van AEM klantenservice voor hulp met de hier beschreven stappen als u niet zeker weet.
-
Stop AEM.
-
Gebruik de Oak run console en laad het childCount groovy script om de corrupte knopen in de segmentopslag te identificeren:
Laad de oak-run console shell:
code language-none java -jar oak-run-*.jar console crx-quickstart/repository/segmentstoreVoer de twee onderstaande opdrachten in de shell uit om het script te laden en uit te voeren:
code language-none :load https://gist.githubusercontent.com/stillalex/e7067bcb86c89bef66c8/raw/d7a5a9b839c3bb0ae5840252022f871fd38374d3/childCount.groovy countNodes(session.workingNode)Dit resulteert in de volgende uitvoer die het pad naar de beschadigde node(s) aangeeft:
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:contentIn sommige gevallen is de kwestie gekoppeld aan binaire eigenschappen en kan het onderliggendeCount-groepsscript geen beschadigde knooppunten vinden. In deze gevallen kunt u de volgende opdracht gebruiken, die de eerste 1024 bytes leest voor elk binair getal dat tijdens het doorlopen wordt aangetroffen (Let op: deze opdracht wordt langzamer en mag alleen worden gebruikt als de bovenstaande opdracht niet de verwachte resultaten retourneert):
code language-none countNodes(session.workingNode,true) -
Verwijder alle geïdentificeerde corrupte knopen die in de output van het laatste bevel worden vermeld gebruikend rmNodes.groovy
Laad de console-shell voor de eik met onderstaande opdracht:code language-none java -jar oak-run-*.jar console crx-quickstart/repository/segmentstoreHet groepscript laden:
code language-none :load https://gist.githubusercontent.com/stillalex/43c49af065e3dd1fd5bf/raw/9e726a59f75b46e7b474f7ac763b0888d5a3f0c3/rmNode.groovyVoer de opdracht rmNode uit om het beschadigde knooppunt te verwijderen. Vervang /path/to/corrupt/node door het pad naar het beschadigde knooppunt dat u moet verwijderen.
code language-none rmNode(session, "/path/to/corrupt/node")waarbij het corrupte knooppuntpad het pad is dat is verkregen in stap 2, bijvoorbeeld: "/content/dam/test.txt/jcr:content/renditions/original/jcr:content/"
Opmerking: bij gebruik van eikenrun.jar versie 1.6.13 en hoger, set —read-write JVM parameter als er een fout optreedt, zoals:
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) -
Herhaal stap 3 voor alle knooppunten die in stap 2 worden gevonden
Deze bovenstaande opdracht rmNode moet true retourneren voor het beschadigde pad, wat betekent dat het pad wordt verwijderd. Zorg ervoor dat deze gevonden drie beschadigde paden worden verwijderd door de opdracht rmNode voor die paden opnieuw uit te voeren. Vervolgens wordt de waarde false geretourneerd.
Als u ziet dat de zelfde wegen nog daar in bewaarplaats zijn, dan gebruik de patched versie van eak-in werking gestelde jar i.e. eak-looppas-1.2.18-NPR-17596 . Deze versie van jar slaat onleesbare binaire getallen bij compilatie over, die hen met 0 byte binaire getallen vervangen en de uitzondering en de weg aan syserr registreren. De resulterende gecomprimeerde opslagplaats zou dan controle in werking stellen oak, en het manuscript van de knooptelling moeten overgaan, en u zou het ook moeten kunnen opnieuw compacteren gebruikend een niet-gepatcheerde oak-looppas. -
Opschonen van controlepunten door hieronder controlepunten aan te bieden. Als er meer dan één controlepunt is, dan maak hen schoon:
code language-none nohup java -Xmx4096m -jar oak-run-1.2.18.jar checkpoints /app/AEM6/author/crx-quickstart/repository/segmentstore rm-allnohup.out -
Een offlinecompressie uitvoeren. Als u niet weet hoe te om off-line verbinding in werking te stellen dan hier ziet.
-
Start de server op te wachten tot de indexering is voltooid.
Oorzaak
Een SegmentNotFoundException in het foutenlogboek betekent een segment niet meer aanwezig is hoewel iemand blijkbaar probeert om tot het nog toegang te hebben. Er zijn grosso modo drie verschillende worteloorzaken voor dit: het segment is verwijderd door handinterventie (b.v. rm - rf /), het segment is verwijderd door de inzameling van de revisiehuisvuilinzameling of het segment kan niet wegens één of andere insect in de code worden gevonden.