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 ju...@apache.org on 2013/02/25 17:52:05 UTC
svn commit: r1449776 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment:
Segment.java SegmentNodeState.java SegmentReader.java
Author: jukka
Date: Mon Feb 25 16:52:05 2013
New Revision: 1449776
URL: http://svn.apache.org/r1449776
Log:
OAK-593: Segment-based MK
Move template cache and loading code from SegmentReader to Segment to avoid unnecessary segment lookups
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/Segment.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentReader.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=1449776&r1=1449775&r2=1449776&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 Mon Feb 25 16:52:05 2013
@@ -20,9 +20,14 @@ import static com.google.common.base.Pre
import static com.google.common.base.Preconditions.checkPositionIndexes;
import static org.apache.jackrabbit.oak.plugins.segment.SegmentWriter.BLOCK_SIZE;
+import java.util.Arrays;
import java.util.Collection;
import java.util.UUID;
+import org.apache.jackrabbit.oak.api.PropertyState;
+import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.plugins.memory.PropertyStates;
+
import com.google.common.base.Charsets;
import com.google.common.cache.Weigher;
@@ -119,7 +124,57 @@ class Segment {
private final OffsetCache<Template> templates = new OffsetCache<Template>() {
@Override
protected Template load(int offset) {
- return null;
+ int head = readInt(offset);
+ boolean hasPrimaryType = (head & (1 << 31)) != 0;
+ boolean hasMixinTypes = (head & (1 << 30)) != 0;
+ boolean zeroChildNodes = (head & (1 << 29)) != 0;
+ boolean manyChildNodes = (head & (1 << 28)) != 0;
+ int mixinCount = (head >> 18) & ((1 << 10) - 1);
+ int propertyCount = head & ((1 << 18) - 1);
+ offset += 4;
+
+ PropertyState primaryType = null;
+ if (hasPrimaryType) {
+ RecordId primaryId = readRecordId(offset);
+ primaryType = PropertyStates.createProperty(
+ "jcr:primaryType", readString(primaryId), Type.NAME);
+ offset += Segment.RECORD_ID_BYTES;
+ }
+
+ PropertyState mixinTypes = null;
+ if (hasMixinTypes) {
+ String[] mixins = new String[mixinCount];
+ for (int i = 0; i < mixins.length; i++) {
+ RecordId mixinId = readRecordId(offset);
+ mixins[i] = readString(mixinId);
+ offset += Segment.RECORD_ID_BYTES;
+ }
+ mixinTypes = PropertyStates.createProperty(
+ "jcr:mixinTypes", Arrays.asList(mixins), Type.NAMES);
+ }
+
+ String childName = Template.ZERO_CHILD_NODES;
+ if (manyChildNodes) {
+ childName = Template.MANY_CHILD_NODES;
+ } else if (!zeroChildNodes) {
+ RecordId childNameId = readRecordId(offset);
+ childName = readString(childNameId);
+ offset += Segment.RECORD_ID_BYTES;
+ }
+
+ PropertyTemplate[] properties =
+ new PropertyTemplate[propertyCount];
+ for (int i = 0; i < properties.length; i++) {
+ RecordId propertyNameId = readRecordId(offset);
+ offset += Segment.RECORD_ID_BYTES;
+ byte type = readByte(offset++);
+ properties[i] = new PropertyTemplate(
+ readString(propertyNameId),
+ Type.fromTag(Math.abs(type), type < 0));
+ }
+
+ return new Template(
+ primaryType, mixinTypes, properties, childName);
}
};
@@ -209,6 +264,19 @@ class Segment {
return segment.readString(id.getOffset());
}
+ Template readTemplate(int offset) {
+ return templates.get(offset);
+ }
+
+ Template readTemplate(RecordId id) {
+ checkNotNull(id);
+ Segment segment = this;
+ if (!uuid.equals(id.getSegmentId())) {
+ segment = store.readSegment(id.getSegmentId());
+ }
+ return segment.readTemplate(id.getOffset());
+ }
+
long readLength(int offset) {
return internalReadLength(pos(offset, 1));
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java?rev=1449776&r1=1449775&r2=1449776&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeState.java Mon Feb 25 16:52:05 2013
@@ -48,7 +48,9 @@ class SegmentNodeState extends AbstractN
private synchronized Template getTemplate() {
if (template == null) {
- template = reader.readTemplate(reader.readRecordId(recordId, 0));
+ Segment segment = reader.getStore().readSegment(recordId.getSegmentId());
+ RecordId templateId = segment.readRecordId(recordId.getOffset());
+ template = segment.readTemplate(templateId);
}
return template;
}
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentReader.java?rev=1449776&r1=1449775&r2=1449776&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentReader.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentReader.java Mon Feb 25 16:52:05 2013
@@ -36,86 +36,10 @@ public class SegmentReader {
private final SegmentStore store;
- private final LoadingCache<RecordId, Template> templates =
- CacheBuilder.newBuilder()
- .maximumSize(1000)
- .build(newTemplateLoader());
-
public SegmentReader(SegmentStore store) {
this.store = store;
}
- private CacheLoader<RecordId, Template> newTemplateLoader() {
- return new CacheLoader<RecordId, Template>() {
- @Override
- public Template load(RecordId key) throws Exception {
- Segment segment = store.readSegment(key.getSegmentId());
- int offset = key.getOffset();
-
- int head = segment.readInt(offset);
- boolean hasPrimaryType = (head & (1 << 31)) != 0;
- boolean hasMixinTypes = (head & (1 << 30)) != 0;
- boolean zeroChildNodes = (head & (1 << 29)) != 0;
- boolean manyChildNodes = (head & (1 << 28)) != 0;
- int mixinCount = (head >> 18) & ((1 << 10) - 1);
- int propertyCount = head & ((1 << 18) - 1);
- offset += 4;
-
- PropertyState primaryType = null;
- if (hasPrimaryType) {
- RecordId primaryId = segment.readRecordId(offset);
- primaryType = PropertyStates.createProperty(
- "jcr:primaryType", segment.readString(primaryId), Type.NAME);
- offset += Segment.RECORD_ID_BYTES;
- }
-
- PropertyState mixinTypes = null;
- if (hasMixinTypes) {
- String[] mixins = new String[mixinCount];
- for (int i = 0; i < mixins.length; i++) {
- RecordId mixinId = segment.readRecordId(offset);
- mixins[i] = segment.readString(mixinId);
- offset += Segment.RECORD_ID_BYTES;
- }
- mixinTypes = PropertyStates.createProperty(
- "jcr:mixinTypes", Arrays.asList(mixins), Type.NAMES);
- }
-
- String childName = Template.ZERO_CHILD_NODES;
- if (manyChildNodes) {
- childName = Template.MANY_CHILD_NODES;
- } else if (!zeroChildNodes) {
- RecordId childNameId = segment.readRecordId(offset);
- childName = segment.readString(childNameId);
- offset += Segment.RECORD_ID_BYTES;
- }
-
- PropertyTemplate[] properties =
- new PropertyTemplate[propertyCount];
- for (int i = 0; i < properties.length; i++) {
- RecordId propertyNameId = segment.readRecordId(offset);
- offset += Segment.RECORD_ID_BYTES;
- byte type = segment.readByte(offset++);
- properties[i] = new PropertyTemplate(
- segment.readString(propertyNameId),
- Type.fromTag(Math.abs(type), type < 0));
- }
-
- return new Template(
- primaryType, mixinTypes, properties, childName);
- }
- };
- }
-
- public Template readTemplate(RecordId recordId) {
- try {
- return templates.get(recordId);
- } catch (ExecutionException e) {
- throw new IllegalStateException(
- "Unable to access template record " + recordId, e);
- }
- }
-
public long readLength(RecordId recordId) {
checkNotNull(recordId);
Segment segment = store.readSegment(recordId.getSegmentId());