Author: frm
Date: Fri Aug 31 13:06:16 2018
New Revision: 1839758
URL: http://svn.apache.org/viewvc?rev=1839758&view=rev
Log:
OAK-7720 - Log hex dumps of too big segments
Backport r1839746 from trunk.
Added:
jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentDump.java
- copied unchanged from r1839746,
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentDump.java
Modified:
jackrabbit/oak/branches/1.8/ (props changed)
jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
Propchange: jackrabbit/oak/branches/1.8/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Aug 31 13:06:16 2018
@@ -1,3 +1,3 @@
/jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1820660-1820661,1820729,1820734,1820859,1820861,1820878,1820888,1820947,1821027,1821130,1821140-1821141,1821178,1821237,1821240,1821249,1821258,1821325,1821358,1821361-1821362,1821370,1821375,1821393,1821477,1821487,1821516,1821617,1821663,1821665,1821668,1821681,1821847,1821975-1821983,1822121,1822201,1822207,1822527,1822723,1822808,1822850,1822934,1823135,1823163,1823169,1823172,1823655,1823669,1824196,1824198,1824253,1824255,1824896,1824962,1825065,1825362,1825381,1825442,1825448,1825466,1825470-1825471,1825475,1825523,1825525,1825561,1825619-1825621,1825651,1825654,1825992,1826079,1826090,1826096,1826216,1826237,1826338,1826516,1826532,1826551,1826560,1826638,1826640,1826730,1826932,1826957,1827423,1827472,1827486,1827977,1828349,1828439,1828502,1828529,1828948,1829527,1829534,1829546,1829569,1829587,1829665,1829854,1829864,1829978,1829985,1829987,1829998,1830019,1830048,1830160,1830171,1830197,1830209,1830239,1830347,1830748,1831157-1831158,1831163,1831190
,1831374,1831560,1832258,1832376,1832379,1832535,1833308,1833347,1833833,1834610,1834648-1834649,1834681,1834823,1834857-1834858,1835060,1835518,1835642,1835780,1835819,1836487,1836493,1837475,1837657,1837998,1838076,1838637,1839549,1839637
+/jackrabbit/oak/trunk:1820660-1820661,1820729,1820734,1820859,1820861,1820878,1820888,1820947,1821027,1821130,1821140-1821141,1821178,1821237,1821240,1821249,1821258,1821325,1821358,1821361-1821362,1821370,1821375,1821393,1821477,1821487,1821516,1821617,1821663,1821665,1821668,1821681,1821847,1821975-1821983,1822121,1822201,1822207,1822527,1822723,1822808,1822850,1822934,1823135,1823163,1823169,1823172,1823655,1823669,1824196,1824198,1824253,1824255,1824896,1824962,1825065,1825362,1825381,1825442,1825448,1825466,1825470-1825471,1825475,1825523,1825525,1825561,1825619-1825621,1825651,1825654,1825992,1826079,1826090,1826096,1826216,1826237,1826338,1826516,1826532,1826551,1826560,1826638,1826640,1826730,1826932,1826957,1827423,1827472,1827486,1827977,1828349,1828439,1828502,1828529,1828948,1829527,1829534,1829546,1829569,1829587,1829665,1829854,1829864,1829978,1829985,1829987,1829998,1830019,1830048,1830160,1830171,1830197,1830209,1830239,1830347,1830748,1831157-1831158,1831163,1831190
,1831374,1831560,1832258,1832376,1832379,1832535,1833308,1833347,1833833,1834610,1834648-1834649,1834681,1834823,1834857-1834858,1835060,1835518,1835642,1835780,1835819,1836487,1836493,1837475,1837657,1837998,1838076,1838637,1839549,1839637,1839746
/jackrabbit/trunk:1345480
Modified:
jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java?rev=1839758&r1=1839757&r2=1839758&view=diff
==============================================================================
---
jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
(original)
+++
jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
Fri Aug 31 13:06:16 2018
@@ -35,8 +35,7 @@ import static org.apache.jackrabbit.oak.
import java.io.IOException;
import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.io.StringWriter;
+import java.io.PrintStream;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Iterator;
@@ -49,7 +48,6 @@ import com.google.common.base.Charsets;
import com.google.common.collect.AbstractIterator;
import org.apache.commons.io.HexDump;
import org.apache.commons.io.output.ByteArrayOutputStream;
-import org.apache.commons.io.output.WriterOutputStream;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.commons.StringUtils;
@@ -548,32 +546,21 @@ public class Segment {
@Override
public String toString() {
- StringWriter string = new StringWriter();
- try (PrintWriter writer = new PrintWriter(string)) {
- writer.format("Segment %s (%d bytes)%n", id, data.size());
- String segmentInfo = getSegmentInfo();
- if (segmentInfo != null) {
- writer.format("Info: %s, Generation: %s%n", segmentInfo,
getGcGeneration());
- }
- if (id.isDataSegmentId()) {
-
writer.println("--------------------------------------------------------------------------");
- int i = 1;
- for (SegmentId segmentId : segmentReferences) {
- writer.format("reference %02x: %s%n", i++, segmentId);
- }
- for (Entry entry : recordNumbers) {
- writer.format("%10s record %08x: %08x%n", entry.getType(),
entry.getRecordNumber(), entry.getOffset());
+ return SegmentDump.dumpSegment(
+ id,
+ data.size(),
+ info,
+ getGcGeneration(),
+ segmentReferences,
+ recordNumbers,
+ stream -> {
+ try {
+ data.hexDump(stream);
+ } catch (IOException e) {
+ e.printStackTrace(new PrintStream(stream));
}
}
-
writer.println("--------------------------------------------------------------------------");
- try {
- data.hexDump(new WriterOutputStream(writer, Charsets.UTF_8));
- } catch (IOException e) {
- throw new IllegalStateException(e);
- }
-
writer.println("--------------------------------------------------------------------------");
- }
- return string.toString();
+ );
}
public void writeTo(OutputStream stream) throws IOException {
Modified:
jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java?rev=1839758&r1=1839757&r2=1839758&view=diff
==============================================================================
---
jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
(original)
+++
jackrabbit/oak/branches/1.8/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
Fri Aug 31 13:06:16 2018
@@ -30,6 +30,7 @@ import static java.lang.System.identityH
import static
org.apache.jackrabbit.oak.segment.Segment.GC_FULL_GENERATION_OFFSET;
import static org.apache.jackrabbit.oak.segment.Segment.GC_GENERATION_OFFSET;
import static org.apache.jackrabbit.oak.segment.Segment.HEADER_SIZE;
+import static org.apache.jackrabbit.oak.segment.Segment.MAX_SEGMENT_SIZE;
import static org.apache.jackrabbit.oak.segment.Segment.RECORD_ID_BYTES;
import static org.apache.jackrabbit.oak.segment.Segment.RECORD_SIZE;
import static org.apache.jackrabbit.oak.segment.Segment.SEGMENT_REFERENCE_SIZE;
@@ -38,14 +39,15 @@ import static org.apache.jackrabbit.oak.
import static org.apache.jackrabbit.oak.segment.SegmentVersion.LATEST_VERSION;
import java.io.IOException;
+import java.io.PrintStream;
import java.util.Collection;
import java.util.Set;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
+import org.apache.commons.io.HexDump;
import org.apache.jackrabbit.oak.segment.RecordNumbers.Entry;
-import org.apache.jackrabbit.oak.segment.data.SegmentData;
import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -177,7 +179,7 @@ public class SegmentBufferWriter impleme
* The segment meta data is guaranteed to be the first string record in a
segment.
*/
private void newSegment(SegmentStore store) throws IOException {
- buffer = new byte[Segment.MAX_SEGMENT_SIZE];
+ buffer = new byte[MAX_SEGMENT_SIZE];
buffer[0] = '0';
buffer[1] = 'a';
buffer[2] = 'K';
@@ -285,6 +287,24 @@ public class SegmentBufferWriter impleme
dirty = true;
}
+ private String dumpSegmentBuffer() {
+ return SegmentDump.dumpSegment(
+ segment != null ? segment.getSegmentId() : null,
+ length,
+ segment != null ? segment.getSegmentInfo() : null,
+ gcGeneration,
+ segmentReferences,
+ recordNumbers,
+ stream -> {
+ try {
+ HexDump.dump(buffer, 0, stream, 0);
+ } catch (IOException e) {
+ e.printStackTrace(new PrintStream(stream));
+ }
+ }
+ );
+ }
+
/**
* Adds a segment header to the buffer and writes a segment to the segment
* store. This is done automatically (called from prepare) when there is
not
@@ -304,6 +324,7 @@ public class SegmentBufferWriter impleme
int totalLength = align(HEADER_SIZE + referencedSegmentIdCount *
SEGMENT_REFERENCE_SIZE + recordNumberCount * RECORD_SIZE + length, 16);
if (totalLength > buffer.length) {
+ LOG.warn("Segment buffer corruption detected\n{}",
dumpSegmentBuffer());
throw new IllegalStateException(String.format(
"Too much data for a segment %s
(referencedSegmentIdCount=%d, recordNumberCount=%d, length=%d, totalLength=%d)",
segment.getSegmentId(), referencedSegmentIdCount,
recordNumberCount, length, totalLength));