You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2015/12/09 10:27:52 UTC
svn commit: r1718784 -
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
Author: mduerig
Date: Wed Dec 9 09:27:52 2015
New Revision: 1718784
URL: http://svn.apache.org/viewvc?rev=1718784&view=rev
Log:
OAK-3753: Test failure: HeavyWriteIT
Dump segment to log in case of an invalid segment being encountered
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java?rev=1718784&r1=1718783&r2=1718784&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java Wed Dec 9 09:27:52 2015
@@ -22,6 +22,7 @@ import static com.google.common.base.Pre
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.collect.Lists.newArrayListWithCapacity;
import static com.google.common.collect.Maps.newConcurrentMap;
+import static org.apache.jackrabbit.oak.commons.IOUtils.closeQuietly;
import static org.apache.jackrabbit.oak.plugins.segment.SegmentVersion.V_11;
import static org.apache.jackrabbit.oak.plugins.segment.SegmentWriter.BLOCK_SIZE;
@@ -41,6 +42,8 @@ import javax.annotation.Nullable;
import com.google.common.base.Charsets;
import com.google.common.base.Function;
+import org.apache.commons.io.HexDump;
+import org.apache.commons.io.output.ByteArrayOutputStream;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.plugins.blob.ReferenceCollector;
@@ -198,7 +201,7 @@ public class Segment {
this(tracker, id, data, V_11);
}
- public Segment(SegmentTracker tracker, SegmentId id, ByteBuffer data, SegmentVersion version) {
+ public Segment(SegmentTracker tracker, final SegmentId id, final ByteBuffer data, SegmentVersion version) {
this.tracker = checkNotNull(tracker);
this.id = checkNotNull(id);
if (tracker.getStringCache() == null) {
@@ -214,7 +217,14 @@ public class Segment {
checkState(data.get(0) == '0'
&& data.get(1) == 'a'
&& data.get(2) == 'K'
- && SegmentVersion.isValid(segmentVersion));
+ && SegmentVersion.isValid(segmentVersion),
+ new Object() { // Defer evaluation of error message
+ @Override
+ public String toString() {
+ return "Invalid segment format. Dumping segment " + id + "\n"
+ + toHex(data.array());
+ }
+ });
this.refids = new SegmentId[getRefCount()];
this.refids[0] = id;
this.version = SegmentVersion.fromByte(segmentVersion);
@@ -224,6 +234,18 @@ public class Segment {
}
}
+ private static String toHex(byte[] bytes) {
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ try {
+ HexDump.dump(bytes, 0, out, 0);
+ return out.toString(Charsets.UTF_8.name());
+ } catch (IOException e) {
+ return "Error dumping segment: " + e.getMessage();
+ } finally {
+ closeQuietly(out);
+ }
+ }
+
Segment(SegmentTracker tracker, byte[] buffer) {
this.tracker = checkNotNull(tracker);
this.id = tracker.newDataSegmentId();