Author: mduerig
Date: Tue Apr 25 10:02:44 2017
New Revision: 1792595
URL: http://svn.apache.org/viewvc?rev=1792595&view=rev
Log:
OAK-6106: Excessive memory usage by the cached segment references
Reverting the previous changes and fixing the test
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.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=1792595&r1=1792594&r2=1792595&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 Apr 25 10:02:44 2017
@@ -256,30 +256,33 @@ public class Segment {
final int referencedSegmentIdCount = getReferencedSegmentIdCount();
final int refOffset = data.position() + HEADER_SIZE;
- // lazily populated cache of msbs and lsbs of the referenced segments
ids.
- // DO NOT keep references to the SegmentIds here as this will overflow
the heap.
- // See OAK-4949.
- final long[] ids = new long[2 * referencedSegmentIdCount];
+ // We need to keep SegmentId references (as opposed to e.g. UUIDs)
+ // here as frequently resolving the segment ids via the segment id
+ // tables is prohibitively expensive.
+ // These SegmentId references are not a problem wrt. heap usage as
+ // their individual memoised references to their underlying segment
+ // is managed via the SegmentCache. It is the size of that cache that
+ // keeps overall heap usage by Segment instances bounded.
+ // See OAK-6106.
+ final SegmentId[] refIds = new SegmentId[referencedSegmentIdCount];
return new SegmentReferences() {
@Override
public SegmentId getSegmentId(int reference) {
checkArgument(reference <= referencedSegmentIdCount, "Segment
reference out of bounds");
- long msb = ids[2*(reference - 1)];
- long lsb = ids[2*(reference - 1) + 1];
- if (lsb == 0 && msb == 0) {
- synchronized(ids) {
- msb = ids[2*(reference - 1)];
- lsb = ids[2*(reference - 1) + 1];
- if (lsb == 0 && msb == 0) {
+ SegmentId id = refIds[reference - 1];
+ if (id == null) {
+ synchronized(refIds) {
+ id = refIds[reference - 1];
+ if (id == null) {
int position = refOffset + (reference - 1) *
SEGMENT_REFERENCE_SIZE;
- msb = data.getLong(position);
- lsb = data.getLong(position + 8);
- ids[2*(reference - 1)] = msb;
- ids[2*(reference - 1) + 1] = lsb;
+ long msb = data.getLong(position);
+ long lsb = data.getLong(position + 8);
+ id = idProvider.newSegmentId(msb, lsb);
+ refIds[reference - 1] = id;
}
}
}
- return idProvider.newSegmentId(msb, lsb);
+ return id;
}
@Nonnull
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.java?rev=1792595&r1=1792594&r2=1792595&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.java
(original)
+++
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ManyChildNodesIT.java
Tue Apr 25 10:02:44 2017
@@ -65,7 +65,6 @@ public class ManyChildNodesIT {
@Nonnull
private FileStore createFileStore() throws
InvalidFileStoreVersionException, IOException {
return fileStoreBuilder(folder.getRoot())
- .withSegmentCacheSize(0)
.withStringCacheSize(0)
.withTemplateCacheSize(0)
.withStringDeduplicationCacheSize(0)