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));


Reply via email to