SegmentNotFoundException in AEM-Protokollen und -Instanzen funktioniert nicht
Erfahren Sie, wie Sie das SegmentNotFoundException Problem in AEM-Protokollen und -Instanzen mithilfe der folgenden Schritte beheben können.
Hinweis: Führen Sie ein vollständiges Backup des Repositorys durch, bevor Sie die Schritte ausführen.
Beschreibung description
Umgebung
Adobe Experience Manager (AEM) 6.x
Problem/Symptome
SegmentNotFoundException in AEM-Protokolldateien, und AEM funktioniert nicht erwartungsgemäß.
Das Ausführen einer Offline-Komprimierung kann mit SegmentNotFoundException fehlschlagen, wenn im Repository Integritätsprobleme auftreten. Ein Stack Trace der dem folgenden ähnelt, finden Sie in den Protokollen:
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) ...
Das Ausführen einer Offline-Komprimierung kann mit IllegalArgument Ausnahme fehlschlagen, wenn im Repository Integritätsprobleme auftreten. Eine Stack Trace ähnlich der folgenden finden Sie in den Protokollen:
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)
Auflösung resolution
Erste Methode
-
Laden Sie die oak-run-JAR-Datei von org/apache/jackrabbit/oak-run.
-
Stoppen Sie AEM.
-
Führen Sie diesen Befehl aus:
java -jar oak-run-*.jar check --bin=-1 crx-quickstart/repository/segmentstore/Dieser Befehl durchsucht die Revisionen rückwärts, bis er einen konsistenten findet:
14:00:30.783 [ main] INFO o.a.j.o.p.s.f.t.ConsistencyChecker - Found latest good revision xxxx000x-ba53-4a1b-aa1b-0xx000x000xx:234880Hinweis: Falls der
ConsistencyCheckerfehlschlägt, fahren Sie mit dem nächsten Abschnitt fort. -
Setzen Sie das Repository auf diese Revision zurück, indem Sie den unten angegebenen Befehl bearbeiten.
/crx-quickstart/repository/segmentstore/journal.log.Löschen Sie alle Zeilen nach der Zeile, die die letzte zweifelsfrei funktionierende Revision enthält. Um herauszufinden, welches Datum und welche Uhrzeit auf das Repository zurückgesetzt werden müssen, führen Sie diesen Befehl im
segmentstoreaus (ersetzen Siexxxx000x-ba53-4a1b-aa1b-0xx000x000xximjournal.logdurch die letzte zweifelsfrei funktionierende Revision):find . -type f -name "data*.tar" -exec sh -c "tar -tvf {} |grep xxxx000x-ba53-4a1b-aa1b-0xx000x000xx" \; -printDie Ausgabe würde ein ungefähres Datum und eine ungefähre Uhrzeit dieser Revision anzeigen.
-
Alle
./crx-quickstart/repository/segmentstore/*.bak filesentfernen. -
Wenn AEM 6.0 verwendet wird, laden Sie die oak-run-Version, die mit der installierten Version in AEM übereinstimmt, für die restlichen Schritte herunter. Laden Sie sie von diesem Link herunter: org/apache/jackrabbit/oak-run.
-
Führen Sie die Checkpoint-Bereinigung aus, um verwaiste Checkpoints zu entfernen:
java -jar oak-run-*.jar checkpoints ./crx-quickstart/repository/segmentstore rm-unreferenced. -
Komprimieren Sie abschließend das Repository:
java -jar oak-run-*.jar compact ./crx-quickstart/repository/segmentstore/.
Zweite Methode
Entfernen Sie beschädigte Knoten manuell.
Führen Sie in AEM TarMK-Setups ohne konfigurierte FileDatastore und in Situationen, in denen die Binärdateien beschädigt sind, die folgenden Schritte aus:
Achtung: Die unten beschriebene Vorgehensweise ist für Power-User gedacht. Beim Löschen der beschädigten Knoten müssen Sie sicherstellen, dass es sich nicht um Systemknoten (wie /home, /jcr:system usw.) handelt. Oder wenn es sich um Systemknoten handelt, müssen Sie sicherstellen, dass Sie sie wiederherstellen können. Wenden Sie sich an das Team der AEM-Kundenunterstützung, um Unterstützung bei den hier beschriebenen Schritten zu erhalten, wenn Sie sich nicht sicher sind.
-
Stoppen Sie AEM.
-
Verwenden Sie die Oak-Ausführungskonsole und laden Sie das Skript „childCount groovy“, um die beschädigten Knoten im Segmentspeicher zu identifizieren:
-
Laden Sie die Oak-Run-Konsolen-Shell:
java -jar oak-run-*.jar console crx-quickstart/repository/segmentstore -
Führen Sie die beiden folgenden Befehle in der Shell aus, um das Skript zu laden und auszuführen:
: load https://gist.githubusercontent.com/stillalex/e7067bcb86c89bef66c8/raw/d7a5a9b839c3bb0ae5840252022f871fd38374d3/childCount.groovycountNodes(session.workingNode) -
Dies führt zur folgenden Ausgabe, die den Pfad zu den beschädigten Knoten angibt:
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 einigen Fällen hängt das Problem mit binären Eigenschaften zusammen und das
childCount groovykann keine beschädigten Knoten finden. In diesen Fällen können Sie stattdessen den folgenden Befehl verwenden, der die ersten 1024 Byte für jede während der Durchlaufphase aufgetretene Binärdatei liest.
(Beachten Sie, dass dieser Befehl langsamer ist und nur verwendet werden sollte, wenn die obige Lösung nicht die erwarteten Ergebnisse liefert):
countNodes(session.workingNode,true) - In einigen Fällen hängt das Problem mit binären Eigenschaften zusammen und das
-
-
Entfernen Sie mithilfe von
rmNodes.groovyalle identifizierten beschädigten Knoten, die in der Ausgabe des letzten Befehls aufgelistet sind.-
Laden Sie die Oak-Run-Konsolen-Shell:
java -jar oak-run-*.jar console crx-quickstart/repository/segmentstore -
Laden Sie das Skript „groovy“:
:load https://gist.githubusercontent.com/stillalex/43c49af065e3dd1fd5bf/raw/9e726a59f75b46e7b474f7ac763b0888d5a3f0c3/rmNode.groovy -
Führen Sie den Befehl
rmNodeaus, um den beschädigten Knoten zu entfernen, und ersetzen Sie/path/to/corrupt/nodedurch den Pfad zu dem beschädigten Knoten, den Sie entfernen möchten.rmNode(session, "/path/to/corrupt/node")Wobei der Pfad des beschädigten Knotens der Pfad ist, der in Schritt 2 ermittelt wurde, zum Beispiel:
"/content/dam/test.txt/jcr:content/renditions/original/jcr:content/"
Hinweis: Wenn Sie
oak-run.jarVersion 1.6.13 und höher verwenden, legen Sie--read-writeJVM-Parameter fest, wenn ein Fehler wie der folgende auftritt: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. (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) -
-
Wiederholen Sie Schritt 3 für alle in Schritt 2 gefundenen Knoten. Der obige
rmNodesollte für den beschädigten Pfad „true“ zurückgeben, was bedeutet, dass er ihn gelöscht hat. Stellen Sie sicher, dass die drei gefundenen beschädigten Pfade gelöscht werden, indem Sie denrmNode-Befehl für diese Pfade erneut ausführen. Bei der nächsten Ausführung sollte false zurückgegeben werden. Wenn die gleichen Pfade im Repository vorhanden sind, wird empfohlen, die gepatchte Version von oak-run jar zu verwenden, d. h.oak-run-1.2.18-NPR-00000.Was bewirkt die gepatchte Version von Oak run Jar?
Diese Version von JAR überspringt unlesbare Binärdateien bei der Komprimierung und ersetzt sie durch 0-Byte-Binärdateien und protokolliert die Ausnahme und den Pfad zu
syserr(Fehlermeldungsfenster). Das komprimierte Repository sollte dann die Oak-run-Prüfung, das Knotenzählungsskript, bestehen und auch in der Lage sein, die Komprimierung erneut mit einem nicht gepatchten Oak-run-Objekt durchzuführen. -
Führen Sie eine Checkpoint-Bereinigung durch, indem Sie Checkpoints wie unten beschrieben auflisten. Wenn es mehr als einen Checkpoint gibt, bereinigen Sie ihn:
nohup java -Xmx4096m -jar oak-run-1.2.18.jar checkpoints /app/AEM6/author/crx-quickstart/repository/segmentstore rm-all >> nohup.out & -
Führen Sie eine Offline-Komprimierung aus. Erfahren Sie (hier), wie Offline-Komprimierung .
-
Starten Sie den Server und warten Sie auf den Abschluss der Indizierung.
Ursache
Ein SegmentNotFoundException wird zurückgegeben, wenn ein Segment nicht vorhanden ist, während die Komprimierung versucht, den Knoten zu lesen. Dafür kann es verschiedene Ursachen geben:
- Das Segment wurde durch manuelles Eingreifen (z. B.
rm -rf /) entfernt. - Das Segment wurde durch die Revisionsspeicherbereinigung entfernt.
- Das Segment kann aufgrund eines Fehlers im Code nicht gefunden werden.
Falls das Problem durch die Revisionsdatenbereinigung verursacht wird (Punkt 2), stellen Sie sicher, dass die Online-Komprimierung deaktiviert ist, um zu verhindern, dass weitere Knoten beschädigt werden.
Stellen Sie Fragen in unserer Experience League Campaign-Community
Wenn Sie Fragen zu diesem Thema haben oder bereits beantwortete Fragen lesen möchten, laden wir Sie ein, unseren Experience League-Community-Blogpost zu sehen, der diesen Artikel enthält, uns Ihre Fragen und Kommentare zu senden und unserer Experience League Campaign-Community beizutreten!