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 2016/05/24 08:45:52 UTC

svn commit: r1745331 - in /jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment: Segment.java SegmentIdTable.java SegmentTracker.java

Author: mduerig
Date: Tue May 24 08:45:52 2016
New Revision: 1745331

URL: http://svn.apache.org/viewvc?rev=1745331&view=rev
Log:
OAK-4373: Refactor SegmentTracker
- Add nullability annotations
- Adjust visibility
- Proper resource management
- Remove unreferenced identifiers

Modified:
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdTable.java
    jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentTracker.java

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java?rev=1745331&r1=1745330&r2=1745331&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java Tue May 24 08:45:52 2016
@@ -124,21 +124,26 @@ public class Segment {
 
     public static final int GC_GENERATION_OFFSET = 10;
 
+    @Nonnull
     private final SegmentStore store;
 
+    @Nonnull
     private final SegmentId id;
 
+    @Nonnull
     private final ByteBuffer data;
 
     /**
      * Version of the segment storage format.
      */
+    @Nonnull
     private final SegmentVersion version;
 
     /**
      * Referenced segment identifiers. Entries are initialized lazily in
      * {@link #getRefId(int)}. Set to {@code null} for bulk segments.
      */
+    @CheckForNull
     private final SegmentId[] refids;
 
     /**
@@ -146,6 +151,7 @@ public class Segment {
      * copies and repeated parsing of the same templates.
      * FIXME OAK-4373 move the template cache to the segment reader along side with the string cache
      */
+    @CheckForNull
     final ConcurrentMap<Integer, Template> templates;
 
     private static final boolean DISABLE_TEMPLATE_CACHE = getBoolean("oak.segment.disableTemplateCache");
@@ -243,7 +249,7 @@ public class Segment {
         id.loaded(this);
     }
 
-    SegmentVersion getSegmentVersion() {
+    public SegmentVersion getSegmentVersion() {
         return version;
     }
 
@@ -435,7 +441,7 @@ public class Segment {
     }
 
     @Nonnull
-    public String readString(int offset) {
+    String readString(int offset) {
         int pos = pos(offset, 1);
         long length = internalReadLength(pos);
         if (length < SMALL_LIMIT) {
@@ -452,14 +458,9 @@ public class Segment {
             return new String(bytes, Charsets.UTF_8);
         } else if (length < Integer.MAX_VALUE) {
             int size = (int) ((length + BLOCK_SIZE - 1) / BLOCK_SIZE);
-            ListRecord list =
-                    new ListRecord(internalReadRecordId(pos + 8), size);
-            SegmentStream stream = new SegmentStream(
-                    new RecordId(id, offset), list, length);
-            try {
+            ListRecord list = new ListRecord(internalReadRecordId(pos + 8), size);
+            try (SegmentStream stream = new SegmentStream(new RecordId(id, offset), list, length)) {
                 return stream.getString();
-            } finally {
-                stream.close();
             }
         } else {
             throw new IllegalStateException("String is too long: " + length);
@@ -541,7 +542,7 @@ public class Segment {
             return length;
         } else if ((length & 0x40) == 0) {
             return ((length & 0x3f) << 8
-                    | data.get(pos++) & 0xff)
+                    | data.get(pos) & 0xff)
                     + SMALL_LIMIT;
         } else {
             return (((long) length & 0x3f) << 56
@@ -551,7 +552,7 @@ public class Segment {
                     | ((long) (data.get(pos++) & 0xff)) << 24
                     | ((long) (data.get(pos++) & 0xff)) << 16
                     | ((long) (data.get(pos++) & 0xff)) << 8
-                    | ((long) (data.get(pos++) & 0xff)))
+                    | ((long) (data.get(pos) & 0xff)))
                     + MEDIUM_LIMIT;
         }
     }
@@ -561,73 +562,71 @@ public class Segment {
     @Override
     public String toString() {
         StringWriter string = new StringWriter();
-        PrintWriter writer = new PrintWriter(string);
+        try (PrintWriter writer = new PrintWriter(string)) {
+            int length = data.remaining();
 
-        int length = data.remaining();
-
-        writer.format("Segment %s (%d bytes)%n", id, length);
-        String segmentInfo = getSegmentInfo();
-        if (segmentInfo != null) {
-            writer.format("Info: %s, Generation: %d%n", segmentInfo, getGcGeneration());
-        }
-        if (id.isDataSegmentId()) {
-            writer.println("--------------------------------------------------------------------------");
-            int refcount = getRefCount();
-            for (int refid = 0; refid < refcount; refid++) {
-                writer.format("reference %02x: %s%n", refid, getRefId(refid));
+            writer.format("Segment %s (%d bytes)%n", id, length);
+            String segmentInfo = getSegmentInfo();
+            if (segmentInfo != null) {
+                writer.format("Info: %s, Generation: %d%n", segmentInfo, getGcGeneration());
             }
-            int rootcount = data.getShort(ROOT_COUNT_OFFSET) & 0xffff;
-            int pos = data.position() + refcount * 16;
-            for (int rootid = 0; rootid < rootcount; rootid++) {
-                writer.format(
+            if (id.isDataSegmentId()) {
+                writer.println("--------------------------------------------------------------------------");
+                int refcount = getRefCount();
+                for (int refid = 0; refid < refcount; refid++) {
+                    writer.format("reference %02x: %s%n", refid, getRefId(refid));
+                }
+                int rootcount = data.getShort(ROOT_COUNT_OFFSET) & 0xffff;
+                int pos = data.position() + refcount * 16;
+                for (int rootid = 0; rootid < rootcount; rootid++) {
+                    writer.format(
                             "root %d: %s at %04x%n", rootid,
-                        RecordType.values()[data.get(pos + rootid * 3) & 0xff],
+                            RecordType.values()[data.get(pos + rootid * 3) & 0xff],
                             data.getShort(pos + rootid * 3 + 1) & 0xffff);
-            }
-            int blobrefcount = data.getShort(BLOBREF_COUNT_OFFSET) & 0xffff;
-            pos += rootcount * 3;
-            for (int blobrefid = 0; blobrefid < blobrefcount; blobrefid++) {
-                int offset = data.getShort(pos + blobrefid * 2) & 0xffff;
-                writer.format(
-                        "blobref %d: %s at %04x%n", blobrefid,
-                        readBlobId(store, this, offset << RECORD_ALIGN_BITS), offset);
-            }
-        }
-        writer.println("--------------------------------------------------------------------------");
-        int pos = data.limit() - ((length + 15) & ~15);
-        while (pos < data.limit()) {
-            writer.format("%04x: ", (MAX_SEGMENT_SIZE - data.limit() + pos) >> RECORD_ALIGN_BITS);
-            for (int i = 0; i < 16; i++) {
-                if (i > 0 && i % 4 == 0) {
-                    writer.append(' ');
                 }
-                if (pos + i >= data.position()) {
-                    byte b = data.get(pos + i);
-                    writer.format("%02x ", b & 0xff);
-                } else {
-                    writer.append("   ");
+                int blobrefcount = data.getShort(BLOBREF_COUNT_OFFSET) & 0xffff;
+                pos += rootcount * 3;
+                for (int blobrefid = 0; blobrefid < blobrefcount; blobrefid++) {
+                    int offset = data.getShort(pos + blobrefid * 2) & 0xffff;
+                    writer.format(
+                            "blobref %d: %s at %04x%n", blobrefid,
+                            readBlobId(store, this, offset << RECORD_ALIGN_BITS), offset);
                 }
             }
-            writer.append(' ');
-            for (int i = 0; i < 16; i++) {
-                if (pos + i >= data.position()) {
-                    byte b = data.get(pos + i);
-                    if (b >= ' ' && b < 127) {
-                        writer.append((char) b);
+            writer.println("--------------------------------------------------------------------------");
+            int pos = data.limit() - ((length + 15) & ~15);
+            while (pos < data.limit()) {
+                writer.format("%04x: ", (MAX_SEGMENT_SIZE - data.limit() + pos) >> RECORD_ALIGN_BITS);
+                for (int i = 0; i < 16; i++) {
+                    if (i > 0 && i % 4 == 0) {
+                        writer.append(' ');
+                    }
+                    if (pos + i >= data.position()) {
+                        byte b = data.get(pos + i);
+                        writer.format("%02x ", b & 0xff);
                     } else {
-                        writer.append('.');
+                        writer.append("   ");
                     }
-                } else {
-                    writer.append(' ');
                 }
+                writer.append(' ');
+                for (int i = 0; i < 16; i++) {
+                    if (pos + i >= data.position()) {
+                        byte b = data.get(pos + i);
+                        if (b >= ' ' && b < 127) {
+                            writer.append((char) b);
+                        } else {
+                            writer.append('.');
+                        }
+                    } else {
+                        writer.append(' ');
+                    }
+                }
+                writer.println();
+                pos += 16;
             }
-            writer.println();
-            pos += 16;
+            writer.println("--------------------------------------------------------------------------");
+            return string.toString();
         }
-        writer.println("--------------------------------------------------------------------------");
-
-        writer.close();
-        return string.toString();
     }
 
 }

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdTable.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdTable.java?rev=1745331&r1=1745330&r2=1745331&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdTable.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentIdTable.java Tue May 24 08:45:52 2016
@@ -90,9 +90,9 @@ public class SegmentIdTable {
      * @param lsb
      * @return the segment id
      */
+    @Nonnull
     synchronized SegmentId getSegmentId(long msb, long lsb) {
-        int first = getIndex(lsb);
-        int index = first;
+        int index = getIndex(lsb);
         boolean shouldRefresh = false;
 
         WeakReference<SegmentId> reference = references.get(index);
@@ -199,7 +199,6 @@ public class SegmentIdTable {
     }
 
     synchronized void clearSegmentIdTables(Predicate<SegmentId> canRemove) {
-        int size = references.size();
         boolean dirty = false;
         for (WeakReference<SegmentId> reference : references) {
             if (reference != null) {

Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentTracker.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentTracker.java?rev=1745331&r1=1745330&r2=1745331&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentTracker.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentTracker.java Tue May 24 08:45:52 2016
@@ -27,8 +27,6 @@ import java.util.concurrent.atomic.Atomi
 import javax.annotation.Nonnull;
 
 import com.google.common.base.Predicate;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Tracker of references to segment identifiers and segment instances
@@ -36,8 +34,6 @@ import org.slf4j.LoggerFactory;
  * instances.
  */
 public class SegmentTracker {
-    private static final Logger log = LoggerFactory.getLogger(SegmentTracker.class);
-
     private static final long MSB_MASK = ~(0xfL << 12);
 
     private static final long VERSION = (0x4L << 12);
@@ -106,6 +102,7 @@ public class SegmentTracker {
      * @param lsb  least  significant bits of the segment id
      * @return the segment id
      */
+    @Nonnull
     public SegmentId getSegmentId(long msb, long lsb) {
         int index = ((int) msb) & (tables.length - 1);
         return tables[index].getSegmentId(msb, lsb);
@@ -115,6 +112,7 @@ public class SegmentTracker {
      * Create and track a new segment id for data segments.
      * @return the segment id
      */
+    @Nonnull
     SegmentId newDataSegmentId() {
         return newSegmentId(DATA);
     }
@@ -123,10 +121,12 @@ public class SegmentTracker {
      * Create and track a new segment id for bulk segments.
      * @return the segment id
      */
+    @Nonnull
     SegmentId newBulkSegmentId() {
         return newSegmentId(BULK);
     }
 
+    @Nonnull
     private SegmentId newSegmentId(long type) {
         segmentCounter.incrementAndGet();
         long msb = (random.nextLong() & MSB_MASK) | VERSION;