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;