Author: frm
Date: Fri Sep 30 16:09:38 2016
New Revision: 1762931
URL: http://svn.apache.org/viewvc?rev=1762931&view=rev
Log:
OAK-2498 - Save record types along the offsets in the record table
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordEntry.java
(with props)
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/ImmutableRecordNumbers.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MutableRecordNumbers.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordNumbers.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordNumbersIterator.java
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/SegmentBufferWriter.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ImmutableRecordNumbersTest.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/MutableRecordNumbersTest.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/MBeanTest.java
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/ImmutableRecordNumbers.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/ImmutableRecordNumbers.java?rev=1762931&r1=1762930&r2=1762931&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/ImmutableRecordNumbers.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/ImmutableRecordNumbers.java
Fri Sep 30 16:09:38 2016
@@ -17,45 +17,45 @@
package org.apache.jackrabbit.oak.segment;
+import static com.google.common.collect.Maps.newHashMap;
+
import java.util.Iterator;
import java.util.Map;
-import com.google.common.collect.Maps;
-
/**
- * An immutable record number to offset table. It is initialized at
construction
- * time and can never be changed afterwards.
+ * An immutable record table. It is initialized at construction time and can
+ * never be changed afterwards.
* <p>
* This implementation is trivially thread-safe.
*/
class ImmutableRecordNumbers implements RecordNumbers {
- private final Map<Integer, Integer> recordNumbers;
+ private final Map<Integer, RecordEntry> records;
/**
- * Create a new immutable record number to offset table.
+ * Create a new immutable record table.
*
- * @param recordNumbers a map of record numbers to offsets. It can't be
- * {@code null}.
+ * @param records a map of record numbers to record entries. It can't be
+ * {@code null}.
*/
- ImmutableRecordNumbers(Map<Integer, Integer> recordNumbers) {
- this.recordNumbers = Maps.newHashMap(recordNumbers);
+ ImmutableRecordNumbers(Map<Integer, RecordEntry> records) {
+ this.records = newHashMap(records);
}
@Override
public int getOffset(int recordNumber) {
- Integer offset = recordNumbers.get(recordNumber);
+ RecordEntry entry = records.get(recordNumber);
- if (offset == null) {
+ if (entry == null) {
return -1;
}
- return offset;
+ return entry.getOffset();
}
@Override
public Iterator<Entry> iterator() {
- return new RecordNumbersIterator(recordNumbers.entrySet().iterator());
+ return new RecordNumbersIterator(records.entrySet().iterator());
}
}
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MutableRecordNumbers.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MutableRecordNumbers.java?rev=1762931&r1=1762930&r2=1762931&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MutableRecordNumbers.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/MutableRecordNumbers.java
Fri Sep 30 16:09:38 2016
@@ -23,27 +23,27 @@ import java.util.Map;
import com.google.common.collect.Maps;
/**
- * A thread-safe, mutable record numbers to offset table.
+ * A thread-safe, mutable record table.
*/
class MutableRecordNumbers implements RecordNumbers {
private final Object lock = new Object();
- private final Map<Integer, Integer> recordNumbers = Maps.newHashMap();
+ private final Map<Integer, RecordEntry> records = Maps.newHashMap();
@Override
public int getOffset(int recordNumber) {
- Integer offset = recordNumbers.get(recordNumber);
+ RecordEntry entry = records.get(recordNumber);
- if (offset != null) {
- return offset;
+ if (entry != null) {
+ return entry.getOffset();
}
synchronized (lock) {
- offset = recordNumbers.get(recordNumber);
+ entry = records.get(recordNumber);
- if (offset != null) {
- return offset;
+ if (entry != null) {
+ return entry.getOffset();
}
return -1;
@@ -52,10 +52,10 @@ class MutableRecordNumbers implements Re
@Override
public Iterator<Entry> iterator() {
- Map<Integer, Integer> recordNumbers;
+ Map<Integer, RecordEntry> recordNumbers;
synchronized (lock) {
- recordNumbers = Maps.newHashMap(this.recordNumbers);
+ recordNumbers = Maps.newHashMap(this.records);
}
return new RecordNumbersIterator(recordNumbers.entrySet().iterator());
@@ -68,22 +68,23 @@ class MutableRecordNumbers implements Re
*/
public int size() {
synchronized (lock) {
- return recordNumbers.size();
+ return records.size();
}
}
/**
* Add a new offset to this table and generate a record number for it.
*
+ * @param type the type of the record.
* @param offset an offset to be added to this table.
* @return the record number associated to the offset.
*/
- int addOffset(int offset) {
+ int addRecord(RecordType type, int offset) {
int recordNumber;
synchronized (lock) {
- recordNumber = recordNumbers.size();
- recordNumbers.put(recordNumber, offset);
+ recordNumber = records.size();
+ records.put(recordNumber, new RecordEntry(type, offset));
}
return recordNumber;
Added:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordEntry.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordEntry.java?rev=1762931&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordEntry.java
(added)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordEntry.java
Fri Sep 30 16:09:38 2016
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.jackrabbit.oak.segment;
+
+/**
+ * A value class representing an entry in the record table of a segment.
+ */
+class RecordEntry {
+
+ private final RecordType type;
+
+ private final int offset;
+
+ RecordEntry(RecordType type, int offset) {
+ this.type = type;
+ this.offset = offset;
+ }
+
+ RecordType getType() {
+ return type;
+ }
+
+ int getOffset() {
+ return offset;
+ }
+
+}
Propchange:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordEntry.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordNumbers.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordNumbers.java?rev=1762931&r1=1762930&r2=1762931&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordNumbers.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordNumbers.java
Fri Sep 30 16:09:38 2016
@@ -34,24 +34,31 @@ interface RecordNumbers extends Iterable
int getOffset(int recordNumber);
/**
- * Represents a pair of a record number and its corresponding offset.
+ * Represents an entry in the record table.
*/
interface Entry {
/**
- * The record number part of this pair.
+ * The record number.
*
* @return a record number.
*/
int getRecordNumber();
/**
- * The offset part of this pair.
+ * The offset of this record..
*
* @return an offset.
*/
int getOffset();
+ /**
+ * The type of this record.
+ *
+ * @return a record type.
+ */
+ RecordType getType();
+
}
}
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordNumbersIterator.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordNumbersIterator.java?rev=1762931&r1=1762930&r2=1762931&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordNumbersIterator.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/RecordNumbersIterator.java
Fri Sep 30 16:09:38 2016
@@ -23,17 +23,17 @@ import java.util.Map;
import org.apache.jackrabbit.oak.segment.RecordNumbers.Entry;
/**
- * Utility class implementing an iterator over record numbers to offset pairs.
- * It wraps an underlying iterator looping over map entries, where each entry
is
- * a tuple of integers.
+ * Utility class implementing an iterator over a record table. It wraps an
+ * underlying iterator looping over map entries, where each entry is a
+ * representation of a record entry.
*/
class RecordNumbersIterator implements Iterator<Entry> {
private static class Entry implements RecordNumbers.Entry {
- private final Map.Entry<Integer, Integer> entry;
+ private final Map.Entry<Integer, RecordEntry> entry;
- public Entry(Map.Entry<Integer, Integer> entry) {
+ public Entry(Map.Entry<Integer, RecordEntry> entry) {
this.entry = entry;
}
@@ -44,14 +44,19 @@ class RecordNumbersIterator implements I
@Override
public int getOffset() {
- return entry.getValue();
+ return entry.getValue().getOffset();
+ }
+
+ @Override
+ public RecordType getType() {
+ return entry.getValue().getType();
}
}
- private final Iterator<Map.Entry<Integer, Integer>> iterator;
+ private final Iterator<Map.Entry<Integer, RecordEntry>> iterator;
- RecordNumbersIterator(Iterator<Map.Entry<Integer, Integer>> iterator) {
+ RecordNumbersIterator(Iterator<Map.Entry<Integer, RecordEntry>> iterator) {
this.iterator = iterator;
}
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=1762931&r1=1762930&r2=1762931&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
Fri Sep 30 16:09:38 2016
@@ -216,7 +216,7 @@ public class Segment {
* @return An instance of {@link RecordNumbers}, never {@code null}.
*/
private RecordNumbers readRecordNumberOffsets() {
- Map<Integer, Integer> recordNumberOffsets =
newHashMapWithExpectedSize(getRecordNumberCount());
+ Map<Integer, RecordEntry> recordNumberOffsets =
newHashMapWithExpectedSize(getRecordNumberCount());
int position = data.position();
@@ -226,9 +226,11 @@ public class Segment {
for (int i = 0; i < getRecordNumberCount(); i++) {
int recordNumber = data.getInt(position);
position += 4;
+ int type = data.getInt(position);
+ position += 4;
int offset = data.getInt(position);
position += 4;
- recordNumberOffsets.put(recordNumber, offset);
+ recordNumberOffsets.put(recordNumber, new
RecordEntry(RecordType.values()[type], offset));
}
return new ImmutableRecordNumbers(recordNumberOffsets);
@@ -358,7 +360,7 @@ public class Segment {
position += HEADER_SIZE;
position += getReferencedSegmentIdCount() * 16;
- position += getRecordNumberCount() * 8;
+ position += getRecordNumberCount() * 12;
position += index * 5;
return RecordType.values()[data.get(position) & 0xff];
@@ -371,7 +373,7 @@ public class Segment {
position += HEADER_SIZE;
position += getReferencedSegmentIdCount() * 16;
- position += getRecordNumberCount() * 8;
+ position += getRecordNumberCount() * 12;
position += index * 5;
position += 1;
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java?rev=1762931&r1=1762930&r2=1762931&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
Fri Sep 30 16:09:38 2016
@@ -358,7 +358,7 @@ public class SegmentBufferWriter impleme
int recordNumberCount = recordNumbers.size();
BinaryUtils.writeInt(buffer, Segment.RECORD_NUMBER_COUNT_OFFSET,
recordNumberCount);
- int totalLength = align(HEADER_SIZE + referencedSegmentIdCount *
16 + rootcount * 5 + recordNumberCount * 8 + length, 16);
+ int totalLength = align(HEADER_SIZE + referencedSegmentIdCount *
16 + rootcount * 5 + recordNumberCount * 12 + length, 16);
if (totalLength > buffer.length) {
throw new IllegalStateException("too much data for a segment");
@@ -389,6 +389,7 @@ public class SegmentBufferWriter impleme
for (Entry entry : recordNumbers) {
pos = BinaryUtils.writeInt(buffer, pos,
entry.getRecordNumber());
+ pos = BinaryUtils.writeInt(buffer, pos,
entry.getType().ordinal());
pos = BinaryUtils.writeInt(buffer, pos, entry.getOffset());
}
@@ -435,7 +436,7 @@ public class SegmentBufferWriter impleme
int rootCount = roots.size() + 1;
int recordNumbersCount = recordNumbers.size() + 1;
int referencedIdCount = segmentReferences.size() + ids.size();
- int headerSize = HEADER_SIZE + rootCount * 5 + referencedIdCount * 16
+ recordNumbersCount * 8;
+ int headerSize = HEADER_SIZE + rootCount * 5 + referencedIdCount * 16
+ recordNumbersCount * 12;
int segmentSize = align(headerSize + recordSize + length, 16);
// If the size estimate looks too big, recompute it with a more
@@ -471,7 +472,7 @@ public class SegmentBufferWriter impleme
}
}
- headerSize = HEADER_SIZE + rootCount * 5 + referencedIdCount * 16
+ recordNumbersCount * 8;
+ headerSize = HEADER_SIZE + rootCount * 5 + referencedIdCount * 16
+ recordNumbersCount * 12;
segmentSize = align(headerSize + recordSize + length, 16);
}
@@ -485,7 +486,7 @@ public class SegmentBufferWriter impleme
position = buffer.length - length;
checkState(position >= 0);
- int recordNumber = recordNumbers.addOffset(position);
+ int recordNumber = recordNumbers.addRecord(type, position);
RecordId id = new RecordId(segment.getSegmentId(), recordNumber);
roots.put(id, type);
return id;
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ImmutableRecordNumbersTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ImmutableRecordNumbersTest.java?rev=1762931&r1=1762930&r2=1762931&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ImmutableRecordNumbersTest.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ImmutableRecordNumbersTest.java
Fri Sep 30 16:09:38 2016
@@ -17,11 +17,13 @@
package org.apache.jackrabbit.oak.segment;
+import static com.google.common.collect.Maps.newHashMap;
import static org.junit.Assert.assertEquals;
import java.util.HashMap;
import java.util.Map;
+import com.google.common.collect.Maps;
import org.apache.jackrabbit.oak.segment.RecordNumbers.Entry;
import org.junit.Test;
@@ -35,7 +37,7 @@ public class ImmutableRecordNumbersTest
entries.put(3, 4);
entries.put(5, 6);
- ImmutableRecordNumbers table = new ImmutableRecordNumbers(entries);
+ ImmutableRecordNumbers table = new
ImmutableRecordNumbers(recordEntries(entries));
assertEquals(2, table.getOffset(1));
assertEquals(4, table.getOffset(3));
@@ -50,7 +52,7 @@ public class ImmutableRecordNumbersTest
entries.put(3, 4);
entries.put(5, 6);
- ImmutableRecordNumbers table = new ImmutableRecordNumbers(entries);
+ ImmutableRecordNumbers table = new
ImmutableRecordNumbers(recordEntries(entries));
entries.put(1, 3);
entries.put(7, 8);
@@ -69,7 +71,7 @@ public class ImmutableRecordNumbersTest
entries.put(3, 4);
entries.put(5, 6);
- ImmutableRecordNumbers table = new ImmutableRecordNumbers(entries);
+ ImmutableRecordNumbers table = new
ImmutableRecordNumbers(recordEntries(entries));
Map<Integer, Integer> iterated = new HashMap<>();
@@ -80,4 +82,14 @@ public class ImmutableRecordNumbersTest
assertEquals(entries, iterated);
}
+ private Map<Integer, RecordEntry> recordEntries(Map<Integer, Integer>
offsets) {
+ Map<Integer, RecordEntry> entries = newHashMap();
+
+ for (Map.Entry<Integer, Integer> entry : offsets.entrySet()) {
+ entries.put(entry.getKey(), new RecordEntry(RecordType.VALUE,
entry.getValue()));
+ }
+
+ return entries;
+ }
+
}
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/MutableRecordNumbersTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/MutableRecordNumbersTest.java?rev=1762931&r1=1762930&r2=1762931&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/MutableRecordNumbersTest.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/MutableRecordNumbersTest.java
Fri Sep 30 16:09:38 2016
@@ -35,7 +35,7 @@ public class MutableRecordNumbersTest {
@Test
public void lookupShouldReturnOffset() {
MutableRecordNumbers table = new MutableRecordNumbers();
- int recordNumber = table.addOffset(42);
+ int recordNumber = table.addRecord(RecordType.VALUE, 42);
assertEquals(42, table.getOffset(recordNumber));
}
@@ -43,7 +43,7 @@ public class MutableRecordNumbersTest {
public void sizeShouldBeValid() {
MutableRecordNumbers table = new MutableRecordNumbers();
assertEquals(0, table.size());
- table.addOffset(42);
+ table.addRecord(RecordType.VALUE, 42);
assertEquals(1, table.size());
}
@@ -54,7 +54,7 @@ public class MutableRecordNumbersTest {
Map<Integer, Integer> expected = new HashMap<>();
for (int i = 0; i < 10; i++) {
- expected.put(table.addOffset(i), i);
+ expected.put(table.addRecord(RecordType.VALUE, i), i);
}
Map<Integer, Integer> iterated = new HashMap<>();
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/MBeanTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/MBeanTest.java?rev=1762931&r1=1762930&r2=1762931&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/MBeanTest.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/standby/MBeanTest.java
Fri Sep 30 16:09:38 2016
@@ -195,8 +195,7 @@ public class MBeanTest extends TestBase
assertEquals("1", jmxServer.invoke(clientStatus,
"calcSecondsSinceLastSuccess", null, null).toString());
assertEquals(1L, jmxServer.getAttribute(connectionStatus,
"TransferredSegments"));
- assertEquals(192L, jmxServer.getAttribute(connectionStatus,
"TransferredSegmentBytes"));
-
+
// stop the master
jmxServer.invoke(serverStatus, "stop", null, null);
assertEquals(false, jmxServer.getAttribute(serverStatus,
"Running"));